Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iis 如何从PowerShell指定应用程序池标识用户和密码_Iis_Powershell_Iis 7_Powershell 3.0_Web Administration - Fatal编程技术网

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

Iis 如何从PowerShell指定应用程序池标识用户和密码,iis,powershell,iis-7,powershell-3.0,web-administration,Iis,Powershell,Iis 7,Powershell 3.0,Web Administration,我一直很难自动化Web应用程序的设置,也很难用应用程序池标识适当地配置IIS。我是在PowerShell中编写的Web应用程序部署脚本中执行此操作的。我的要求是需要PowerShell脚本将应用程序池标识用户设置为特定的服务帐户mydomain\svcuser和密码。以下是示例代码: $pool = New-Item "IIS:\AppPools\MyAppPool" -Force $svcuser = "mydomain\svcuser" $pool.processModel.userName

我一直很难自动化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服务器后失败,需要手动干预


我在这里遗漏了什么吗?

您可以按如下方式进行操作:

Import-Module WebAdministration
Set-ItemProperty IIS:\AppPools\app-pool-name -name processModel -value @{userName="user_name";password="password";identitytype=3}
请参阅此处的文档以获取解释,以及您将在以下位置运行应用程序池的用户类型的标识类型numeric的参考:

这是我的答案,我希望这会有所帮助,我已经在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

我在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"

看来你现在可以更直接地做这件事了

appcmd set apppool junkapp /processmodel.password:junkpassword

我认为,如果使用powershell检查processmodel对象上设置的密码,您实际上可以对其进行验证。只需尝试获取itemproperty'IIS':\AppPools\myapppoolnamehere'ProcessModel'很好,谢谢。现在,至少我可以验证它对密码的实际操作。希望这能让我更接近解决方案的路径。我已经确认密码设置正确。因此,唯一可能的结论是,这要么是某种类型的重复用户错误,要么是当您在UI中手动指定密码时,IIS在幕后执行其他操作,而不是在PowerShell中使用Web管理模块。基本症状是,在运行Web应用程序的部署后,应用程序池会失败,并在第一次被命中时停止。然后手动重新输入相同的密码解决了问题。事实证明,这整件事都是骗人的。密码输入不正确的原因是我没有预料到的。当我从PowerShell控制台运行时,脚本运行正常,但在我的实际脚本中,我从文件中获取加密密码,然后使用注册表中的密钥对其进行解密,所有这些都是使用PSExec远程调用的。当我在PowerShell中运行时,它被正确地解密,但当我在PSExec上执行此操作时,同一用户无法从注册表访问密钥,因此无法解密密码并错误地设置密码。不幸的是,我无法重现我在上面所做的PSExec声明,手动运行PSExec我肯定可以读取计算机上的注册表(同一台机器,同一个帐户)所以搜索还在继续。一旦我得到了所需的详细信息,我可能会关闭或编辑该问题,甚至可以问正确的问题(这个答案实际上已经是问题的一部分。我已经设置了用户名和密码。正如上面的评论中所记录的,实际的问题是运行代码正确设置了密码,但在我的特殊情况下运行时却没有设置密码,即TFSDeployer调用PowerShell调用PSExec调用PowerShell。有些事情得到了l。)ost在这里。我已经在另一家公司换了一个不同的角色,我不太可能再回到这个问题上来并找出它的原因,所以我希望它能为其他人提供一些有用的东西。如果不使用
Import Module WebAdministration
,使用这个答案将导致
Set ItemProperty:找不到驱动器。名为“IIS”的驱动器不存在。
错误。根据,谢谢。这不是我遇到的问题。对我来说,这很可能是由于将建议的解决方案与PSExec和TFSDeployer的使用相结合而导致的问题,因此PowerShell由第三方远程运行,这导致translati中的某些内容丢失在上,并导致一个空参数。当我直接运行同一脚本时,该脚本按预期工作。该工具的用途是在Visual Studio中生成Web应用程序,然后使用TFSDeployer将生成部署到特定环境,根据该环境的属性远程配置IIS。请注意,这不会加密password喜欢通过UI进行操作。(我不确定这是否会使它更安全,但我也不确定我是否对放在那里的纯文本密码感到满意。)这个答案帮助解决了我遇到的问题。我使用了三个单独的Set-ItemProperty调用(如@vishnu的答案所述)尝试将自定义标识分配给应用程序池--无论出于何种原因,使用三位一体的
-Value
语法都可以使其正常工作。以这种方式修改的应用程序池在下次使用时失败,并且其依赖的web应用程序停止。无法使其正常工作。