什么是逃避WMI字符串的正确方法?

时间:2017-04-06 14:11:35

标签: .net powershell escaping wmi-query wmi-service

是否有最佳实践"在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'

0 个答案:

没有答案