我在 2 台 Windows 2016 服务器上拥有同一帐户的管理员。 Server1 有此文件夹文件:'E:\Temp\ZEBRA_1.dat'
如果我在 Server1 上打开 PowerShell(v4 或 v5)(以管理员身份)并运行这行代码,一切都会按预期工作(打印机设置通过 .dat 文件更新):
start-process -Verb runas -filepath "C:\Windows\System32\RUNDLL32.EXE" -argumentlist "PRINTUI.DLL,PrintUIEntry /Sr /n `"ZEBRA_1`" /a `"E:\Temp\ZEBRA_1.dat`" 2 7 c d g u"
如果我随后在 Server2 上打开 PowerShell(以管理员身份)并输入包含在 Invoke-Command 中的相同代码,则代码看起来会运行(没有错误),但是当我检查 Server1 时 - 没有进行任何更改:
Invoke-Command -ComputerName 'Server1' -ScriptBlock {
start-process -Verb runas -filepath "C:\Windows\System32\RUNDLL32.EXE" -argumentlist "PRINTUI.DLL,PrintUIEntry /Sr /n `"ZEBRA_1`" /a `"E:\Temp\20231013135820\ZEBRA_1.dat`" 2 7 c d g u"
}
我尝试将
Start-process
块包裹在 New-PSSession
到 Server1 中,但这也不起作用。在 -Credential
arg 中使用我的管理员凭据也不适用于 Invoke-Command。
如果我搞乱了“s,那么我会收到错误或没有响应,如果我将文件放在 Server2 上并使用 UNC 路径,它仍然无法在 Server2 上工作(但它仍然可以在 Server1 上工作)。
我认为这是与 RunAs Admin 相关的问题,因为如果该命令没有在 Server1 上以管理员身份运行,它看起来好像也没有执行任何操作。
如何使用该 .DAT 文件远程更新打印机?
在
远程
-Verb RunAs
中使用
Start-Process
是毫无意义的,但通常是良性的:
默认情况下,仅允许管理员进行远程调用,并且他们的远程会话总是以提升权限运行(具有管理权限),因此-Verb RunAs
既没有必要,也没有任何效果。
非管理员运行远程命令的异常情况下,按需提升无法工作,因为在远程会话中无法显示UAC对话框,该会话运行于不可见。
Start-Process
。
direct调用应该可以(但不是下面额外的、与网络相关的问题):C:\Windows\System32\RUNDLL32.EXE ...
Start-Process
,则必须使用其
-Wait
开关来确保命令在
Invoke-Command -ComputerName ...
调用返回之前完成,否则启动的进程可能会在有机会之前被终止完成。
Doug Maurer指出的那样,您可能遇到了臭名昭著的双跳问题,这会阻止您远程运行的命令访问网络资源。
此答案,了解解决该问题的一种方法,即通过将凭据显式传递到远程会话,远程会话可以使用它们建立到网络资源的(临时)驱动器映射。
这篇博文中提出的解决方案,其中涉及在目标计算机上创建具有固定域用户身份的会话配置;然而,这种方法: