gpt4 book ai didi

c# - 从 WMI 运行 exe 时的网络身份验证

转载 作者:可可西里 更新时间:2023-11-01 08:48:29 26 4
gpt4 key购买 nike

我有一个 C# exe 需要使用 WMI 运行并访问网络共享。但是,当我访问共享时,我得到一个 UnauthorizedAccessException。如果我直接运行 exe,共享是可以访问的。我在这两种情况下都使用相同的用户帐户。

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

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

WMI 调用中指定的用户和登录远程桌面 session 的用户相同,因此权限应该相同,不是吗?

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

ConnectionOptions opts = new ConnectionOptions();

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

ManagementPath path = new ManagementPath(string.Format("\\\\{0}\\root\\cimv2: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();

关于c# - 从 WMI 运行 exe 时的网络身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com