检查进程是否在某台用户的远程计算机上运行

时间:2012-02-06 14:26:52

标签: c# winapi wmi

我必须创建一个可执行文件,检查远程计算机上某个用户(服务帐户)是否正在运行某个进程,输入参数是3个字符串,计算机名称,用户名和进程名称。

我有想法使用System.DiagnosticsWMI执行此操作,只是想仔细检查是否有人有像PowerShell这样的其他想法,甚至是一个可以使任务更容易的窗口功能。< / p>

因为我们要确保进程始终在专用服务器上运行,所以我们将配置一个计划任务来执行执行此检查的小型控制台应用程序。不确定在C#中编码是最好的选择还是我忽略了Windows服务器的内置功能?谢谢!

3 个答案:

答案 0 :(得分:1)

我非常确定您可以使用tasklist cmd完成此任务:tasklist /S \\<server> /V > tasklist.txt。这将为您提供一个可以浏览的文件。

答案 1 :(得分:1)

未引用

命名空间 使用System.Management;

我最终通过在C#中实施以下解决方案

这将检索没有processName上运行machineName的用户的域名的用户名

public static string GetProcessOwner()
{
    try
    {
        var resultUserName = string.Empty;

        ConnectionOptions opt = new ConnectionOptions();

        string path = string.Format(@"\\{0}\root\cimv2", machineName);

        ManagementScope scope = new ManagementScope(path, opt);

        scope.Connect();

        var query = new ObjectQuery(string.Format("Select * From Win32_Process Where Name = '{0}'", processName));
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

        var processList = searcher.Get();

        foreach (ManagementObject obj in processList)
        {
            string[] argList = new string[] { string.Empty, string.Empty };
            int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList));

            if (returnVal == 0)
            {
                // return DOMAIN\user 
                //return argList[1] + "\\" + argList[0];
                resultUserName = argList[0];
            }
        }

        return resultUserName; 
    }
    catch (Exception exc)
    {
        Debug.WriteLine(exc.Message);

        return string.Empty;
    }
}

答案 2 :(得分:0)

GetOwner可以为远程comp返回空数组,因此可能无法正常工作