web-dev-qa-db-ja.com

C#でリモートマシンでプロセスを実行する方法

System.Diagnostics.Processクラスを使用して、c#のリモートコンピューターでコンピューター名= "someComputer"などのプロセスを開始するにはどうすればよいですか?

そのリモートコンピューター上に、「Hello world」をtxtファイルに書き込むだけの小さなコンソールアプリを作成しました。これをリモートで呼び出したいと思います。

コンソールアプリのパス:c:\ MyAppFolder\MyApp.exe

現在私はこれを持っています:

ProcessStartInfo startInfo = new ProcessStartInfo(string.Format(@"\\{0}\{1}", someComputer, somePath);

            startInfo.UserName = "MyUserName";
            SecureString sec = new SecureString();
            string pwd = "MyPassword";
            foreach (char item in pwd)
            {
                sec.AppendChar(item);
            }
            sec.MakeReadOnly();
            startInfo.Password = sec;
            startInfo.UseShellExecute = false;

            Process.Start(startInfo);

「ネットワークパスが見つかりませんでした」というメッセージが表示され続けます。

13
DJPB

PsExecは http://technet.Microsoft.com/en-us/sysinternals/bb897553.aspx から使用できます。

またはWMI:

object theProcessToRun() = { "YourFileHere" };

ManagementClass theClass = new ManagementClass(@"\\server\root\cimv2:Win32_Process");

theClass.InvokeMethod("Create", theProcessToRun);
16
Ivan G.

次のいずれかを使用します。

または、気になる場合は、独自のサービスまたはCOMコンポーネントを挿入します。それはPsExecが行うことに非常に近いでしょう。

これらすべての方法の中で、私はタスクスケジューラを好みます。それらすべての中で最もクリーンなAPIだと思います。リモートタスクスケジューラに接続し、実行可能ファイルの新しいタスクを作成して実行します。注:実行可能ファイル名は、thatマシンに対してローカルである必要があります。\servername\path\file.exeではなく、c:\ path\file.exeです。必要に応じてタスクを削除してください。

これらすべての方法では、ターゲットマシンへの管理アクセス権が必要です。

ProcessStartInfoはリモートプロセスを起動できません。

15
Seva Alekseyev

[〜#〜] msdn [〜#〜] によると、Processオブジェクトはaccessのみを許可しますリモートプロセスを開始または停止する機能ではなく、リモートプロセスに対して。したがって、このクラスの使用に関する質問に答えるのはできません。

7
Austin Salonen

現在のプロセスとしてWMIおよびその他の資格情報を使用した例では、デフォルトでは、プロセスの実行と同じユーザーが使用されていました。

var hostname = "server"; //hostname or a IpAddress

var connection = new ConnectionOptions();
//The '.\' is for a local user on the remote machine
//Or 'mydomain\user' for a domain user
connection.Username = @".\Administrator";
connection.Password = "passwordOfAdministrator";

object[] theProcessToRun = { "YourFileHere" }; //for example notepad.exe

var wmiScope = new ManagementScope($@"\\{hostname}\root\cimv2", connection);
wmiScope.Connect();
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
    managementClass.InvokeMethod("Create", theProcessToRun);
}
4
live2