首页 > 解决方案 > Powershell 搜索 ApplicationHost.config 文件并替换值

问题描述

我需要修改默认位于 c:\windows\System32\inetsrv\config 的 applicationHost.config 文件。

查看 XML 文件,配置中有许多位置条目。我只需要修改一个特定的。也许在修改它之前先检查它是否存在?

以下 XML 是我要修改的内容。嵌套在顶级配置下。如果发现为假,我只想更改一项,anonymousAuthentication enabled="true"。

<location path="Default Web Site/MyWebsite/SiteA">
    <system.webServer>
        <security>
            <authentication>
                <digestAuthentication enabled="false" />
                <basicAuthentication enabled="false" />
                <anonymousAuthentication enabled="false" />
                <windowsAuthentication enabled="true">
                    <providers>
                        <clear />
                        <add value="Negotiate" />
                        <add value="NTLM" />
                    </providers>
                </windowsAuthentication>
            </authentication>
        </security>
    </system.webServer>
</location>

一个旁注。我确实看到我可以使用 set-webconfigurationproperty。但是,当我这样做时,它告诉我配置部分不能在此路径中使用。当该部分锁定在父级别时会发生这种情况。我正在使用 PSPath,它应该可以解决这个问题,但它不起作用。

标签: xmlpowershell

解决方案


像这样的东西应该可以解决问题。我建议您创建 Applicationhost 的备份副本,以便在需要时可以恢复。

您需要以管理员身份运行该脚本。

诀窍是利用SelectNodesSelectSingleNode定位您感兴趣的特定节点。我使用您提供的代码来指定我正在寻找您感兴趣的节点,但仅在位置路径对应于“默认网站/MyWebsite/SiteA”的位置

$InetConfigPath = 'c:\windows\System32\inetsrv\config\applicationHost.config'
$xml = [xml](get-content -Path $InetConfigPath -Raw)


$Nodes = $xml.SelectNodes('//location[@path="Default Web Site/MyWebsite/SiteA"]/system.webServer/security/authentication/anonymousAuthentication')
foreach ($Node in $nodes) {
    if ($Node.enabled -eq $false) {
        $Node.enabled = 'true'
    }
}


$xml.Save($InetConfigPath)
  • 建议使用 WebAdministration 模块,而不是直接修改 ApplicationHost.config 文件以避免意外后果。

参考

使用 XPath 导航选择节点


推荐阅读