9

プロセスがリモートシステムで実行されているかどうかを確認しようとしています。私は次のコードを使用しています:

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

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

ただし、コードを実行しようとすると、「リモートマシンに接続できませんでした」というエラーが表示されます。

次のコマンドでpslistを実行できます。C:> pslist \ remoteSystemNameしたがって、必要な情報を取得できることはわかっていますが、コードで必要です。

もう1つの可能性は、pslistをC#に統合し、リストを検索してプロセスが存在するかどうかを確認することですが、これを行う方法に関する情報は見つかりませんでした。

4

6 に答える 6

8

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();
}
于 2009-05-14T20:13:23.133 に答える
4

以下は、これを機能させるために私がしたことです:

まず、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);
   }
于 2009-05-14T21:16:14.823 に答える
1

内部例外は「アクセスが拒否されました」と言っていますか?

同様の質問が役立つ場合があります。それは、パフォーマンス モニター ユーザー グループに所属する必要があることを述べています。

GetProcessesByName() および Windows Server 2003 のスケジュールされたタスク

于 2009-05-14T20:21:03.800 に答える
0

アプリケーションを単独で実行すると、コード内で例外が処理されなかったため、例外ウィンドウが表示されると考えました...

スタックトレースに理由がありました: access denied。その理由は、プロセス リストを取得するために .NET メソッドを呼び出していたプログラムを実行しているユーザーが、リモート マシンの「Performance Monitor Users」グループに属していなかったためです。

その後、パフォーマンス監視サービスがリモート マシンで実行されていないという別の例外が発生しました。そこで、リモート コンピューターで対応するサービスを開始したところ、うまくいきました。

これは、Windows 7 クライアントを使用して、Windows 2008 Server のプロセス リストを取得しようとしていました。

于 2014-10-01T08:47:40.877 に答える
0

リモート プロセス
の強制終了 Process.MachineName が設定されていると Process.Kill() メソッドが機能しないことがわかったので、プロセスをリモートで強制終了するための解決策を次に示します。他の人に役立つことを願っています。


メソッドを作成するための拡張メソッド: 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);
            });
    }
于 2016-09-08T10:54:13.510 に答える