我有以下功能用于连接到远程客户端计算机并在其上运行可执行文件。
我是通过本网站的回复复制的,但是不再提供该链接,所以我不确定是谁给予赞誉。
public static void ConnectToRemoteClient(string client_machine, string user, string password, string target_exe )
{
var connection = new ConnectionOptions();
// The '.\' is for a local user on the remote machine
// or 'mydomain\user' for a domain user
connection.Username = user;
connection.Password = password;
object[] theProcessToRun = { target_exe };
var wmiScope = new ManagementScope($@"\\{client_machine}\root\cimv2", connection);
wmiScope.Connect();
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
managementClass.InvokeMethod("Create", theProcessToRun );
}
}
使用以下语法调用它:
string exe = string.Format("taskkill.exe {0} {1}", @"/F", @"/PID 8704");
ConnectToRemoteClient("ClientMachine", @"Domain\Username", @"password", exe);
它适用于远程客户端计算机上存在的可执行文件。
但是,我想从服务器调用可执行文件,并在该远程客户端计算机上运行它。
不确定如何最好地接近这一点。我试着喂它:
ConnectToRemoteClient("ClientMachine", @"Domain\User", @"password", @"\\ServerName\MyDir\Myfile.exe");
但它从未在机器上启动可执行文件。没有错误消息。
我想这样做的原因是为了避免将大型可执行文件和支持文件复制到每个客户端,而只是从每个远程客户端上的服务器库运行它。
我是否必须调用CMD窗口并将其提供给\\ ServerName \ MyDir \ Myfile.exe才能使其正常工作?或者我有办法让这项工作成功吗?
答案 0 :(得分:1)
您使用传递的凭据连接到远程计算机,但这只会建立您打开WMI的权限。然后,您传递给要执行的WMI的命令不会作为您传入的凭据运行,而是在LocalSystem帐户凭据下运行。
LocalSystem无权访问网络共享。
要执行此操作,您需要远程执行PSEXEC(https://ss64.com/nt/psexec.html),它允许您传递参数以启动应用程序。 PSEXEC作为LocalSystem运行,但允许您在启动指定的应用程序时传递凭据。然后,启动的程序将模拟您传入的用户,并且可以访问网络共享。