我在C#中使用WMI来获取所有已安装的软件,但它并不显示所有软件只有微软的那些

问题描述:

public ManagementScope GetScope() 
    { 
     try 
     { 
      //string classScope="winmgmts:" + "{impersonationLevel=impersonate}!\\" + strComputer + "\\root\\cimv2"; 
      string serverString = @"root\cimv2"; 

      ManagementScope scope = new ManagementScope(serverString); 


       ConnectionOptions options = new ConnectionOptions 
       { 
        Impersonation = ImpersonationLevel.Impersonate, 
        Authentication = AuthenticationLevel.Connect, 
        EnablePrivileges = true 
       }; 
       scope.Options = options; 

      return scope; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      throw; 
     } 
    } 

    public void InvokeMethodsFunctions1() 
    { 
     ManagementScope mScope = GetScope(); 

     mScope.Connect(); 

     if (mScope.IsConnected) 
     { 
      ManagementClass processClass = 
       new ManagementClass(mScope.Path); 
      ManagementObjectSearcher mos = new ManagementObjectSearcher(mScope, new ObjectQuery("SELECT * FROM Win32_Product")); 
      //get collection of WMI objects 
      ManagementObjectCollection queryCollection = mos.Get(); 

      using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"Result.txt")) 
      { 
       textBox1.Text = ""; 
       //enumerate the collection. 
       foreach (ManagementObject m in queryCollection) 
       { 
        // access properties of the WMI object 
        string line = " " + m["Name"] + " , InstallDate : " + m["InstallDate"] + " LocalPackage : " + m["LocalPackage"]; 
        Console.WriteLine(line); 
        file.WriteLine(line); 
        textBox1.Text += line + "\n"; 
       } 
      } 

     } 

    } 

那么我的代码有什么问题?我在C#中使用WMI来获取所有已安装的软件,但它并不显示所有软件只有微软的那些

我只是测试你的代码的下面,简化的版本,我看到安装在个人电脑上的一切,甚至是服务,我写了并安装自己:

var products = new ManagementObjectSearcher(new ObjectQuery("SELECT * FROM Win32_Product")); 
var result = products.Get(); 

foreach (var product in result) 
{ 
    Console.WriteLine(product.GetPropertyValue("Name").ToString()); 
} 

Console.ReadLine(); 

它看起来像你被范围缩小您的查询,这可能是你没有看到所有东西的原因,试试看看你是否有更多的运气。

+0

我试图获取未安装MSI软件的名称,这就是为什么有一些软件dosn't出现,因为他们从他们自己的安装程序安装 –

没有什么不对,Win32_Product WMI类只列出Windows安装(MSI)安装的产品。

+0

是的,这是我的问题,有没有办法我可以列出未安装的产品(MSI) –

+0

@KhaleelHmoz:是的,来自注册表。看到这个问题:[在系统中获取已安装的应用程序](http://*.com/q/908850/113116)。 – Helen

+0

我遇到了需要搜索的注册表值的问题,我试图监视某些软件(如果它们已安装),但最近这些软件已将显示名称值本地化,并且即时尝试查找未在注册表中本地化的值,没有这样的价值。所以我试图得到WMI的另一种方式,希望我得到的价值将是英语。现在的第一个问题是我需要获得所有安装的软件,甚至不能从MSI ... :( –