【发布时间】:2013-11-19 16:44:37
【问题描述】:
我正在尝试远程调用目标计算机上的可执行文件,该可执行文件位于 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 的命令确实可以正常工作。有趣的语法是 InstallShield 的静默安装开关的产物。另请注意,如果我使用双反斜杠或反引号转义反斜杠,我会得到未找到路径,因此我认为这不是转义问题。
编辑:虽然不是完全相同的问题,但我确实检查了此处描述的 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 的批处理文件式 hack。这是我唯一真正的选择吗?
【问题讨论】:
标签: c# powershell wmi win32-process