2013-10-15 4 views
0

Я создаю сортировщик активов. Я уже ищу в реестре, чтобы получить список всех названий программного обеспечения, издателей, установить даты, и он отлично работает. Однако программы, установленные с помощью ClickOnce, не хранят дату установки в реестре (по крайней мере, не то, что я могу найти).Получить дату установки программы ClickOnce?

Я знаю, что должен иметь возможность использовать WMI для получения даты установки, но это очень медленно. Кроме того, за этот пост: Get installed applications in a system «с использованием класса WMI Win32_Product является плохой идеей, если вы планируете запустить этот запрос повторно»

Таким образом, без использования WMI, как я могу получить установить дату программ ClickOnce? Я знаю, что информация доступна так или иначе, потому что дата находится внутри программ добавления/удаления.

+0

См. Http://stackoverflow.com/questions/18679441/where-does-add-remove-programs-pull-data-for-the-installed-on-column – William

+0

@William Этот пост, по-видимому, предполагает, что Самый чистый способ - запросить WMI. Есть ли способ запросить WMI для конкретной программы? Я надеюсь избежать цикла через 300 установленных программ. Я даже попробовал оператор выбора ManagementObjectSearcher, но даже этот запрос имеет длительное время отклика. – Brandon

+0

Я связал его, потому что он указывает, как определяется дата установки для приложений, у которых нет установленного значения реестра даты. В ответе перечислены шаги для определения даты установки. – William

ответ

0

Как приложение ClickOnce устанавливает для каждого пользователя, вы можете найти информацию об удалении (что приложение мастер показывает) по follwing пути в реестре:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\5f7eb300e2ea4ebf 

Это «Uninstall» имеют уникальный хэш подразделы, чтобы найти ваше приложение, которое вы может перебирать эти ключи и фильтр, например, DisplayName так:

private RegistryKey GetUninstallRegistryKeyByProductName(string productName) 
{ 
     var subKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall"); 
     if (subKey == null) 
      return null; 
     foreach (var name in subKey.GetSubKeyNames()) 
     { 
      var application = subKey.OpenSubKey(name, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.QueryValues | RegistryRights.ReadKey | RegistryRights.SetValue); 
      if (application == null) 
       continue; 
      foreach (var appKey in application.GetValueNames().Where(appKey => appKey.Equals("DisplayName"))) 
      { 
       if (application.GetValue(appKey).Equals(productName)) 
        return application; 
       break; 
      } 
     } 
     return null; 
    } 

Этот метод возвращает RegistryKey, то вы можете получить значение ключа «DisplayVersion»:

var key = GetUninstallRegistryKeyByProductName("myApp"); 
var version = key.GetValue("DisplayVersion"); 

Update

Что касается даты установки, Попробуйте получить время последней записи из реестра (Getting времени последней записи в «DisplayVersion» является то, что вам нужно). Похоже, для этого нет управляемой обертки, поэтому используйте P/Invoke. You need to call RegQueryInfoKey.

+0

Правильно, это то, что я делаю в настоящее время. Я не думаю, что это касается моего вопроса о получении даты установки программ ClickOnce. Вы заметите, что программы ClickOnce не сохраняют дату установки в реестре. – Brandon

+0

Я обновил ответ, не знаю, почему я ответил о версии. –

Смежные вопросы