Powershell 以管理员用户身份运行命令行

Posted

技术标签:

【中文标题】Powershell 以管理员用户身份运行命令行【英文标题】:Powershell Running Command Line as Admin User 【发布时间】:2021-12-29 19:30:59 【问题描述】:

所以我有自动化以一个用户身份登录到 Windows Server 2019 机器,但随后需要运行命令(Invoke-AdminCommand 是特定于应用程序的,而不是内置的 Windows cmdlet)管理员用户(我不想将登录用户添加为管理员)。我已经按照这里的答案(如果您认为这是一个重复的问题)并且没有一个有效。在脚本中,我做了一个“whoami”来确保会话是正确的用户,而且确实如此。但是该命令会返回一个特定于应用程序的错误,说明用户没有正确的权限。如果我 RDP 进入与管理员用户相同的机器并通过 Powershell CLI 运行相同的命令 - 它工作正常。

$username = "domain\adminUser"
$password = "**********" | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username,$password
$s = New-PSSession -credential $cred
$sc = 
    whoami
    Invoke-AdminCommand -Register -Verbose

Invoke-Command -Session $s -Scriptblock $sc
Remove-PSSession $s

【问题讨论】:

即使您以adminuser 身份运行命令,会话也不会提升。 这可能会帮助你ss64.com/ps/syntax-elevate.html 如果您询问是否可以在不引发 UAC 提示的情况下提升命令,那么答案是否定的(这是设计使然)。 用户不需要被提升。第三方应用程序将用户作为应用程序的管理员,而不是 Windows 管理员组,而是第三方管理员组 我想我不明白你的用例。为什么不在需要的用户登录时运行命令? 【参考方案1】:

您可能遇到了双跳问题。您正在远程连接到另一台服务器以运行另一个本身需要身份验证的命令。如果您不能依靠 CredSSP(安全风险)或适当的帐户授权(可能需要大量开销来维持大量授权,但这是正确的方法)。

注意:基本身份验证也可以解决此问题,但我非常不推荐在没有 at 的情况下使用基本身份验证至少 设置 WinRM over SSL 并删除非 HTTPS WinRM 侦听器。

无论您是使用 Kerberos(没有适当的委派或 CredSSP)还是 NTLM(因为 NTLM 无法转发令牌)作为身份验证方案,您都可以通过将凭据信息传递给 @987654321 来解决此问题@ 并在该脚本块中构建凭据,并使用 Start-Process 以其他用户身份启动它。请注意,如果您需要提升 UAC,则代码会有所不同,并且此代码仅在您不需要需要 UAC 提升时才有效:

# We will create the SecureString inside the Invoke-Command block
$password = "********"

# Use of a Disctionary instead of positional arguments and `param` in the block
# is a little trick you can use here.
Invoke-Command -Session $s -ArgumentList @ Username = $username; Password = $password  
  $cred =
    [PSCredential]::new($args.Username, ( $args.Password | ConvertTo-SecureString -AsPlainText -Force ))

  # Placeholder for next part

所以这是你想要的样板。您将凭据发送到远程服务器并在那里构建它。您如何在# Placeholder for next part 执行此操作将取决于您正在运行的具体内容:

外部命令(可执行)

使用Start-Process 以其他用户身份运行程序
Start-Process -Wait -Credential $cred program.exe -ArgumentList "arguments to the program here"

任何接受 -Credential 参数的 cmdlet 或任何接受用户名和密码参数的命令

将凭据参数直接传递给 cmdlet/函数,或将$args.Username$args.Password 直接传递给具有用户名/密码参数的外部命令。然而,以下示例通过 cmdlet 和 -Credential 参数来举例说明。
# Note that some cmdlets don't take a credential for whatever reason
# and may have -Username and -Password arguments instead.
Invoke-AdminCommand -Credential $cred -Register -Verbose

任何不接受 -Credential 参数或用户名/密码参数的函数或 Cmdlet

这与第一个示例类似,但此示例专门针对您想要的代码作为另一个用户运行一些 PowerShell 代码。
# This can be invoked without splatting but am using splatting for readability
$spArgs = @
  Credential = $cred
  FilePath = 'powershell.exe' # You can use `pwsh.exe` for PS Core if necessary
  ArgumentList = "-Command ""exampleProgram.exe -username $($args.Username) -password $($args.Password)"""
  Wait = $true
  NoNewWindow = $true

Start-Process powershell.exe 

【讨论】:

如果重要的话,该命令将在同一台机器上运行 那你为什么在 PS 会话中使用 Invoke-Command?这些是用于远程运行的。我明天会更新这个答案(现在在移动设备上),但你应该可以使用我的答案中的一个 Start-Process 示例,不需要 PS Session 或 Invoke-Command。 尝试了 Start-Process(可能是错误的)并且没有运气,因此作为我需要的用户使用 Session 转移到 Invoke-Command。

以上是关于Powershell 以管理员用户身份运行命令行的主要内容,如果未能解决你的问题,请参考以下文章

如何以管理员身份运行powershell

用于检查应用程序是不是以提升的权限运行的 PowerShell 命令

哪些注册表命令允许我从包含撇号的文件夹的右键单击上下文菜单中以管理员身份运行 PowerShell 5 / CMD?

怎么在powershell里面运行cmd命令

powershell 通过Powershell禁用/启用Hyper-V(“以管理员身份运行”)

以管理员用户身份重新启动 PowerShell 脚本