是否有最佳实践"在WMI查询中转义字符的方式(或首选替代方法,例如某种类似于DbParameter的WMI)?
目前我已经推出了自己的产品,但一般来说,这类产品有更安全的选择;虽然到目前为止我还没有找到任何。
我自己动手实施
使用正则表达式替换以确保反斜杠,撇号和引号字符以反斜杠为前缀:
function ConvertTo-WmiEscapedQuery {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Query
,
[Parameter()]
[string[]]$Parameters = @()
)
begin {
[string]$EscapeCharatersRegex = '([\\''"])'
}
process {
[string[]]$EscapedParameters = $Parameters | %{$_ -replace $EscapeCharatersRegex, '\$1'}
$Query -f $EscapedParameters
}
}
示例使用场景
function Get-WmiService {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$ServiceName
)
begin {
[string]$Query = 'select * from win32_service where name = "{0}"'
}
process {
Get-WmiObject -Query (ConvertTo-WmiEscapedQuery -Query $Query -Parameters $ServiceName)
}
}
Get-WmiService 'John''s Example Service'