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

C# 使用C检查进程是否在远程系统上运行#,c#,.net,system.diagnostics,C#,.net,System.diagnostics,我试图检查进程是否在远程系统上运行。我正在使用以下代码: string procSearc = "notepad"; string remoteSystem = "remoteSystemName"; Process[] proce = System.Diagnostics.Process.GetProcessesByName(procSearch, remoteSystem); 然而,当我尝试运行代码时,我得到以下错误:“无法连接到远程计算机。” 我可以使用以下命令运行pslist: C:

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

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

Process[] proce = System.Diagnostics.Process.GetProcessesByName(procSearch, remoteSystem);
然而,当我尝试运行代码时,我得到以下错误:“无法连接到远程计算机。”

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


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

使用
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();
}

内部异常是否表示“拒绝访问”

类似的问题可能会有所帮助,它提到需要加入Performance Monitor用户组


以下是我为实现这一目标所做的工作:

首先,我添加了对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);
   }

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

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

在此之后,我收到另一个异常,即性能监视服务未在远程计算机上运行。所以我在远程计算机上启动了相应的服务,瞧,它成功了


这是使用Windows 7客户端试图获取Windows 2008服务器的进程列表。

终止远程进程。
我发现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();
    }
}
 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);
            });
    }
当然还有找到进程并使用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();
    }
}
 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);
            });
    }
publicstaticvoidkillprocessesremote()
{
字符串targetProcessName=“myProcess”;//不要将“process.exe”放在这里,而只放在“process”
字符串targetMachine=“remotMachine”;//目标机器
字符串username=“myUser”;//用户名
字符串password=“myPassword”;//密码
Parallel.ForEach(//杀死找到的所有进程
来源:System.Diagnostics.Process.GetProcessByName(targetProcessName,targetMachine),
正文:进程=>{
进程。KillRemoteProcess(用户名、密码);
});
}

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

模拟后,您将不再遇到错误。 此外,您必须确保域之间存在信任,否则模拟将无法工作


这与我在这方面使用的代码完全相同。我在尝试连接到Windows 2008 Server时遇到“拒绝访问”消息。当我运行上述代码时,我收到一条消息,说明:无法在计算机ComputerName上打开记事本服务。我试图检查流程,这似乎是在检查服务。两者都可以吗?我没想过这不是一项服务。。。我现在不确定我是否给了你一个好的答案。我只是在远程机器上用notpad测试了我的代码,得到了与你得到的相同的消息。我运行了你的代码,没有错误。你是如何运行你的代码的?您有权访问远程计算机吗。我知道我是测试用的远程机器上的本地管理员。这是服务,而不是进程。我还收到错误“无法在计算机上打开xxxx服务”。下面的答案应该是可以接受的。