39

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

$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

4 回答 4

67

你可以这样做:

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

于 2014-10-15T20:52:31.873 回答
10

经过几次实验

这是我的答案,我希望这会有所帮助,我在 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
于 2018-01-30T15:19:40.683 回答
1

看来您现在可以更直接地执行此操作

appcmd set apppool junkapp /processmodel.password:junkpassword
于 2020-09-11T22:14:15.740 回答
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"
于 2020-03-09T10:59:47.410 回答