如何检查特定进程是否在远程PC /服务器上运行?
问题描述:
string ComputerName = serverName;
ManagementScope Scope;
if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase))
{
ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "";
Conn.Password = "";
Conn.Authority = "ntlmdomain:DOMAIN";
Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
}
else
Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
Scope.Connect(); // CRASH HERE
ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_Process Where Name='" + processName + "'");
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
示出了是该消息:如何检查特定进程是否在远程PC /服务器上运行?
值不在所述预期范围内。
答
这很可能是由于凭据错误或权限不足。在你的情况没有提供用户名 - 我相当肯定你不能传递空的用户名。用于WMI查询的用户名/密码必须存在于远程PC上(并且用户必须拥有足够的权限)。
如果你想使用你与本地PC(从您正在运行的代码)上登录同一用户名/密码,您应该忽略整个ConnectionOptions部分:
//ConnectionOptions Conn = new ConnectionOptions();
//Conn.Username = "";
//Conn.Password = "";
//Conn.Authority = "ntlmdomain:DOMAIN";
我试着你的代码(添加了最后4行测试),并且它出现了和你一样的错误。一旦我添加用户名和密码,一切都运行良好。
string ComputerName = "10.1.2.3";
ManagementScope Scope;
if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase))
{
ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "Administrator";
Conn.Password = "pass123";
//Conn.Authority = "ntlmdomain:DOMAIN";
Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
}
else
Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
Scope.Connect(); // CRASH HERE
ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_Process Where Name='" + "cmd.exe" + "'");
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
ManagementObjectCollection queryCollection = Searcher.Get();
foreach (var item in queryCollection)
Console.WriteLine(item["Description"]);
Console.Read();
我也尝试了与关于ConnectionOptions部分相同的代码注释掉,它也起作用。但请注意,根据我之前写的内容,我必须在远程PC上创建一个用户,该用户具有与在本地PC上登录的用户相同的凭据。
希望这会有所帮助。
编辑:另外按马克西米利格哈特评论,跳过NULL这一行:
Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
是凭据是否正确?为什么在'else'子句的构造函数中添加'null'作为参数?根据https://msdn.microsoft.com/de-de/library/system.management.managementscope%28v=vs.110%29.aspx,您可以忽略它。另外,你能给出一个更详细的堆栈跟踪,它究竟在哪里崩溃的内部函数? –
它在Scope.Connect崩溃(我在代码中评论它) –