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

Posted

技术标签:

【中文标题】我在 C# 中使用 WMI 来获取所有已安装的软件,但它并没有显示所有软件,只显示 Microsoft 软件【英文标题】:I'm using WMI in C# to get all the installed softwares but it doesn't show all the softwares only Microsoft ones 【发布时间】:2013-10-30 15:53:13 【问题描述】:
  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";
                
            

       

    

那么我的代码有什么问题?

【问题讨论】:

【参考方案1】:

没有错,Win32_Product WMI 类只列出了 Windows Installer 安装的产品(MSI)。

【讨论】:

是的,这是我的问题,有什么方法可以列出 (MSI) 未安装的产品 @KhaleelHmoz:是的,来自注册表。看到这个问题:Get installed applications in a system. 我在需要搜索的注册表值方面遇到问题,我正在尝试监控某些软件是否已安装,但最近这些软件已将显示名称值本地化,我正在尝试查找未在注册表中本地化的值,没有这样的值。所以我试图获得另一种方式,即 WMI,希望我得到的值是英文的。现在的第一个问题是我需要从 MSI 获取所有已安装的软件... : (【参考方案2】:

我刚刚测试了您的以下代码的简化版本,我看到所有东西都安装在我的电脑上,甚至包括我自己编写和安装的服务:

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();

您似乎正在按范围缩小查询范围,这可能是您没有看到所有内容的原因,请尝试上述方法,看看您是否有更多运气。

【讨论】:

我正在尝试获取 MSI 未安装的软件的名称,这就是为什么有些软件没有出现,因为它们是从自己的安装程序安装的

以上是关于我在 C# 中使用 WMI 来获取所有已安装的软件,但它并没有显示所有软件,只显示 Microsoft 软件的主要内容,如果未能解决你的问题,请参考以下文章

WMI:获取已安装软件的列表

WMI VBScript 与 C#

电脑管家(像qq,360管家)是怎么获取到系统中安装的软件列表和补丁列表(漏洞,已安装,未安装)用C#如何实现

如何使用 C# 在 WMI 中读取 ManagementObject 集合

如何在 C#(无 WMI)中获取硬盘序列号?

如何在 C# 中获取启用(媒体)设备的列表