【问题标题】:PowerShell IIS Set-WebConfigurationProperty - Locked ApplicationHost.config sectionPowerShell IIS Set-WebConfigurationProperty - 锁定 ApplicationHost.config 部分
【发布时间】:2014-10-29 21:30:50
【问题描述】:

我正在为我们的 Web 应用程序和 Web 服务编写 PowerShell 3.0 安装程序,但在尝试设置物理路径凭据时遇到了问题。

我的代码如下所示:

# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# >>>>>> Path credentials
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

# Set the physical path credentials of the web application (on Basic Settings screen) to Connect As...
$filter="/system.applicationHost/sites/site[@name='{0}' and    @id='1']/application[@path='/{1}']/VirtualDirectory[@path='/']" -f $script:WebSiteName,$appName
Set-WebConfiguration $filter -Value @{userName="$physicalPathCredentialUserID";password="$physicalPathCredentialPassword"} 

执行时,我在 PowerShell 中收到一条错误消息,指出“此配置部分无法在此路径中使用。当该部分被锁定在父级别时会发生这种情况”。我尝试了在身份验证部分被锁定时起作用的 PSPath 和位置标记,但它们似乎没有任何效果。我想也许 -Force 选项会起作用,但是虽然没有抛出错误,但物理路径凭据似乎没有被采用。

如果没有 -Force 选项,则会引发错误,但 PowerShell 会切断消息,因此我无法准确判断它在抱怨哪个部分,或者哪个父级别被锁定。我必须假设它是站点部分,因为我正在尝试配置:/configuration/system.applicationHost/sites/application/virtualDirectory

我对解锁和允许覆盖以使值保持不变之间的区别有点困惑。 PowerShell WebAdministration 在这方面相当混乱。我不知道为什么将作为推论的值设置为可以在 IIS 管理 UI 中设置的值会如此令人困惑。一些值使用带有丑陋字符串的 Set-WebConfiguration,如上所示,其他值使用 Set-WebConfigurationProperty。如果锁定是一个已知问题,为什么没有更好地记录解锁?

我不想解锁所有网站或所有应用程序。我只想解锁我必须做的事情,以便在我在默认网站下安装的每个 Web 应用程序上设置配置值。

截至 2014 年和 PowerShell 3.0 解锁或覆盖配置部分的最终解决方案是什么?哪些设置接受 PSPath 和位置?

顺便说一句,我尝试了以下变体:

$filter="/system.applicationHost/sites/site[@name='{0}' and    @id='1']/application[@path='/{1}']/VirtualDirectory[@path='/']" -f $script:WebSiteName,$appName
Set-WebConfiguration $filter machine/webroot/appHost -metadata overrideMode -value Allow

但继续收到锁定部分消息,直到过滤器退回到站点级别。

我还尝试设置 virtualDirectoryDe​​faults.userName 和 virtualDirectoryDe​​faults.password,最初似乎不需要,但在 IISReset 之后,我注意到它们确实被添加到 applicationHost.config 文件的底部。我真的不希望将它们设置为默认值,因为我们的应用不应影响服务器上的其他应用。

感谢您提供的任何帮助。我一定遗漏了一些东西,因为设置这些和其他 Web 应用程序配置值应该不难。

问候

【问题讨论】:

    标签: powershell iis configuration credentials locked


    【解决方案1】:

    您尝试更改的部分已在 IIS 机器配置中设置。您必须解锁这些部分才能为每个站点设置它们。

    见:Programmatically unlocking IIS configuration sections in Powershell

    【讨论】:

    • 这似乎是一种相当粗略的方法。我真的必须退出 WebAdministration 模块并加载 ServerManager 吗?我不敢相信为 PowerShell 编写 WebAdministration 的人没有预见到需要解锁应用程序设置。
    • 嗯,它不是 ServerManager 模块中用于处理角色和功能的模块,它是 .net WebAdministration 控件的一部分。尽管如此,那个帖子已经很老了。也许有更好的方法,但我不知道有一个,本地。如果您想使用第三方产品,Carbon 似乎已将其放入一个漂亮整洁的 cmdlet(我从未使用过):get-carbon.org/help/Unlock-IisConfigurationSection.html
    【解决方案2】:

    您的过滤器看起来不正确。您可以将过滤器视为基本的 XPath 查询。因此,如果您使用 //authentication/* 过滤器,那么您的所有配置都会在身份验证节点下获得。它与 XPath 并不完全相同,但非常接近。请记住,您不能仅使用 Filter 参数来选择元数据部分,例如 sectionGrouplocation 标签。

    我遇到了一个问题,我需要在服务器级别解锁 Windows 身份验证,这样我就可以在应用程序级别将 Windows 身份验证设置为不同的值。所以我不得不这样做:

    Set-WebConfiguration -Metadata OverrideMode -Value Allow -Filter //windowsAuthentication
    Set-WebConfigurationProperty -PSPath IIS:\Sites\$WebsiteName\$AppName -Filter //windowsAuthentication -Name Enabled -Value $true
    

    这样做是在 applicationHost.config 文件中创建一个如下所示的部分:

    <location path="" overrideMode="Allow">
            <system.webServer>
                <security>
                    <authentication>
                        <windowsAuthentication>
                        </windowsAuthentication>
                    </authentication>
                </security>
            </system.webServer>
    </location>
    

    我相信,根据 IIS,您使用该位置标记放置的任何配置都将被视为已解锁。

    这就是添加到 Web 应用程序本身的 Web.config 文件中的内容:

    <authentication>
        <windowsAuthentication enabled="true" />
    </authentication>
    

    希望这会有所帮助。

    【讨论】:

    • 我真的在和这个作斗争,我不得不做出一个改变。在第一个命令中,它需要是 overrideMode 而不是 OverrideMode
    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多