如何通过PowerShell向Defender for Endpoint API的高级搜寻查询传递变量
解决方法
问题核心原因:直接引用变量不生效,是因为Kusto查询中字符串用单引号包裹时,PowerShell的字符串插值规则不会解析单引号内部的变量,同时未转义的特殊字符也会导致查询语法错误。有两种常用的实现方案:
方案1:PowerShell字符串插值(适合简单场景)
提前对变量的特殊字符做转义,再插入到Kusto查询语句中即可,示例代码如下:
# 定义要传入的PowerShell外部变量 $targetVendorPrefix = "b" # 对变量中的单引号做转义,避免破坏Kusto查询语法 $escapedPrefix = $targetVendorPrefix.Replace("'", "''") # 构造Kusto查询,直接插入转义后的变量 $query = "let letter = '$escapedPrefix'; DeviceTvmSoftwareInventory | where SoftwareVendor startswith letter | project DeviceName, OSPlatform, SoftwareVendor, SoftwareName, SoftwareVersion"
这种方法实现简单,适合变量来源可控的自用脚本场景。
方案2:参数化查询(更安全,推荐生产环境使用)
Microsoft Defender for Endpoint的高级搜寻API原生支持参数化查询,不需要手动处理转义,也完全规避Kusto注入风险,示例代码如下:
# 定义要传入的PowerShell外部变量 $targetVendorPrefix = "b" # 构造API请求体,直接将变量作为参数传入 $apiRequestBody = @{ Query = "DeviceTvmSoftwareInventory | where SoftwareVendor startswith letter | project DeviceName, OSPlatform, SoftwareVendor, SoftwareName, SoftwareVersion" Parameters = @( @{ Name = "letter" Type = "string" Value = $targetVendorPrefix } ) } | ConvertTo-Json # 后续调用API时直接传入$apiRequestBody即可
调用API时使用上述构造的请求体,不需要在Kusto查询内单独写let语句定义变量,参数会自动传入查询上下文。
内容的提问来源于stack exchange,提问作者Planet-9
相关产品推荐
相关产品推荐

