使用PowerShell创建应用程序池不设置应用程序池身份验证

19

我正在尝试使用PowerShell在IIS中创建一个应用程序池。在搜索网络后,我创建了以下测试脚本:

Import-Module WebAdministration

$siteName = "TestAppPool"
$userAccountName = "Domain\UserName"
$userAccountPassword = "MyPassword"

if(!(Test-Path ("IIS:\AppPools\" + $siteName)))
{
     $appPool = New-Item ("IIS:\AppPools\" + $siteName)

     #Display Default AppPool Settings
     "AppPool = " + $appPool
     "UserName = " + $appPool.processModel.userName
     "Password = " + $appPool.processModel.password
     "Runtime = " + $appPool.managedRuntimeVersion
     
     $appPool.processModel.userName = $userAccountName
     $appPool.processModel.password = $userAccountPassword
     $appPool.managedRuntimeVersion = "v4.0"
     $appPool | Set-Item

     #Display Updated AppPool Settings
     "AppPool = " +$appPool
     "UserName = " + $appPool.processModel.userName
     "Password = " + $appPool.processModel.password
     "Runtime = " + $appPool.managedRuntimeVersion
}
当我运行脚本时,用户名和密码没有被更新成我设置的值。 这是两个打印块的结果。
#Display Default AppPool Settings
AppPool = Microsoft.IIs.PowerShell.Framework.ConfigurationElement
UserName = 
Password = 
Runtime = v2.0

#Display Updated AppPool Settings
AppPool = Microsoft.IIs.PowerShell.Framework.ConfigurationElement
UserName = 
Password = 
Runtime = v2.0

在IIS中查看应用程序池,发现.NET Framework已经更新,但身份仍设置为ApplicationPoolIdentity。它应该是Domain\UserName。

图片描述

我是该计算机上的管理员,并且以管理员模式运行PowerShell。有什么想法可以让这个工作起来吗?

5个回答

26

你需要更改进程模型标识类型,以接受用户帐户而不是默认的ApplicationPoolIdentity。具体操作如下:

Set-ItemProperty -Path IIS:\AppPools\TestAppPool -Name processmodel.identityType -Value 3
Set-ItemProperty -Path IIS:\AppPools\TestAppPool -Name processmodel.userName -Value Domain\UserName
Set-ItemProperty -Path IIS:\AppPools\TestAppPool -Name processmodel.password -Value MyPassword

我希望这可以帮助到您。


我不得不使用-Name processmodel.userName - 它似乎是大小写敏感的(至少在Server 2016中)。 - user2871239
1
@user2871239 谢谢,这对我来说很关键,userName在2016年及以上版本中确实区分大小写。 - David Martin

7

在需要将appPool设置为NetworkService时,我发现了这个问题。对于任何需要执行此操作的人,以下是在IIS 7.5中设置appPool为NetworkService的语法。

$pool = get-item("IIS:\AppPools\YOURAPPPOOLNAME");
$pool | Set-ItemProperty -Name "ProcessModel.IdentityType" -Value 2

注意:在IIS 7.5中,NetworkService的值已从3更改为2。

有关进程模型的更多信息,请访问此处:http://www.iis.net/configreference/system.applicationhost/applicationpools/add/processmodel


感谢您包含文档链接...有助于识别“魔数”。 - JamesQMurphy

3

以上方法对我无效,以下方法可行:

import-module webadministration
$pool = Get-Item "IIS:\AppPools\apppoolname"
$pool.processmodel.identityType = 3
$pool.processmodel.username  = "username"
$pool.processmodel.password = "password"
$pool | set-item

0
在我的环境中,这些答案对我没有用。我试图使用MSA作为我的应用程序池的身份标识。我可以在控制台中运行所有命令(@musaab-al-okaidi的答案)而不出现任何错误,但进一步检查后,没有用户名与应用程序池相关联。
最终,我直接修改了applicationHost.config文件(首先备份!)以添加适当的应用程序池身份标识。
对于那些不知道的人,applicationHost.config可以在以下位置找到:c:\Windows32\inetsrv\configapplicationHost.config文件中,查找您的应用程序池条目,并添加一个“username”属性,如下所示:
<system.applicationHost>
    <applicationPools>
        <add name="someAppPool" autoStart="true" managedRuntimeVersion="4.0" startMode="AlwaysRunning">
            <processModel identityType="SpecificUser" userName="domain\username$" idleTimeout="00:00:00" />
        </add>
    </applicationPools>
</system.applicationHost>

您也可以以类似的方式设置密码(因为我正在使用MSA,所以在此处无需设置密码,因为MSA在AD中是“受管理的”,并安装在IIS框中)。

我还停止/启动了IIS服务器,以确保加载了新的配置。

希望这有所帮助。


0

我遇到了类似的问题,设置身份验证时出现了困难。最后,我检查了一下它将密码设置为什么:

Get-ItemProperty $appPool -name "processmodel.password"

只看到了部分密码。原来我在密码字符串参数中使用了双引号,而密码以“$”开头,导致它被解析为变量。

我将双引号改为单引号,然后它就可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接