我正在为我们的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
但继续获取锁定的部分消息,直到过滤器退回到网站级别。
我还尝试设置virtualDirectoryDefaults.userName和virtualDirectoryDefaults.password,这似乎最初没有,但在IISReset之后,我注意到它们确实添加在applicationHost.config文件的底部。我真的不希望它们设置为默认值,因为我们的应用程序不应该影响服务器上的其他应用程序。
我感谢您提供的任何帮助。我必须遗漏一些东西,因为设置这些和其他Web应用程序配置值应该不那么困难。
此致
答案 0 :(得分:1)
您尝试更改的部分在IIS计算机配置中设置。您必须解锁这些部分才能按站点设置它们。
请参阅:Programmatically unlocking IIS configuration sections in Powershell
答案 1 :(得分:0)
您的过滤器看起来不正确。您可以将过滤器视为基本上是XPath查询。因此,如果您使用//authentication/*
的过滤器,那么将在身份验证节点下获取所有配置。它与XPath不完全相同,但它非常接近。请记住,仅使用Filter参数,您无法选择sectionGroup
或location
标记等元数据部分。
我遇到了一个问题,我需要在服务器级别解锁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>
希望这有帮助。