.NET - 获取在另一个域中的计算机上运行的进程

时间:2011-10-10 15:58:39

标签: .net process

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

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

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

如果重要,.NET应用程序正在Windows 7监视计算机上运行,​​该计算机需要连接到我们某个零售点的Windows XP计算机。

在发布此问题之前,我尝试搜索以前的问题并尝试了Google。如果有重复的问题,请告诉我,我将删除此问题。

3 个答案:

答案 0 :(得分:3)

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

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

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

为了我的特殊目的,我修改了它,并获得了尽可能小的功能。我正在为下一个人分享它。

请注意,您需要在项目中添加对 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;
    }

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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