Win32_Process.Create()可以启动本地文件,但不能启动网络文件

时间:2013-11-07 20:31:48

标签: c# powershell wmi win32-process

我正在尝试远程调用目标计算机上的可执行文件,可执行文件位于UNC网络路径上。我使用Win32_Process.Create方法来执行此操作。我可以使用此方法启动本地存储在C:驱动器上的文件,但是当我尝试从UNC路径启动文件时,我得到返回值2 Access Denied。我确信路径是正确的,因为如果我将它改为虚假路径,我会得到返回值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的命令DOES工作正常。有趣的语法是InstallShield的静默安装开关的工件。另请注意,如果我使用双反斜杠或反引号来逃避反斜杠,我会找到Path Not Found,所以我认为这不是一个逃避问题。

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

编辑#2:我发现其他人遇到了类似的问题: Win32_Process Create method. Trying to copy a file from a remote machine to a remote machine同样,这是一个批处理文件 - 是黑客在远程系统上启动Net Use。这是我唯一真正的选择吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我问了一些对WMI更有知识的PowerShell MVP并得到了响应,除非远程机器是域控制器,否则你将无法做到。但是,如果您可以使用PowerShell远程处理远程访问具有-Authentication CredSSP的计算机,则可以将Invoke-WmiMethod与网络路径一起使用。理查德·西达威(Richard Siddaway)做了write up on this,可能对细读有用。