Как указать пользователя и пароль удостоверения пула приложений из PowerShell

У меня были большие трудности с автоматизацией установки веб-приложения и соответствующей настройкой IIS с помощью удостоверения пула приложений. Я делаю это в сценарии развертывания веб-приложения, написанном на PowerShell. Мое требование состоит в том, что мне нужен мой сценарий 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. В результате приложение дает сбой после развертывания на веб-сервере и требует ручного вмешательства.

Я что-то упустил здесь?


person paulyphonic    schedule 28.01.2014    source источник
comment
Я думаю, что вы действительно можете проверить пароль, установленный для объекта processmodel, если вы проверите его с помощью powershell. Просто попробуйте get-itemproperty 'IIS':\AppPools\myapppoolnamehere' ProcessModel   -  person Robert Westerlund    schedule 29.01.2014
comment
Отлично, спасибо. Теперь, по крайней мере, я могу проверить, что он на самом деле делает с паролем. Надеюсь, это позволит мне приблизиться к пути к решению.   -  person paulyphonic    schedule 29.01.2014
comment
Я подтвердил, что пароль действительно установлен правильно. Таким образом, единственный возможный вывод состоит в том, что это либо повторяющаяся ошибка пользователя, либо IIS делает что-то еще за кулисами, когда вы указываете пароль вручную в пользовательском интерфейсе, а не с помощью модуля веб-администрирования в PowerShell. Основным симптомом является то, что после запуска развертывания моих веб-приложений пулы приложений дают сбой и останавливаются при первом же попадании в них. Затем повторный ввод того же пароля вручную устраняет проблему.   -  person paulyphonic    schedule 31.01.2014
comment
Что-нибудь в журнале событий? Решит ли это проблему, если вы снова установите пароль в объекте модели процесса? Есть ли какая-то разница, если вы установите для параметра identitytype значение SpecificUser (как строку) вместо 3 (как int)?   -  person Robert Westerlund    schedule 31.01.2014
comment
Как оказалось, все это было отвлекающим маневром. Причина того, что пароль не вводится правильно, - это то, чего я не ожидал. Скрипт работает правильно, когда я запускаю из консоли PowerShell, но в моем реальном сценарии я получаю зашифрованный пароль из файла, затем расшифровываю его с помощью ключей, которые находятся в реестре, и все это вызывается удаленно с помощью PSExec. Когда я запускаю в PowerShell, он расшифровывается правильно, но когда я делаю это через PSExec, тот же пользователь не может получить доступ к ключам из реестра и, следовательно, не может расшифровать пароль и устанавливает его неправильно.   -  person paulyphonic    schedule 05.02.2014
comment
Но спасибо за ваш комментарий выше, так как он помог мне увидеть, что я действительно могу получить доступ к паролю прямо из магазина. Что вызывает некоторые вопросы: не является ли это уязвимостью системы безопасности? Я не знаю других областей, где MS позволила бы вам получить незашифрованный пароль к учетной записи пользователя, просто запросив его. Заставляет меня задаться вопросом, почему я вообще заморачиваюсь, чтобы зашифровать его с самого начала.   -  person paulyphonic    schedule 05.02.2014
comment
К сожалению, я не могу воспроизвести утверждение PSExec, которое я сделал выше, и, запустив PSExec вручную, я наверняка смогу прочитать реестр на машинах (те же машины, та же учетная запись), поэтому поиск продолжается. Я могу просто закрыть или отредактировать вопрос, как только получу детали, которые мне нужны, чтобы даже задать правильный вопрос. :(   -  person paulyphonic    schedule 05.02.2014
comment
Может быть, когда вы использовали PsExec, вы указали ключ -e, который не позволяет ему загружать профиль пользователя? Или.... возможно, профиль еще не был построен?   -  person Nathan Hartley    schedule 06.01.2016
comment
Я видел поведение, похожее на то, что вы описываете. Для меня первый раз, когда я устанавливаю пароль в течение периода времени (возможно, день, здесь не уверен), он будет установлен. Тогда последующие попытки, по-видимому, не имеют никакого эффекта. Как будто где-то есть кеш, который можно обновлять только время от времени.   -  person Prof Von Lemongargle    schedule 12.07.2018


Ответы (4)


Вы бы сделали это следующим образом:

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

person Vitorrio Brooks    schedule 15.10.2014
comment
Этот ответ действительно уже является частью вопроса. Я уже устанавливал имя пользователя и пароль. Как указано в комментариях выше, фактическая проблема заключается в том, что запуск кода устанавливает пароль правильно, но не тогда, когда он запускается в моем конкретном случае, когда TFSDeployer вызывает PowerShell, вызывает PSExec, вызывает PowerShell. Что-то здесь теряется. Я перешел на другую должность в другой компании и вряд ли когда-нибудь вернусь к этой проблеме и выясню, что ее вызвало, поэтому я надеюсь, что это кому-то пригодится в будущем. - person paulyphonic; 01.11.2014
comment
Использование этого ответа без Import-Module WebAdministration приведет к ошибке Set-ItemProperty : Cannot find drive. A drive with the name 'IIS' does not exist.. согласно stackoverflow.com/questions/24392696/ - person Loftx; 05.08.2015
comment
Спасибо. Это была не та проблема, с которой я столкнулся. Для меня это была проблема, которая, скорее всего, была вызвана комбинированием предложенного решения с использованием PSExec и TFSDeployer, поэтому PowerShell запускался удаленно третьей стороной, из-за чего что-то терялось при переводе и приводило к нулевому параметру. . Когда я запускал тот же скрипт напрямую, он работал, как и ожидалось. Целью этого инструмента было создание веб-приложения в Visual Studio, а затем использование TFSDeployer для развертывания сборки в определенной среде с удаленной настройкой IIS на основе свойств этой среды. - person paulyphonic; 07.08.2015
comment
Обратите внимание, что это не шифрует пароль, как это делает пользовательский интерфейс. (Я не уверен, что это делает его более безопасным, но я также не уверен, что меня устраивает простой текстовый пароль, находящийся там.) - person jpmc26; 10.03.2017
comment
Этот ответ помог решить проблему, с которой я столкнулся. Я использовал три отдельных вызова Set-ItemProperty (как описано в ответе @vishnu), чтобы попытаться назначить пользовательское удостоверение пулу приложений - по какой-то причине использование синтаксиса "три в одном" -Value заставило его работать. - person Mass Dot Net; 24.12.2019
comment
identitytype=3 означает «Конкретный пользователь». - person Aage; 15.06.2021

После нескольких экспериментов

Вот мой ответ, надеюсь, это поможет, я работал над 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
person vishnu    schedule 30.01.2018
comment
Измененные таким образом пулы приложений терпят неудачу при следующем использовании, и их зависимые веб-приложения останавливаются. Не удалось выполнить эту работу. - person DWRoelands; 13.02.2020

кажется, вы можете сделать это немного более прямо сейчас

appcmd set apppool junkapp /processmodel.password:junkpassword
person mtneagle    schedule 11.09.2020

Я использую powershell v4, в котором нет «ConvertFrom-SecureString», в итоге у меня получилось следующее:

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"
person John Warlow    schedule 09.03.2020