使用C#检查进程是否在远程系统上运行

时间:2009-05-14 20:02:38

标签: c# .net system.diagnostics

我正在尝试检查进程是否在远程系统上运行。我使用以下代码:

string procSearc = "notepad";
string remoteSystem = "remoteSystemName";

Process[] proce = System.Diagnostics.Process.GetProcessesByName(procSearch, remoteSystem);

但是,当我尝试运行代码时,出现以下错误:“无法连接到远程计算机。”

我可以使用以下命令运行pslist: C:> pslist \ remoteSystemName 所以我知道可以获得我需要的信息,但我需要在代码中使用它。

另一种可能性是将pslist集成到C#中并搜索列表以查看该进程是否存在,但我还没有找到有关如何执行此操作的信息。

6 个答案:

答案 0 :(得分:7)

System.ServiceProcess.ServiceController课程用于服务。您可以使用Status检查它是否正在运行,Stop()Start()来控制它。

ServiceController sc = new ServiceController();
sc.MachineName = remoteSystem;
sc.ServiceName = procSearc;

if (sc.Status.Equals(ServiceControllerStatus.Running))
{
   sc.Stop();
}
else
{
   sc.Start();
}

答案 1 :(得分:4)

以下是我为此付出的努力:

首先,我添加了对System.ServiceProcess的引用,并添加了:using System.ServiceProcess;

string remoteSystem = "remoteSystemName";
string procSearch = "notepad";            
Process[] proc = System.Diagnostics.Process.GetProcessesByName(procSearch, remoteSystem);

   if (proc.Length > 0)

   {
        Console.WriteLine("Able to find: " + proc[0]);
   }
   else
   {
        Console.WriteLine("Unable to find: " + procSearch);
   }

答案 2 :(得分:1)

内部异常是否说“拒绝访问”?

类似的问题可能有所帮助,它提到需要在Performance Monitor Users组中。

GetProcessesByName() and Windows Server 2003 scheduled task

答案 3 :(得分:0)

我认为在运行应用程序时,我会得到一个异常窗口,因为我的代码中没有处理异常......

我在堆栈跟踪中看到了原因:访问被拒绝。原因是运行调用.NET方法获取进程列表的程序的用户不是远程计算机的“性能监视器用户”组的一部分。

之后我又得到另一个例外,即性能监控服务未在远程计算机上运行。所以我在远程计算机上开始了相应的服务,并且它工作了!

这是使用Windows 7客户端尝试获取Windows 2008 Server的进程列表。

答案 4 :(得分:0)

终止远程进程
我发现Process.Kill()方法在设置Process.MachineName时不起作用,所以这里有一个远程终止进程的解决方案,希望它能帮助其他人。


创建方法的扩展方法:KillRemoteProcess

public static class ProcessExtensions
{
    public static void KillRemoteProcess(this Process p, string user, string password)
    {
        new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "TaskKill.exe",
                Arguments = string.Format("/pid {0} /s {1} /u {2} /p {3}", p.Id, p.MachineName, user, password),
                WindowStyle = ProcessWindowStyle.Hidden,
                CreateNoWindow = true
            }
        }.Start();
    }
}

当然是查找进程并使用KillRemoteProcess的方法

 public static void KillProcessesRemote()
    {
        string targetProcessName = "myProcess"; //Do not put 'process.exe' here just 'process'
        string targetMachine = "remotMachine"; //Target machine
        string username = "myUser"; //Username
        string password = "myPassword"; //Password

        Parallel.ForEach<Process>( //Kill all processes found
            source: System.Diagnostics.Process.GetProcessesByName(targetProcessName, targetMachine),
            body: process => {
                process.KillRemoteProcess(username, password);
            });
    }

答案 5 :(得分:0)

您可以尝试模仿有权访问远程服务器的用户。

https://docs.microsoft.com/en-us/dotnet/api/system.security.principal.windowsimpersonationcontext?redirectedfrom=MSDN&view=netframework-4.7.2

模拟之后,您将不再遇到错误。 另外,您还必须确保域之间存在信任,否则模拟将不起作用。

LogonUser works only for my domain