运行 以管理员身份在远程计算机中调用命令

Run Invoke-Command in remote computer as administrator

我正在尝试 运行 调用命令在 remote computer 上启动 powershell script in a powershell file。我正在使用 credentials for a user with Administrator privilege。命令需要被running powershell as an administrator执行。我尝试使用 powershell 脚本调用的应用程序存在许可问题,因此我无法将凭据更改为管理员,但需要 运行 与该特定用户本身。我尝试在 Invoke-Command 的末尾使用 -RunAsAdministrator,但我收到一条错误消息:

Invoke-Command : Parameter set cannot be resolved using the specified named parameters.

$command = {
    cd Folder
    C:\Folder\build.ps1
} 
Invoke-Command -ComputerName $RemoteSystemIP -ScriptBlock $command -credential $Credentials1 -ErrorAction Stop -AsJob

我正在尝试将其作为后台作业执行,这就是我添加 -AsJob 参数的原因。

好几天了,还没找到解决办法

我认为你应该这样做:

$command = {
    Start-Process "powershell" -Verb runas -Workingdirectory "C:\Folder\" -ArgumentList "build.ps1"
}

Invoke-Command -ComputerName $RemoteSystemIP -ScriptBlock $command -credential $Credentials1 -ErrorAction Stop -AsJob

tl;dr

  • 让远程 PowerShell 会话执行提升(具有管理员权限)的唯一方法是连接具有管理员权限的用户帐户(隐式或通过 -Credential)目标机器。

  • 使用这样的帐户,会话会自动且总是提升运行。


Invoke-Command-RunAsAdministrator开关只能用于(虚拟化)容器-ContainerId 参数),不是常规远程处理(-ComputerName 参数)。

无法在远程会话中按需提升(您可以本地交互Start-Process -Verb RunAs).[1]

相反,您必须确保您传递给 Invoke-Command -Credential 的凭据 以连接到远程计算机,并引用一个用户帐户(也) 在目标机器上具有管理权限,在这种情况下,远程会话自动且总是运行提升(具有管理员权限)。 [2]

如果你不能通过这样的凭据,我认为你运气不好。


测试当前用户是否有管理权限:

# Returns $true if elevated, otherwise $false.
[Security.Principal.WindowsPrincipal]::new(
  [Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)

利用 net session 的简单快捷方式仅在提升时成功:

# Returns $true if elevated, otherwise $false.
[bool] (net session 2>$null)

[1] 除非会话已经 提升,-Verb RunAs 会显示一个弹出式 UAC 对话框,用户必须以交互方式确认,这在远程会话中不受支持。

[2] 如果您使用“环回远程处理”,这同样适用,即如果您通过远程处理将 local 机器作为目标,使用 Invoke-Command -ComputerName . ,例如,有额外的限制,但是:您不能使用被授权进行远程处理但不属于本地 Administrators 组的用户,并且如果您使用 current 用户(无论是否具有显式凭据),调用 会话本身必须被提升。