Sql server 确定给定命名空间是否存在WMIOObject类

Sql server 确定给定命名空间是否存在WMIOObject类,sql-server,windows,powershell,wmi,Sql Server,Windows,Powershell,Wmi,我有一个名称空间,我想在运行Get WmiObject之前,用它来验证WMI对象是否存在。例如,我想抛出SSRS 2012的名称空间,如果机器上不存在,那么我将尝试SSRS 2008 R2的下一个名称空间 是否有一种方法可以检查类的存在,只需猜测名称空间,如果不存在则不抛出错误? 我不想用试捕作为解决方案。我想知道一种方法,可以得到一个简单的布尔结果,告诉我这个类是否存在于这个名称空间中 我也不想使用SilentlyContinue作为解决方案 这将从SQL代理作业中的Powershell作业步

我有一个名称空间,我想在运行
Get WmiObject
之前,用它来验证WMI对象是否存在。例如,我想抛出SSRS 2012的名称空间,如果机器上不存在,那么我将尝试SSRS 2008 R2的下一个名称空间

是否有一种方法可以检查类的存在,只需猜测名称空间,如果不存在则不抛出错误?

  • 我不想用试捕作为解决方案。我想知道一种方法,可以得到一个简单的布尔结果,告诉我这个类是否存在于这个名称空间中
  • 我也不想使用SilentlyContinue作为解决方案
  • 这将从SQL代理作业中的Powershell作业步骤执行。这有时处理错误的方式与纯Powershell不同,这也是我关注上述#的1和2的原因

  • 可以使用的
    -Class
    -List
    -Namespace
    参数查看指定命名空间中是否存在单个类:

    $class = Get-WmiObject -Class 'Win32_BIOS' -List -Namespace 'root\cimv2';
    $classExists = $class -ne $null;
    
    以下是我的答案中的另一种(但速度较慢)方法:

    $class = Get-WmiObject -List -Namespace 'root\cimv2' `
        | Where-Object { $_.Name -eq 'Win32_BIOS'; };
    $classExists = $class -ne $null;
    
    回到,这里有第三个选项,在我的测试中,如果名称空间或类无效,它不会引发任何错误:

    $class = Get-WmiObject -List | Where-Object {
        $_.__NAMESPACE -eq 'root\cimv2' -and $_.__CLASS -eq 'Win32_BIOS';
    };
    $classExists = $class -ne $null;
    

    请注意,
    $\uu.Name
    $\uu.CLASS
    实际上是同义词。在每个代码段中,
    $class
    将包含您搜索的类的实例(如果找到),否则
    $null

    当找不到该类以及您无权查询该类时,上述代码将出错。因此,最好将其包装在一个try-catch中,以处理错误并相应地显示消息。

    如果您指的是我的答案,我已经使用PowerShell 2.0和3.0进行了测试,当您传递无效的命名空间时,我的代码会产生错误,但是如果传递一个带有有效名称空间的无效类名,它将返回
    $null
    @BACON,那么这就不是我要寻找的逻辑。我想猜测一个名称空间,并确定该类是否存在于该计算机上。我将尝试编辑我的问题以反映这一点。我仅限于SQL代理如何执行Powershell作业步骤,并且我认为try-catch和错误处理不像纯Powershell那样优雅。基本上,我想测试名称空间,如果计算机上不存在对应的类,我想尝试另一个名称空间,因为它可能正在使用另一个版本的SSRS。我意识到我可能可以先检查安装的版本,但我希望知道我最初的方法是否可行。我已经更新了我的答案(实际上,恢复了我原来的解决方案)使用在命名空间或类名无效时不会引发错误的代码。我们通过捕获SSRS版本来解决此问题,就像这家伙在foreach循环中所做的那样:。但是我仍然认为这个问题有价值。谢谢你解释$。\u Name和$。\u CLASS之间的相似性。不幸的是,当我尝试你的第三个例子(或其中任何一个)时,$classExists是假的,即使我知道名称空间应该在机器上。我正在搜索的类:
    MSReportServer\u ConfigurationSetting
    我正在搜索的名称空间:
    root\microsoft\sqlserver\reportserver\RS\uv11\admin
    因为我知道正确的名称空间,所以我可以运行
    $sclass=Get wmiossrect-namespace$ns-class“MSReportServer\u ConfigurationSetting”
    并获得
    $SSRSClass
    结果中列出的
    \uu类
    和uu命名空间
    。但是当我对
    \uu类
    \uu名称空间
    使用相同的值时,您的方法似乎不起作用。如果运行
    Get Wmiobject-List-NAMESPACE$ns
    它是否返回任何内容、错误、不包括
    MSReportServer\u配置设置的类列表
    ?那么,仅仅
    getwmioobject-List
    如何,这是从目标名称空间返回类吗?如果从提升的PowerShell会话运行,输出是否会更改(不确定是否适用于您的环境)?运行
    Get Wmiobject-List-Namespace$ns
    会返回包含MSReportServer\u配置设置的列表。但是
    getwmioobject-List
    没有。