2011-10-10 31 views
2

我正在寻找一种方法,从.NET代码获取正在运行的进程在不同域上的远程计算机上的列表。.NET - 获取在另一个域中的计算机上运行的进程

我有机器的用户名和密码。但是,System.Diagnostics.Process.GetProcesses()函数只有两个覆盖。其中一个接受远程机器的名称,但没有办法将用户名和密码发送到该机器。为了使该工具正常工作,它必须是您已有权访问的域中的计算机。

我不是100%确定这是否可以完成,但我怀疑它可以通过Interop和WMI完成。

如果很重要,.NET应用程序将运行在Windows 7监控计算机上,该计算机需要连接到我们的某个零售位置的Windows XP计算机。

我试过搜索以前的问题,并在发布此问题之前尝试过Google。如果有重复的问题,请让我知道,我会删除这个问题。

回答

2

我讨厌回答我自己的问题,但对于下一个要面对这个挑战的人,我确实找到了一个更简单的方法来通过System.Management对象执行此操作。

在codeproject.com上有一个完整的工作应用程序和源代码。

http://www.codeproject.com/KB/cs/Remote_process_controller.aspx

我修改了它颇有几分我specfic目的,并获得尽可能小的功能可按做到这一点。我分享给下一个来的人。

请注意,您需要添加对项目的参考System.Management

private bool CheckForExpectedProcess(string userName, string password, string machineName, string logonDomain, string PartialProcessname) 
    { 
     bool ReturnValue = false; 
     System.Management.ManagementScope managementScope; 
     try 
     { 
      System.Management.ConnectionOptions connOptions = new System.Management.ConnectionOptions(); 

      connOptions.Impersonation = System.Management.ImpersonationLevel.Impersonate; 
      connOptions.EnablePrivileges = true; 
      connOptions.Username = logonDomain + "\\" + userName; 
      connOptions.Password = password; 
      managementScope = new System.Management.ManagementScope(@"\\" + machineName + @"\ROOT\CIMV2", connOptions); 

      managementScope.Connect(); 
      System.Management.ManagementObjectSearcher objSearcher = new System.Management.ManagementObjectSearcher("SELECT Name FROM Win32_Process WHERE NAME LIKE'%" + PartialProcessname + "%'"); 
      System.Management.ManagementOperationObserver opsObserver = new System.Management.ManagementOperationObserver(); 
      objSearcher.Scope = managementScope; 
      string[] sep = { "\n", "\t" }; 

      System.Management.ManagementObjectCollection objects = objSearcher.Get(); 
      ReturnValue = objects.Count > 0; 

     } 
     catch (Exception ex) 
     { 
      // handle error - we log it to our own system, but it's up to you. 
     } 

     return ReturnValue; 
    } 
+0

正是我所需要的,感谢分享...... – Moshisho

2

您正在寻找的是实现等效于runas /networkonly的地方,本地计算机上的进程标识保持不变,而任何出站网络访问均使用指定的凭据完成。

根据SO帖子How to build RUNAS /NETONLY functionality into a (C#/.NET/WinForms) program?您需要使用CreateProcessWithLogonWLOGON_NETCREDENTIALS_ONLY

+0

其他答案看起来很有希望。谢谢!我现在要试一试。 – David

+0

我放弃了试图这样做,因为我确信必须有一个更简单的方法,我找到了它。我投你了票,但我在CodeProject.com找到了更好的答案和示例项目代码。不过,谢谢你的时间!我使用“CreateProcessWithLogonW”这个术语来引导我到其他许多帖子,其中一些人提到了WMI作为替代方案,因此您间接帮助了我。再次感谢您的时间! – David

1

你可以试试这个tool,它完全符合你的要求。您可以监视来自任何域的远程计算机。这个工具允许监视远程机器进程,安装的软件,设备,服务,会话等...

+0

我认为他想要一个API而不是一个工具。 –

相关问题