我正在通过 SCCM 部署一对脚本来设置各种 IIS 配置项 - 例如默认日志位置、截断值等等。我添加的其中一项是自定义日志文件字段:
Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/sites/$Sitename/logFile/customFields" -name "." -value @{logFieldName='Original-IP';sourceName='X-Forwarded-For';sourceType='RequestHeader'}
这很好用;我可以使用 IIS 中的配置编辑器手动浏览它,它会显示在日志设置 GUI 中。但是,我遇到了一个问题。SCCM 部署的一部分是运行一个脚本来验证每个服务器上的值是否正确前它运行修正脚本。这将定期针对我们的环境(3000 多台 Windows 服务器)运行,并且该验证脚本的结果将决定 SCCM 是否运行设置值的修正脚本。
我想避免在没有必要的时候运行脚本(我的老板喜欢 100% 准确的东西),但我搞不清楚我收到的错误。我知道我轮询的值是错误的,所以我无法告诉它要匹配什么。有人能帮我解决这个问题吗?
$SiteLogFileCustom = Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/sites/$Sitename/logFile/customFields" -name Original-IP
if (($SiteLogFileCustom) -eq ('Original-IP'))
{
write-host "Match!"
}
else
{
write-Error "Mismatched values!" -Category NotInstalled -ErrorId MisMatch
返回:
\\tsclient\D\share\scripts\IIS-Settings\Check-iisSettings.ps1 : Mismatched values!
+ CategoryInfo : NotInstalled: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : MisMatch,Check-iisSettings.ps1
这是预期结果,因为值返回空白。如何轮询集合 customFields 以获取自定义字段的名称列表,然后将它们与预定列表进行匹配?
PS-应该只有一个字段,即Original-IP。
答案1
来自 sharkbite0141 通过 /r/PowerShell 19 小时前发送:
这是您的 Get-WebConfigurationProperty Filter 和 Name 参数的问题以及您的 if 语句的问题的组合:
$SiteLogFileCustom = Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/sites/site[@name='$Sitename']/logFile/customFields" -Name 'Collection'
if ($SiteLogFileCustom.logFieldName -match 'Original-IP')
{write-output "Match!"}
else
{write-Error "Mismatched values!" -Category NotInstalled -ErrorId MisMatch}
解释:
首先,在 Filter 属性中,站点名称查询有些奇怪。site[@name='$Sitename'] 参数可以更好地匹配站点名称。其次,-Name 参数需要为“Collection”,因为您在 customFields 配置中查找的配置属性的名称是自定义属性的集合。现在,根据文档,单个句点“。”应该在具有 Collection 属性的配置上用作通配符,但无论出于何种原因,它只在我专门命名“Collection”属性时才对我有效。
然后,在您的 if 语句中,您还需要指定要匹配值的属性。在本例中,Original-IP 值存储在 logFieldName 属性中。因此,我们将其添加到 $SiteLogFileCustom 的末尾,然后就好了!
还有一个小补充:除非您需要颜色格式之类的东西,否则最好使用 Write-Output 而不是 Write-Host,因为 Write-Output 会写入管道,这意味着您可以将其通过管道传输到另一个 cmdlet 或将其存储在变量中,而 Write-Host 会输出到可视化控制台。
编辑:格式和附加说明