检查某个进程是否在某个用户的远程计算机上运行
本文关键字:计算机 运行 用户 进程 是否 检查 | 更新日期: 2023-09-27 18:23:43
我必须创建一个可执行文件,检查某个进程是否为某个用户(服务帐户)在远程机器上运行,输入参数为3个字符串,机器名、用户名和进程名。
我想用System.Diagnostics
或WMI
来做这件事,只是想仔细检查一下是否有人有其他想法,比如powershell,甚至是一个可以让任务变得更容易的窗口功能。
由于我们希望确保进程始终在专用服务器上运行,我们将配置一个调度任务来执行一个执行此检查的小型控制台应用程序。不确定用C#编码是最好的选择,还是我忽略了windows服务器的内置功能?谢谢
我确信您可以使用tasklist cmd:tasklist /S ''<server> /V > tasklist.txt
来实现这一点。这将为您提供一个可以通过grep浏览的文件。
命名空间使用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;
}
}
GetOwner可以为远程comp返回空数组,因此它可能无法在中工作