如何在WMI查询中正确转义组名里的单引号?
解决WMI查询中组名含单引号的转义问题
我使用以下WMI查询:
SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = "Win32_Group.Domain='DOMAIN_NAME',Name='Opérateurs d'assistance de contrôle d'accès'"
组名里的单引号破坏了查询语法,触发错误:
System.Management.ManagementException: Invalid query
我试过以下方法,但均无效:
- 用
''转义组名中的单引号 - 用
\'转义组名中的单引号 - 用
\\'转义组名中的单引号 - 用
[']转义组名中的单引号 - 互换所有常规双引号和单引号
当前使用.NET的System.Management.ManagementObjectSearcher,也可通过PowerShell测试:
Get-WmiObject -Query "SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='DOMAIN_NAME',Name='Opérateurs d'assistance de contrôle d'accès'"""
正确转义方案
WQL(WMI查询语言)中,嵌入在单引号字符串内的单引号,必须用两个连续单引号('')转义。之前无效是因为没理清宿主语言(.NET/PowerShell)的字符串嵌套规则和WQL自身转义的区别,以下是两种环境的正确写法:
.NET环境示例(C#)
先将组名中的单引号替换为两个单引号,再处理字符串的双引号转义:
string query = @"SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='DOMAIN_NAME',Name='Opérateurs d''assistance de contrôle d''accès'"""; ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
也可以不用@符号,用\"转义双引号:
string query = "SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = \"Win32_Group.Domain='DOMAIN_NAME',Name='Opérateurs d''assistance de contrôle d''accès'\"";
PowerShell环境示例
可以用单引号包裹整个查询,内部的单引号用''转义:
Get-WmiObject -Query 'SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = "Win32_Group.Domain=''DOMAIN_NAME'',Name=''Opérateurs d''assistance de contrôle d''accès''"'
或者用Here-String简化嵌套引号处理:
$query = @" SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = "Win32_Group.Domain='DOMAIN_NAME',Name='Opérateurs d''assistance de contrôle d''accès'" "@ Get-WmiObject -Query $query
核心逻辑
WQL语法规定:用单引号包裹的字符串字面量,内部单引号必须用''转义。之前的尝试失败,大多是因为混淆了宿主语言的字符串转义和WQL自身的转义规则——要确保最终传递给WMI服务的查询语句里,组名中的单引号已经被正确替换为'',同时外层字符串的嵌套引号处理不破坏WQL结构。
内容的提问来源于stack exchange,提问作者Manuel K
相关产品推荐
相关产品推荐

