Invoke-CimMethod遇无效字符,求助SCCM ZTI部署PXE请求清除问题
解决SCCM ZTI部署脚本中清除PXE请求的两个问题
针对你在编写PowerShell脚本时遇到的两个问题,我来逐一给出实用解决方案:
1. WMI命令无论计算机是否存在都返回StatusCode 0的问题
这个现象其实是SCCM的SMS_Site.ClearLastPxeAdvertisement方法的设计特性——即使传入的资源ID不存在,它也不会返回错误状态码,而是静默处理。要区分“目标计算机不存在”和“成功清除PXE请求”的情况,你需要先验证计算机是否在SCCM中存在,再执行清除操作。
改进后的WMI脚本示例:
# 配置参数 $targetComputer = "YourComputerName" $sccmSiteCode = "ABC" $wmiNamespace = "root\SMS\site_$sccmSiteCode" # 第一步:查询目标计算机的资源ID try { $systemResource = Get-WmiObject -Namespace $wmiNamespace -Class SMS_R_System -Filter "Name='$targetComputer'" -ErrorAction Stop } catch { Write-Error "查询SCCM资源失败:$_" exit 1 } if ($systemResource) { # 第二步:调用清除PXE请求的方法 $siteInstance = Get-WmiObject -Namespace $wmiNamespace -Class SMS_Site -Filter "SiteCode='$sccmSiteCode'" $clearResult = $siteInstance.ClearLastPxeAdvertisement($systemResource.ResourceID) if ($clearResult.ReturnValue -eq 0) { Write-Host "✅ 成功清除计算机 $targetComputer 的PXE请求" } else { Write-Warning "⚠️ 清除PXE请求失败,返回值:$($clearResult.ReturnValue)" } } else { Write-Warning "⚠️ 未找到计算机 $targetComputer,请确认名称或SCCM同步状态" }
2. Invoke-CimMethod遇到无效字符的问题
这个问题通常出现在参数格式错误、特殊字符未转义,或者命名空间/方法名拼写错误上。Invoke-CimMethod对参数的类型和格式要求更严格,尤其是当计算机名称包含单引号这类特殊字符时,必须先转义。
正确的Invoke-CimMethod实现:
# 配置参数 $targetComputer = "YourComputerName" $sccmSiteCode = "ABC" $cimNamespace = "root\SMS\site_$sccmSiteCode" # 处理计算机名称中的特殊字符(比如单引号) $escapedComputerName = $targetComputer -replace "'", "''" # 第一步:查询目标计算机的资源ID try { $systemResource = Get-CimInstance -Namespace $cimNamespace -ClassName SMS_R_System -Filter "Name='$escapedComputerName'" -ErrorAction Stop } catch { Write-Error "查询SCCM资源失败:$_" exit 1 } if ($systemResource) { # 第二步:调用清除PXE请求的方法 $methodParams = @{ ResourceID = $systemResource.ResourceID } try { $clearResult = Invoke-CimMethod -Namespace $cimNamespace -ClassName SMS_Site -MethodName ClearLastPxeAdvertisement -Arguments $methodParams -ErrorAction Stop if ($clearResult.ReturnValue -eq 0) { Write-Host "✅ 成功清除计算机 $targetComputer 的PXE请求" } else { Write-Warning "⚠️ 清除PXE请求失败,返回值:$($clearResult.ReturnValue)" } } catch { Write-Error "调用CIM方法失败:$_" } } else { Write-Warning "⚠️ 未找到计算机 $targetComputer,请确认名称或SCCM同步状态" }
关键注意点:
- 如果你的计算机名称包含特殊字符(如
'、&),一定要用-replace "'", "''"转义单引号,避免Filter语句语法错误 - 确保
$cimNamespace中的SiteCode正确,比如root\SMS\site_ABC(ABC是你的SCCM站点代码) Invoke-CimMethod的Arguments参数必须是哈希表,键名要和方法的参数名完全匹配(这里是ResourceID)
内容的提问来源于stack exchange,提问作者Patrick Pruneau
相关产品推荐
相关产品推荐

