【问题标题】:How to specify application pool identity user and password from PowerShell如何从 PowerShell 指定应用程序池身份用户和密码
【发布时间】:2014-02-20 07:46:32
【问题描述】:

在自动设置 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 服务器后失败,需要人工干预。

我错过了什么吗?

【问题讨论】:

  • 我认为,如果您使用 powershell 检查它,您实际上可以验证在 processmodel 对象上设置的密码。试试 get-itemproperty 'IIS':\AppPools\myapppoolnamehere' "ProcessModel"
  • 太好了,谢谢。现在至少我可以验证它对密码的实际作用。希望这能让我更接近解决方案。
  • 我已确认密码实际上设置正确。因此,唯一可能的结论是,这要么是某种重复的用户错误,要么是当您在 UI 中手动指定密码而不是在 PowerShell 中使用 Web 管理模块时,IIS 在幕后做了其他事情。基本症状是,在运行我的 Web 应用程序的部署后,应用程序池在第一次被命中时失败并停止。然后手动重新输入相同的密码即可解决问题。
  • 事实证明,这整个事情都是一个红鲱鱼。密码输入不正确的原因是我没想到的。当我从 PowerShell 控制台运行时,脚本运行正确,但在我的实际脚本中,我从文件中获取加密密码,然后使用注册表中的密钥对其进行解密,所有这些都是使用 PSExec 远程调用的。当我在 PowerShell 中运行时,它被正确解密,但是当我通过 PSExec 执行时,同一用户无法从注册表访问密钥,因此无法解密密码并错误地设置它。
  • 不幸的是,我无法重现我在上面所做的 PSExec 声明,并且手动运行 PSExec 我肯定可以读取机器(相同机器,相同帐户)上的注册表,因此搜索继续。一旦获得所需的详细信息,我可能会关闭或编辑问题,甚至可以提出正确的问题。 :(

标签: iis powershell iis-7 powershell-3.0 web-administration


【解决方案1】:

看来你现在可以更直接一点了

appcmd set apppool junkapp /processmodel.password:junkpassword

【讨论】:

    【解决方案2】:

    我在没有“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】:

      你可以这样做:

      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

      【讨论】:

      • 这个答案确实已经是问题的一部分。我已经在设置用户名和密码了。如上面的 cmets 中所述,实际问题是运行代码正确设置了密码,但在我的特定情况下运行时却没有设置密码,即 TFSDeployer 调用 PowerShell 调用 PSExec 调用 PowerShell。这里有些东西丢失了。我已经在另一家公司担任了不同的角色,并且不太可能再回到这个问题并找出导致它的原因,所以我希望它可以为某人提供一些使用。
      • 在没有Import-Module WebAdministration 的情况下使用此答案将导致Set-ItemProperty : Cannot find drive. A drive with the name 'IIS' does not exist. 错误。根据stackoverflow.com/questions/24392696/…
      • 谢谢。这不是我遇到的问题。对我来说,这很可能是由于将提议的解决方案与 PSExec 和 TFSDeployer 的使用相结合而引起的,因此 PowerShell 由第三方远程运行,这导致翻译中丢失了某些内容并导致参数为空.当我直接运行相同的脚本时,它按预期工作。该工具的目的是在 Visual Studio 中构建 Web 应用程序,然后使用 TFSDeployer 将构建部署到特定环境,根据该环境的属性远程配置 IIS。
      • 请注意,这不会像通过 UI 那样加密密码。 (我不确定这是否使它更安全,但我也不确定我是否对坐在那里的纯文本密码感到满意。)
      • 这个答案帮助解决了我遇到的问题。我正在使用三个单独的 Set-ItemProperty 调用(如@vishnu 的回答所述)来尝试将自定义标识分配给应用程序池 - 无论出于何种原因,使用三合一 -Value 语法让它工作。
      【解决方案4】:

      经过几次实验

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

      【讨论】:

      • 以这种方式修改的应用程序池在下次使用时会失败,并且其依赖的 Web 应用程序停止。无法完成这项工作。
      猜你喜欢
      • 2019-08-18
      • 1970-01-01
      • 2016-11-10
      • 2011-06-30
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2018-04-29
      • 2021-12-16
      相关资源
      最近更新 更多