PowerShell IIS Set-WebConfigurationProperty - 锁定的ApplicationHost.config部分

时间:2014-10-29 21:30:51

标签: powershell iis configuration credentials locked

我正在为我们的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会切断消息,因此我无法确切地告诉它正在抱怨哪个部分,或者哪个父级别被锁定。我必须假设它是Sites部分,因为我正在尝试配置:/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应用程序配置值应该不那么困难。

此致

2 个答案:

答案 0 :(得分:1)

您尝试更改的部分在IIS计算机配置中设置。您必须解锁这些部分才能按站点设置它们。

请参阅:Programmatically unlocking IIS configuration sections in Powershell

答案 1 :(得分:0)

您的过滤器看起来不正确。您可以将过滤器视为基本上是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>

希望这有帮助。