繁体   English   中英

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

[英]Powershell Running Command Line as Admin User

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

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

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

无论您是使用 Kerberos(没有适当的委派或CredSSP )还是 NTLM(因为 NTLM 无法转发令牌)作为身份验证方案,您都可以通过将凭证信息传递到Invoke-Command并在该脚本块中构建凭证来解决此问题,并使用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 或接受用户名和密码 arguments 的任何命令

    • 将凭证参数直接传递给 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参数或用户名/密码 arguments 的 Function 或 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM