运行 来自应用程序池用户提升权限的 powershell 脚本

Running a powershell script from a application pool user elevated priv

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

我正在尝试 运行 添加 HTTPS 绑定 & link 通过网络应用程序来证书 PowerShell 脚本,该应用程序 运行 宁其自己的应用程序池身份。

PowerShell 脚本需要更高的权限,因此它无法 运行 成功,只能到达绑定部分,而不是 link SSL 证书。

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

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

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 用户进行绑定的任何其他想法?

将其保存在用户帐户有权访问的位置。对于此示例,我将其命名为 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"

输出应该是这样的

对于遇到类似问题的任何人,我接受了 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 切换为 运行 作为这个新创建的用户帐户。我必须重新启动机器才能真正生效并工作,如果你只是这样做而不重新启动它仍然会失败,至少它对我来说是这样。