1

我正在尝试远程调用目标计算机上的可执行文件,该可执行文件位于 UNC 网络路径上。我正在使用该Win32_Process.Create方法来执行此操作。我可以使用此方法启动本地存储在 C: 驱动器上的文件,但是Access Denied当我尝试从 UNC 路径启动文件时,我得到 Return Value 2, 。我确信路径是正确的,因为如果我将其更改为虚假路径,我会得到 Return Value 9, Path Not Found

在 Powershell 中,我invoke-wmimethod用来调用 Win32_Process 的 Create 方法并传递一个credential在目标系统上具有管理权限并在 UNC 路径上具有读取权限的对象。在 C# 中,我使用ConnectionOptions相同的凭据进行模拟。两种情况下的结果是相同的。

我也尝试过使用各种方法(CIM_DataFile,远程调用 XCopy)首先在本地复制 EXE 文件。这些方法都没有奏效。我想直接从文件服务器复制到目标系统,而不先将文件拉到应用程序服务器,因为应用程序服务器与大多数目标系统不在同一个数据中心,因此会拉下一个大文件WAN 两次,速度慢且不可靠。我发现的一个选择是使用 FTP,但我认为这是最后的手段。

我还可以使用 PSExec 和相同的凭据从 UNC 路径远程调用 EXE,但我想避免从我的 Web 应用程序中调用 PSExec。我知道如果这是我必须做的,它会起作用,我已经多次使用 PSExec 来解决这样的问题,但我真的想在应用程序中完成这一切,而不是使用外部程序来破解它。

当 EXE 位于 UNC 路径上时,有什么方法可以使用 Win32_Process 在远程计算机上启动 EXE?这可能是组策略问题,其中 WMI 启动的进程无权从网络位置调用 EXE?我没有想法,也没有搜索词。

Powershell 代码示例。这有效:

$launchproc = Invoke-WmiMethod -ComputerName $compName -Class Win32_process -Name Create -ArgumentList "c:\temp\installer.exe /s /f1c:\temp\installer.iss" #-Credential $adminCreds

这不会:

$launchproc = Invoke-WmiMethod -ComputerName $compName -Class Win32_process -Name Create -ArgumentList "\\fileserver\share\installer.exe /s /f1\\fileserver\share\installer.iss" -Credential $adminCreds

请注意,如果我从命令窗口以交互方式在本地发出命令,则基于 UNC 的命令确实可以正常工作。有趣的语法是 InstallShield 的静默安装开关的产物。另请注意,如果我使用双反斜杠或反引号转义反斜杠,我会得到未找到路径,所以我不认为这是一个转义问题。

编辑:虽然不是完全相同的问题,但我确实检查了此处描述的 GP 权限:WMI Win32_Process.Create failed with Insufficient Privs并且我确实正确设置了这些权限。

编辑#2:我发现其他人也有类似的问题: Win32_Process Create 方法。尝试将文件从远程机器复制到远程机器这又是一个批处理文件式的黑客攻击,在远程系统上启动 Net Use。这是我唯一真正的选择吗?

4

2 回答 2

0

我询问了一些更了解 WMI 的 PowerShell MVP,得到的答复是,除非远程计算机是域控制器,否则您将无法执行此操作。但是,如果您可以使用 PowerShell 远程处理远程到计算机-Authentication CredSSP,那么您可以将 Invoke-WmiMethod 与网络路径一起使用。Richard Siddaway 对此做了一篇文章,可能对细读有用。

于 2013-11-08T17:01:00.910 回答
0

最后,我只是在 C# 中使用 System.Diagnostics.Process() 调用了 PsExec。这不是我想要的解决方案,但我无法进行其他任何工作,虽然我不喜欢使用外部 EXE,但它确实相对简单。

于 2013-11-08T15:35:08.043 回答