WMI 命名空间中的转义字符

Escape characters in WMI namespace

我正在尝试在本地计算机上查找 class ReportServer_ConfigurationSetting(SSRS 配置)的所有实例。这归结为找到合适的名称空间并在其中列出对象。我在大多数机器上都没有问题,但有一个问题。我使用以下代码来完成:

function SSRS-GetInstanceNamespace($sqlInstanceName) {
    $ns = "Root\Microsoft\SqlServer\ReportServer\RS_${sqlInstanceName}"
    $ns = ($ns + '\' + (Get-WmiObject -Namespace $ns -Class __Namespace).Name + "\Admin")
    return $ns
}    
$x = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances
$x | % { SSRS-GetInstanceNamespace $_ }

这在大多数情况下都有效,但我们的一台机器的实例名称包含下划线,例如"A_B"。不幸的是,由于下划线在 WMI 实例中是有意义的(至少看起来如此),它必须被转义。我可以使用简单的替换来做到这一点,但是有什么方法可以始终如一地转义所有特殊字符吗?在上面的示例中,我需要的是 "A_5fB" 而不是 "A_B".

我从来没有按照我想要的方式解决这个问题,我只是遍历命名空间并递归地做:

get-wmiobject -namespace $ns -class __namespace

寻找那些符合我的条件并尝试使用 "heuristics" 匹配实例名称,也就是说,如果它不直接匹配,那么我尝试用 5F 替换 _。这行得通,但我基本上可以肯定,随着越来越多的客户使用此工具,这将成为长期错误的一个很好的来源。