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);
「ネットワークパスが見つかりませんでした」というメッセージが表示され続けます。
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);
次のいずれかを使用します。
または、気になる場合は、独自のサービスまたはCOMコンポーネントを挿入します。それはPsExecが行うことに非常に近いでしょう。
これらすべての方法の中で、私はタスクスケジューラを好みます。それらすべての中で最もクリーンなAPIだと思います。リモートタスクスケジューラに接続し、実行可能ファイルの新しいタスクを作成して実行します。注:実行可能ファイル名は、thatマシンに対してローカルである必要があります。\servername\path\file.exeではなく、c:\ path\file.exeです。必要に応じてタスクを削除してください。
これらすべての方法では、ターゲットマシンへの管理アクセス権が必要です。
ProcessStartInfo
はリモートプロセスを起動できません。
[〜#〜] msdn [〜#〜] によると、Process
オブジェクトはaccessのみを許可しますリモートプロセスを開始または停止する機能ではなく、リモートプロセスに対して。したがって、このクラスの使用に関する質問に答えるのはできません。
現在のプロセスとして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);
}