1

是否有在 WMI 查询中转义字符的“最佳实践”方法(或首选替代方法,例如某种 WMI 等效于DbParameter)?

目前我已经推出了自己的产品,但通常对于这类事情有更安全的选择;虽然到目前为止我还没有找到。

我的滚动你自己的实施

使用正则表达式替换以确保反斜杠、撇号和引号字符以反斜杠为前缀:

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'
4

0 回答 0