使用 PowerShell 创建 AppPool 不设置 AppPool Identity

Posted

技术标签:

【中文标题】使用 PowerShell 创建 AppPool 不设置 AppPool Identity【英文标题】:Use PowerShell to Create AppPool does not set AppPool Identity 【发布时间】:2013-01-30 19:07:54 【问题描述】:

我正在尝试使用 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 框架已更新,但身份仍设置为 ApplicationPoolIdentity。它应该是域\用户名。

我是机器上的管理员,我在管理员模式下运行 PowerShell。关于我可能缺少什么以使其正常工作的任何想法?

【问题讨论】:

【参考方案1】:

您需要更改流程模型身份类型以接受用户帐户而不是默认的 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 中)。【参考方案2】:

我在需要将 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。

更多关于Process Model的信息可以在这里找到:http://www.iis.net/configreference/system.applicationhost/applicationpools/add/processmodel

【讨论】:

感谢您提供文档链接...有助于识别“神奇数字”【参考方案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

【讨论】:

【参考方案4】:

我在设置身份时遇到了类似的问题。最后,我检查了它设置的密码:

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

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

我把双引号改成了单引号,效果很好。

【讨论】:

【参考方案5】:

在我的环境中,这些答案对我不起作用。我正在尝试使用 MSA 作为我的应用程序池的身份。我可以在控制台中运行所有命令(@musaab-al-okaidi 的回答)而不会出现任何错误,但经过进一步检查,没有用户名与应用程序池相关联。

我最终直接修改了applicationHost.config 文件(先备份!)为应用程序池添加正确的身份。

不知道的朋友可以去看看applicationHost.config:c:\Windows32\inetsrv\config

applicationHost.config 文件中,查找您的应用程序池条目,并添加一个“用户名”属性,如下所示:

<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 服务器,以确保新配置已加载。

希望对您有所帮助。

【讨论】:

以上是关于使用 PowerShell 创建 AppPool 不设置 AppPool Identity的主要内容,如果未能解决你的问题,请参考以下文章

新创建的 IIS AppPool 标识的权限集

用户 'IIS APPPOOL\ 登录失败

Powershell的IIS管理小结

如何将多个字符串参数传递给 PowerShell 脚本?

使用C#远程设置IIS AppPool用户的文件权限

IIS AppPool 回收时间使用啥时区/格式?