【问题标题】:Running a powershell script from a application pool user elevated priv从应用程序池用户提升权限运行 powershell 脚本
【发布时间】:2021-01-09 03:47:57
【问题描述】:

我有一个困扰我的特定场景,希望社区提供一些见解。

我正在尝试通过在其自己的应用程序池标识上运行的 Web 应用程序运行添加 HTTPS 绑定和指向证书 PowerShell 脚本的链接。

PowerShell 脚本需要提升的权限,因此无法成功运行,只能访问绑定部分,而不是 SSL 证书的链接。

我无法调用以使用我的代码运行已保存的脚本文件,因为绑定是动态生成的,并且需要 Web 应用程序替换保存绑定的令牌。

如果下面的脚本是通过当前正在运行它的应用程序池身份用户的 Web 应用程序运行的,我如何才能成功运行它?我尝试使用提升标签包含我的脚本,但它会触发一个新的提升的单独 PowerShell 窗口,这对我不起作用,因为这一切都是在没有用户的情况下自动发生的。

New-WebBinding -name "example.domain" -IPAddress "XXX.XXX.XXX.XXX" -Protocol https -HostHeader [DynamicallyLoadedViaWebApplication] -Port 443 -SslFlags 1
$siteName = 'example.domain'
$Cert = (get-item cert:"\LocalMachine\WebHosting\THUMBPRINTHERE")
$binding = Get-WebBinding -Name $siteName -Protocol "https"
$binding.AddSslCertificate($Cert.GetCertHashString(), "WebHosting")

我尝试通过注册表关闭 UAC,但没有帮助。上面的脚本必须通过具有足够高权限的 web 应用程序运行才能成功完成


更新:

第一个要触发的脚本是通过application pool identity 而不是管理员帐户完成的,这种方法可行吗?我最终可以尝试将application pool user 切换为管理员,但如果可能的话,我想避免这种情况。或者关于如何通过application pool 用户进行绑定的任何其他想法?

【问题讨论】:

  • 为什么不能将它作为保存的脚本运行?您可以将生成的标头作为参数传递。
  • @DougMaurer 你有任何链接或示例说明我如何做到这一点吗?
  • 这是您需要经常做的事情吗?

标签: powershell application-pool iis-10 windows-server-2019


【解决方案1】:

对于遇到类似问题的任何人,我已经接受了 Doug Maurer 的回答,因为他的方法确实有效,但在我的特定情况下,它并没有解决我的问题,所以如果它对任何人有帮助,我会发布。

由于我的网站正在执行 PowerShell 命令,因此无论使用何种方法,它都无法提升,除非其他人有更好的方法,我不知道。

我最终恢复为让我的 Web 应用程序简单地运行绑定和 SSL 链接脚本本身,而不引用磁盘上的任何脚本文件。

IE:

New-WebBinding -name "example.domain" -IPAddress "XXX.XXX.XXX.XXX" -Protocol https -HostHeader [DynamicallyLoadedViaWebApplication] -Port 443 -SslFlags 1
    $siteName = 'example.domain'
    $Cert = (get-item cert:"\LocalMachine\WebHosting\THUMBPRINTHERE")
    $binding = Get-WebBinding -Name $siteName -Protocol "https"
    $binding.AddSslCertificate($Cert.GetCertHashString(), "WebHosting")

如果您保持网站的应用程序池默认设置,这样做会失败。我最终在服务器上创建了一个新的本地用户,并使该用户成为Administrators 组的一部分,然后将网站切换为application-pool 以作为这个新创建的用户帐户运行。我必须重新启动机器才能真正生效和工作,如果你只是这样做而不重新启动它仍然会失败,至少对我来说是这样。

【讨论】:

    【解决方案2】:

    将此保存在用户帐户有权访问的位置。对于本例,我将其命名为 sslscript.ps1 并将其保存到 c:\temp

    @'
    Param($data)
    Start-Process powershell -ArgumentList @"
    New-WebBinding -name "example.domain" -IPAddress "XXX.XXX.XXX.XXX" -Protocol https -HostHeader $data -Port 443 -SslFlags 1
    $siteName = 'example.domain'
    $Cert = (get-item cert:"\LocalMachine\WebHosting\THUMBPRINTHERE")
    $binding = Get-WebBinding -Name $siteName -Protocol "https"
    $binding.AddSslCertificate($Cert.GetCertHashString(), "WebHosting")
    "@ -Verb runas
    '@ | Set-Content c:\temp\sslscript.ps1 -Encoding UTF8
    

    像这样从您的应用程序中调用它

    c:\temp\sslscript.ps1 [DynamicallyLoadedViaWebApplication]
    

    这是一个可以作为概念验证运行的小测试。这将调用 UAC,因此这可能是我能预见的唯一问题。如果这是一个问题,那么也许您可以将动态创建的信息保存到文件中,然后以管理员身份运行计划任务并让它获取信息。

    @'
        Param($data)
        Start-Process powershell -ArgumentList @"
        write-host Argument passed in: $data -foregroundcolor cyan
        `$isadmin = [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match 'S-1-5-32-544')
        if(`$isadmin)
        {
            write-host script is 'running as admin' -foregroundcolor green
        }
        else
        {
            write-host script is not 'running as admin' -foregroundcolor red
        }
        pause
    "@ -Verb runas
    '@ | Set-Content c:\temp\testscript.ps1 -Encoding UTF8
    
    C:\temp\testscript.ps1 "passing in some data"
    

    输出应该是这样的

    【讨论】:

    • 感谢您的详细帖子,我将对此进行测试,看看它是否最终能正常工作!
    • 我能够通过我的应用程序成功启动脚本。我不得不关闭 UAC,但它似乎没有写我的绑定。我在跑步 (L:\mydrive\mypub\sslscript.ps1 subdomain.domain.com)
    • 是的,它可能没有提升。您需要多久执行一次此操作?如果它不常见,请让脚本将您需要的动态信息输出到文件中。然后以交互方式运行或作为计划任务运行。 apppool 的用户是在那个盒子上作为本地管理员运行的吗?
    • 如果一切按计划进行,每小时会发生多次。 IIS 中的标识显示ApplicationPoolIdentity 我没有更改任何内容,因为它是在最初将我的站点添加到 IIS 时创建的。似乎第二个脚本永远不会运行。
    猜你喜欢
    • 2021-06-22
    • 2014-07-15
    • 2021-04-17
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多