web-dev-qa-db-ja.com

リモートコンピューターでコマンドを実行する方法

サーバーに共有フォルダーがあり、いくつかのファイルでコマンドをリモートで実行する必要があります。それ、どうやったら出来るの?

それを機能させるには、サーバー上でどのサービスを実行する必要がありますか?

詳細:C#のみを使用できます。サーバーには何もインストールできません。

21
user53179

別の解決策は、 WMI.NETまたはWindows Management Instrumentation を使用することです。

.NET Framework名前空間System.Managementを使用すると、Windows Management Instrumentation(WMI)を使用して管理タスクを自動化できます。

サンプルコード

using System.Management;
...
var processToRun = new[] { "notepad.exe" };
var connection = new ConnectionOptions();
connection.Username = "username";
connection.Password = "password";
var wmiScope = new ManagementScope(String.Format("\\\\{0}\\root\\cimv2", REMOTE_COMPUTER_NAME), connection);
var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
wmiProcess.InvokeMethod("Create", processToRun);

認証に問題がある場合は、DCOM構成を確認してください。

  1. ターゲットマシンで、コマンドプロンプトからdcomcnfgを実行します。
  2. Component Services\Computers\My Computer\DCOM Configを展開します
  3. GUID 8BC3F05E-D86B-11D0-A075-00C04FB68820(これは詳細ビューで確認できます)で識別されるWindows管理手順を見つけます。
  4. プロパティを編集してから、アクセス許可タブでログインしようとしているユーザー名を追加します。
  5. サービスまたはマシン全体を再起動する必要がある場合があります。

注:リモートプロセスに使用されるすべてのパスは、ターゲットマシンに対してローカルである必要があります。

32
Dennis

SysInternalの PsExec を使用できます。

6
Dirk Vollmar
try
{
    string AppPath = "\\\\spri11U1118\\SampleBatch\\Bin\\";
    string strFilePath = AppPath + "ABCED120D_XXX.bat";
    System.Diagnostics.Process proc = new System.Diagnostics.Process();

    proc.StartInfo.FileName = strFilePath;
    string pwd = "s44erver";

    proc.StartInfo.Domain = "abcd";
    proc.StartInfo.UserName = "sysfaomyulm";

    System.Security.SecureString secret = new System.Security.SecureString();
    foreach (char c in pwd)

        secret.AppendChar(c);

    proc.StartInfo.Password = secret;
    proc.StartInfo.UseShellExecute = false;

    proc.StartInfo.WorkingDirectory = "psexec \\\\spri11U1118\\SampleBatch\\Bin ";

    proc.Start();
    while (!proc.HasExited)
    {
        proc.Refresh();
        // Thread.Sleep(1000);
    }

    proc.Close();
}
catch (Exception ex)
{
    throw ex;
}
0
ZokiManas

IMO、あなたの場合、これを試すことができます:

  1. 共有フォルダーをコンピューターのドライブまたはフォルダーにマップします。 ( 方法はこちら
  2. 通常はローカルファイルと同じように、マップされたドライブ/フォルダーにアクセスします。

何もインストールする必要はありません。フォルダー共有を有効にするサービスを除き、サービスを実行する必要はありません。

共有フォルダーにアクセスしてコンピューターにマップできる場合、コマンドプロンプトやすべてのエクスプローラー強化ツールなど、ほとんどのものはローカルファイルのように機能するはずです。

これはPsExec(またはRDP-ing in)の使用とは異なり、リモートサーバーで管理者権限および/またはリモートデスクトップ/ターミナルサービス接続権限を持っている必要はなく、それらの共有フォルダーにアクセスできればよいだけです。

また、これらの共有フォルダーで実行するコマンド/ツールを実行するために必要なすべてのセキュリティ権限があることを確認してください。


ただし、処理をターゲットマシンで)実行する場合は、 PsExec as @divo and @再帰的指摘、何かに沿って:

PsExec \\yourServerName -u yourUserName cmd.exe

これにより、リモートマシンでコマンドプロンプトatが表示されます。そして、そこから好きなものを実行できます。

確かではありませんが、サーバー(lanmanserver)またはターミナルサービス(TermService)サービスのいずれかが実行されている必要があります(既に実行されているはずです)。

0
chakrit