【问题标题】:WMI access to UNC pathsWMI 访问 UNC 路径
【发布时间】:2016-05-19 09:26:13
【问题描述】:

我正在开发一个服务器 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");

我在这里尝试使用 cmd.exe 和命令 pushdpopd 将 UNC 路径映射到基于网络驱动器的路径,例如“Z:\shared”。这样 WMI 和 cmd.exe 都不必处理 UNC 路径。

结果:同样,如果 .exe 是远程机器本地的,它工作得很好,但是当使用 UNC 路径时,只出现 cmd.exe 进程。也许它在内部再次抛出退出代码 2,但我无法捕捉它,甚至将 cmd 执行的输出重定向到日志文件。

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

如果我缺少任何信息,请告诉我。任何 cmets 将不胜感激。

问候。

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

【问题讨论】:

  • var args = "cmd.exe... 的字符串是否需要@-quoted?
  • 不,事实上 @ 会使命令在 cmd 中执行时失败。我使用了双 \\ 和 \" 因为我需要将它们解析为 cmd 命令,而不是由编译器解释
  • 如果在您的环境中建议使用该目录,您可以映射该目录。 net use 将为您提供帮助。
  • 这是我尝试使用pushd 的第一件事,它与net use 基本相同,但没有奏效。正如我在回复中发布的那样,即使您将路径映射到驱动器号,它也不起作用,资源仍然在网络中,并且不允许 WMI 访问它们。

标签: c# windows cmd wmi pushd


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多