如何从PowerShell指定应用程序池标识用户和密码

时间:2014-01-28 19:44:56

标签: iis powershell iis-7 powershell-v3.0 web-administration

我在使用应用程序池标识自动设置Web应用程序和配置IIS时遇到了很多困难。我在用PowerShell编写的Web应用程序部署脚本中执行此操作。我的要求是我需要使用PowerShell脚本将应用程序池标识用户设置为特定的服务帐户mydomain \ svcuser和password。以下是示例代码:

$pool = New-Item "IIS:\AppPools\MyAppPool" -Force
$svcuser = "mydomain\svcuser"
$pool.processModel.userName = $svcuser
$password = "somepassword"
$pool.processModel.password = $password
$pool.processModel.identityType = 3
$pool | Set-Item -ErrorAction Stop

当我运行此操作时,所有都会正常工作 - 不会抛出任何错误,并且应用程序标识用户名出现在IIS中 - 但由于某种原因,密码未正确设置,如果一点都不由于它是一个密码,我无法验证它是否已设置,但我可以断定,如果它是,它没有设置正确。在我手动进入并在IIS中输入密码之前,它不会对生成的应用程序池用户进行身份验证。因此,应用程序在部署到Web服务器后失败,需要手动干预。

我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:38)

您可以按照以下方式执行此操作:

Import-Module WebAdministration
Set-ItemProperty IIS:\AppPools\app-pool-name -name processModel -value @{userName="user_name";password="password";identitytype=3}

请在此处查看此文档以获取解释,以及您将在以下位置运行应用程序池的用户类型的缩进类型数字的引用:http://www.iis.net/configreference/system.applicationhost/applicationpools/add/processmodel

答案 1 :(得分:5)

经过几次实验

这是我的答案,我希望这会有所帮助,我已经在IIS 8.5上工作了

$credentials = (Get-Credential -Message "Please enter the Login credentials including Domain Name").GetNetworkCredential()

$userName = $credentials.Domain + '\' + $credentials.UserName

Set-ItemProperty IIS:\AppPools\$app_pool_name -name processModel.identityType -Value SpecificUser 

Set-ItemProperty IIS:\AppPools\$app_pool_name -name processModel.userName -Value $username

Set-ItemProperty IIS:\AppPools\$app_pool_name -name processModel.password -Value $credentials.Password

答案 2 :(得分:0)

我正在使用没有'ConvertFrom-SecureString'的Powershell v4,最终我得到了以下对我有用的东西:

Import-Module WebAdministration

$cred = Get-Credential -Message "Please enter username and new password to reset IIS app pool password (for app pools running as username)"

$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($cred.Password)
$plaintext = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)

$applicationPools = Get-ChildItem IIS:\AppPools | where { $_.processModel.userName -eq 
$cred.UserName }

foreach($pool in $applicationPools)
{
    $apppool = "IIS:\AppPools\" + $pool.Name

    Set-ItemProperty $apppool -name processModel.password -Value $plaintext
}

Write-Host "Application pool passwords updated..." -ForegroundColor Magenta 
Write-Host "" 
Read-Host -Prompt "Press Enter to exit"

答案 3 :(得分:0)

似乎您现在可以直接进行一些操作

appcmd set apppool junkapp /processmodel.password:junkpassword