运行 以管理员身份在远程计算机中调用命令
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 用户(无论是否具有显式凭据),调用 会话本身必须被提升。
我正在尝试 运行 调用命令在 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 用户(无论是否具有显式凭据),调用 会话本身必须被提升。