WMI访问UNC路径

时间:2016-05-19 09:26:14

标签: c# windows cmd wmi pushd

我正在开发一个服务器C#应用程序,它通过不同客户端计算机上的本地域网络执行.exe文件。 我选择通过WMI执行此操作,并且当.exe路径是远程计算机的本地路径时,它可以正常工作。在这里和其他论坛中搜索其他线程我已经注意到WMI不支持UNC路径(这是我的问题)。

当我调用下面的方法来执行放置在远程PC桌面上的.exe时,只需正常工作

var execResult = WmiExecuteRemoteProcess("XPSP3", @"C:\Documents and Settings\user1\Desktop\My_Setup.exe", @"domain\user", "mypass");

现在,当我尝试使用UNC路径时,我得到退出代码2

var execResult = WmiExecuteRemoteProcess("XPSP3", @"\\server\shared\My_Setup.exe", @"domain\user", "mypass");

WmiExecuteRemoteProcess方法如下所示:

public bool WmiExecuteRemoteProcess(string remoteComputerName, string arguments, string pUser, string pPassword)
{
    try
    {
        ConnectionOptions connOptions = new ConnectionOptions();
        connOptions.Username = pUser;
        connOptions.Password = pPassword;
        connOptions.Impersonation = ImpersonationLevel.Impersonate;
        connOptions.EnablePrivileges = true;

        ManagementScope manScope = new ManagementScope(string.Format(@"\\{0}\ROOT\CIMV2", remoteComputerName), connOptions);
        manScope.Connect();

        ObjectGetOptions objectGetOptions = new ObjectGetOptions();
        ManagementPath managementPath = new ManagementPath("Win32_Process");

        using (ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions))
        {
            using (ManagementBaseObject inParams = processClass.GetMethodParameters("Create"))
            {
                inParams["CommandLine"] = arguments;
                using (ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null))
                {
                    return (uint)outParams["returnValue"] == 0;
                }
            }
        }
    }
    catch (Exception ex)
    {
        Log.Error(ex.Message);
        return false;
    }
}

鉴于这种情况,我已经决定了"欺骗"它通过解析arguments参数,如下所示:

var args = "cmd.exe /c \"pushd \"\"\\\\server\\shared\"\" && My_Setup.exe && popd\"";
var execResult = WmiExecuteRemoteProcess("XPSP3",args,@"domain\user", "mypass");

我在这里尝试的是使用带有命令pushdpopd的cmd.exe将UNC路径映射到基于网络驱动器的路径,如" Z:\共享&#34 ;.这样,WMI和cmd.exe都不必处理UNC路径。

结果:再次,如果.exe是远程计算机的本地计算机,它运行良好,但在使用UNC路径时,只显示cmd.exe进程。也许它会在内部再次抛出退出代码2,但我无法捕获它,甚至将cmd执行的输出重定向到日志文件。

也许在这种机制方面有经验的人可以对此有所了解。我不想仅为此开发整个服务,或者使用PsExec(也许这是最后的手段)。

如果我遗漏了任何信息,请告诉我。任何评论都将不胜感激。

问候。

编辑:我检查过,这不是对共享文件夹或文件的权限问题。

1 个答案:

答案 0 :(得分:0)

如果有人遇到这个或其他相关问题,我就是这样解决的:

问题不在于WMI无法处理UNC路径,但由于Windows中的安全限制,不允许WMI操作访问网络资源。如果您映射路径并不重要,它只是未经授权。在这种特殊情况下,我最终得到的解决方法是将setup.exe复制到远程计算机中的临时文件夹,最后通过访问其本地路径来执行它,就像我以前一样。

var execResult = WmiExecuteRemoteProcess("XPSP3", @"C:\temp_folder\My_Setup.exe", @"domain\user", "mypass");