如何检查特定进程是否在远程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 /服务器上运行?

值不在所述预期范围内。

+0

是凭据是否正确?为什么在'else'子句的构造函数中添加'null'作为参数?根据https://msdn.microsoft.com/de-de/library/system.management.managementscope%28v=vs.110%29.aspx,您可以忽略它。另外,你能给出一个更详细的堆栈跟踪,它究竟在哪里崩溃的内部函数? –

+0

它在Scope.Connect崩溃(我在代码中评论它) –

这很可能是由于凭据错误或权限不足。在你的情况没有提供用户名 - 我相当肯定你不能传递空的用户名。用于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);