带有两个注册表KeyPath的WMI MOF文件

时间:2015-09-04 00:32:21

标签: wmi

查询Win32_Products需要很长时间,在尝试查询大量计算机时,这让我感到沮丧。我之前从未使用过MOF文件,但有人建议“创建”一个新的命名空间,只包含我要从注册表中查找的信息。

我被指向以下MOF代码:

    #PRAGMA AUTORECOVER

    qualifier dynamic:ToInstance;
    qualifier ProviderClsid:ToInstance;
    qualifier ClassContext:ToInstance;
    qualifier propertycontext:ToInstance; 

    [dynamic, provider("RegProv"),
        ProviderClsid("{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}"),
        ClassContext
        ("local|HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")
    ] 
    class Software {
        [key] string KeyName;
        [read, propertycontext("Publisher")] string Vendor;
        [read, propertycontext("DisplayName")] string ProductName;
        [read, propertycontext("DisplayVersion")] string Version;
        [read, propertycontext("InstallDate")] string InstallDate;
        [read, propertycontext("InstallLocation")] string InstallLocation;
        [read, propertycontext("InstallSource")] string InstallSource;
        [read, propertycontext("UninstallString")] string UninstallString;
    };

这很棒,但是如何检查软件和软件\ Wow6432Node路径?我试过在VM上玩它,但没有运气只是在黑暗中刺伤。

我试过了:

    ("local|HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")
    ("local|HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")

    ("local|HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
    "local|HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")

以及其他一些随意的想法。似乎没什么用。您将如何从两个注册表路径收集信息?

我将不胜感激任何帮助!这会让我的剧本分崩离析。

1 个答案:

答案 0 :(得分:0)

创建两个单独的MOF文件(每个注册表路径一个),或使用多个实例化的__Win32Provider,如下所示

#PRAGMA AUTORECOVER
#pragma namespace("\\\\.\\root\\CimV2")

qualifier dynamic:ToInstance;
qualifier ProviderClsid:ToInstance;
qualifier ClassContext:ToInstance;
qualifier propertycontext:ToInstance; 

Instance of __Win32Provider as $prov32bit
{
  Name = "RegProv32";
  // ClsId = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
};

Instance of __Win32Provider as $prov64bit
{
  Name = "RegProv64";
  // ClsId = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
};

[dynamic, provider($prov32bit),
    ProviderClsid("{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}"),
    ClassContext
    ("local|HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall")
] 

[dynamic, provider($prov64bit),
    ProviderClsid("{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}"),
    ClassContext
    ("local|HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")
] 

非常确定将class Software部分加倍的必要性。不确定所有ToInstance qualifier flavors是否正确。最后,上述脚本并不关心Wow6432Node的存在。但是,this solution looks good

  

此脚本会创建WMIWin32_AddRemovePrograms(以及64位   系统,支持32位应用的Win32_AddRemovePrograms32   由注册管理机构提供商然后可以查询它们以列出已安装的列表   应用程序(和版本)的运行速度比运行相同   使用PowerShell注册表提供程序的查询。此外,他们可以   用于GPO政策等。