加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从WMI运行exe时的网络认证

发布时间:2020-12-15 03:42:36 所属栏目:百科 来源:网络整理
导读:我有一个需要使用WMI运行并访问网络共享的C#exe.但是,当我访问该共享时,我得到一个UnauthorizedAccessException.如果我直接运行exe,可以访问该共享.在这两种情况下,我都使用相同的用户帐户. 我的应用程序有两个部分,一个在本地PC上运行的GUI客户端和在远程PC
我有一个需要使用WMI运行并访问网络共享的C#exe.但是,当我访问该共享时,我得到一个UnauthorizedAccessException.如果我直接运行exe,可以访问该共享.在这两种情况下,我都使用相同的用户帐户.

我的应用程序有两个部分,一个在本地PC上运行的GUI客户端和在远程PC上运行的后端进程.当客户端需要连接到后端时,首先使用WMI启动远程进程(代码如下).远程进程执行了许多操作,包括使用Directory.GetDirectories()访问网络共享并将其报告回客户端.

当客户端使用WMI自动启动远程进程时,无法访问网络共享.但是,如果我使用远程桌面连接到远程计算机并手动启动后端进程,则访问网络共享成功.

在WMI呼叫中指定的用户和远程桌面会话登录的用户是一样的,所以权限应该是一样的,不是吗?

我在MSDN条目中看到Directory.Exists(),它指出“Exists方法不执行网络身份验证.如果您查询现有的网络共享而不进行预认证,则Exists方法将返回false.我假设这是相关的?如何确保用户在WMI会话中正确验证?

ConnectionOptions opts = new ConnectionOptions();

opts.Username = username;
opts.Password = password;

ManagementPath path = new ManagementPath(string.Format("\{0}rootcimv2:Win32_Process",remoteHost));

ManagementScope scope = new ManagementScope(path,opts);

scope.Connect();

ObjectGetOptions getOpts = new ObjectGetOptions();
using (ManagementClass mngClass = new ManagementClass(scope,path,getOpts))
{
    ManagementBaSEObject inParams = mngClass.GetMethodParameters("Create");
    inParams["CommandLine"] = commandLine;
    ManagementBaSEObject outParams = mngClass.InvokeMethod("Create",inParams,null);
}

解决方法

遵循以上Isalamon建议的链接(感谢)我遵循Jestro的建议,并使用psexec.exe(可以从 http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx下载)而不是WMI重写.感觉像这样一个肮脏的做法,但它似乎工作.

遇到类似问题的任何人的新代码:

Process proc = new Process();
proc.StartInfo.FileName = "PsExec.exe";
proc.StartInfo.Arguments = string.Format("\{0} -d -u {1}{2} -p {3} {4}",remoteHost,domain,username,password,commandLine);
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读