2013-10-04 83 views
0

因此,我編寫了這個安裝程序腳本,可以在目標機器上自動安裝多個不同的產品。有一次,我正在檢查機器(Windows 7)是否安裝了Microsoft Security Essentials - 如果沒有,我安裝該程序。下面的代碼是用C#編寫的,但問題也可能適用於其他語言。檢查計算機上是否安裝了Microsoft Security Essentials

一些事實,以協助那些應答:

  • MSE是在64位機器上的64位和32位機器32位(有兩個不同的安裝程序)因此,在該路徑註冊表總是:SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall
  • 自動安裝的過程以管理員身份運行。我能夠在同一個目錄中看到其他程序的鍵。

我在註冊表編輯器視圖:

enter image description here

我的方法:

private static bool DoesMseExist() 
{ 
    string location = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(location)) 
    { 
     foreach (string subKey in rk.GetSubKeyNames()) 
     { 
       using (RegistryKey productKey = rk.OpenSubKey(subKey)) 
       { 
        if (productKey != null) 
        {      
         if (Convert.ToString(productKey.GetValue("DisplayName")) 
             .Contains("Microsoft Security Client")) 
         { 
         return true; 
         } 
        } 
       } 
     } 
    } 
    return false; 
} 

這從來沒有發現的關鍵。任何協助發現爲什麼將不勝感激。

目前我正在使用以下內容作爲替代。

string MseLocation = @"C:\Program Files\Microsoft Security Client\msseces.exe"; 
return (File.Exists(MseLocation)); 
+0

您是否爲x86平臺編譯應用程序? – Steve

+1

不應該'字符串位置'使用'@'以及? –

+0

它的確如此。實際的代碼使用一個常量。我會解決它。 –

回答

0

我目前使用.NET 4.0,它提供了一個非常乾淨的解決方案,用於從32位進程訪問64位註冊表。否則,如果您使用Framework的早期版本,那麼您需要使用P/Invoke並使用中的KEY_WOW64_64KEY標誌調用功能RegOpenKeyEx,如here所述。

但到我使用的解決方案。

private static bool DoesMseExist() 
{ 
     using (RegistryKey localMachineX64View = 
        RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
        RegistryView.Registry64)) 
     { 
      using (RegistryKey rk = localMachineX64View.OpenSubKey(location)) 
      { 
       foreach (string subKey in rk.GetSubKeyNames()) 
       { 
        using (RegistryKey productKey = rk.OpenSubKey(subKey)) 
        { 
         if (productKey != null) 
         { 
          if (Convert.ToString(productKey.GetValue("DisplayName")) 
           .Contains("Microsoft Security Client")) 
          { 
           return true; 
          } 
         } 
        } 
       } 
      } 
     } 
     return false; 
} 

我正在寫一的P/Invoke解決了這個問題,但後來我遇到this來了。您只需使用RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)即可解決註冊表重定向問題。在我看來,與P/Invoke解決方案相比,這是一種非常容易理解和易讀的方法。

相關問題