【问题标题】:check if a process runs on a remote machine for a certain user检查某个进程是否在某个用户的远程计算机上运行
【发布时间】:2012-02-06 14:26:51
【问题描述】:

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

我有想法使用System.DiagnosticsWMI 来执行此操作,只是想仔细检查是否有人有其他想法,例如 powershell 甚至是可以使任务更轻松的窗口功能。

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

【问题讨论】:

    标签: c# winapi wmi


    【解决方案1】:

    我很确定您可以使用 tasklist cmd:tasklist /S \\<server> /V > tasklist.txt 完成此操作。这会给你一个你可以通过 grep 的文件。

    【讨论】:

    • 谢谢,这很好,但我仍然需要解析生成的文件,并且需要 .NET 代码。
    • 试试tasklist /S \\[machine name] /V /FI "USERNAME eq [user name]" /FI "IMAGENAME eq [process name]"
    • 我对其他一些选项做了更多的尝试。里面有好东西!为了获得更清晰的结果,请取下 /V 并戴上 /NH(无标题)。此外,添加 /SVC 有助于清理其他一些列(但我不确定它具体指定了什么)。
    【解决方案2】:

    未引用命名空间 使用 System.Management;

    我最终在 C# 中实现了以下解决方案

    这将检索在machineName 上运行processName 的用户的不带域名的用户名

    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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      GetOwner 可以返回空数组进行远程补偿,所以它可能不起作用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        相关资源
        最近更新 更多