2017-07-31 10 views
4

ローカルマシン(Windows 7)からiisをリモートで再起動しようとしています(Windows Servr 2012)。 IISを再起動するコマンドラインの以下のコマンドは機能しません。Windows 7クライアントマシンからリモートWindowsサーバー上のIISを再起動するには?

iisreset servername /restart 

しかし、以下のコマンドは、コマンドラインで試してもうまく動作します。私は「IPCONFIG」のような上記のコードでは、他の引数を与えた場合

psexec iisreset \\servername /restart 

は今、私はC#でコードの下にしようとすると問題があり、

Process process = new Process(); 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    startInfo.FileName = "cmd.exe"; 
    startInfo.Arguments = "\C psexec iisreset \\servername /restart"; 
    startInfo.RedirectStandardOutput = true; 
    startInfo.UseShellExecute = false; 
    process.StartInfo = startInfo; 
    process.Start(); 
    // capture what is generated in command prompt 
    var output = process.StandardOutput.ReadToEnd(); 

、それは私に期待される出力を提供します。しかし、私がpsexecを試してみると、空の出力が得られます。しかし、コマンドプロンプトで試してみるとうまくいきます。

また、ファイル名に 'psexec.exe'を使用し、引数に '\ C psexec'を削除してみました。しかし、まだ運がありません。

誰でもこの問題を解決するのに手伝ってください。

ありがとうございました。

+0

変更startInfo.Arguments = "\のC .... startInfo.Arguments = @に" \ C ....見ます。https:/ /msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx – BugFinder

+0

応答に感謝します。それでも私は "システムはファイル指定されたファイルを見つけることができません"という出力を出していますが、期待どおりの出力は得られません。 – user28

答えて

1

ドメイン管理者の認証情報を提供する必要があります。

private int ExcecuteCommand(string command, string fileName, bool getResult, string timeout = null) 
{ 
    try 
    { 
     var secure = new SecureString(); 
     foreach (char c in txtAdminPassword.Text) 
     { 
      secure.AppendChar(c); 
     } 
     System.Diagnostics.Process pProcess = new System.Diagnostics.Process(); 
     pProcess.StartInfo.Domain = txtDomainName.Text; 
     pProcess.StartInfo.UserName = txtUser.Text; 
     pProcess.StartInfo.Password = secure; 
     pProcess.StartInfo.FileName = fileName;// AppDomain.CurrentDomain.BaseDirectory + @"PSTools\PsExec.exe"; ; 
     //pProcess.StartInfo.Arguments = string.Format(@"\\{0} -i -s -accepteula ipconfig /all", ipAddress); 
     //pProcess.StartInfo.Arguments = string.Format(@"\\{0} -accepteula netstat -ano",ipAddress); 
     //pProcess.StartInfo.Arguments = string.Format(@"\\{0} -accepteula -i CheckURLConnectivity", ipAddress); 
     //pProcess.StartInfo.Arguments = string.Format(@"\\{0} -accepteula ping {2}", ipAddress, AppDomain.CurrentDomain.BaseDirectory + @"Installer\CheckURLConnectivity.exe","10.10.10.35"); 
      //pProcess.StartInfo.Arguments = string.Format(@"\\{0} -accepteula cmd /c type C:\ServiceLog.txt", ipAddress); 
     pProcess.StartInfo.Arguments = command;//string.Format(@"\\{0} -accepteula -c -f {1}", compName, AppDomain.CurrentDomain.BaseDirectory + @"Installer\CheckURLConnectivity.exe"); 
     pProcess.StartInfo.UseShellExecute = false; 
     Process.StartInfo.RedirectStandardInput = true; 
     pProcess.StartInfo.RedirectStandardOutput = true; 
     pProcess.StartInfo.RedirectStandardError = true; 
     pProcess.StartInfo.CreateNoWindow = true; 
     logger.log("Query " + command); 
     pProcess.Start(); 
     if (timeout == null) 
      pProcess.WaitForExit(); 
     else 
      pProcess.WaitForExit(Convert.ToInt32(timeout)); 

     string strOutput = string.Empty; 

      if (pProcess.HasExited == true && pProcess.ExitCode != 0) 
      { 
       string _errorMessage = GetWin32ErrorMessage(pProcess.ExitCode); 
       pProcess.Kill(); 
       return pProcess.ExitCode; 
      } 
      else 
       return 0; 
     } 
     catch (Exception) 
     { 
     return -1; 
     } 
} 
2

私はこのようなPSEXECを使用するときにCMD.EXEを使用してはならないことことを発見した、とあなたはPSEXECへの完全なパスを持っていることを確認する必要があります。たとえそれがあなたのアプリケーションと同じディレクトリにあるとしても、exeです。

//Assume that psexec.exe is in same location as application 
//Get directory of running applications 
String AppPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).Replace("file:\\",""); 

//Set up start infor details 
ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.UseShellExecute = false; 

//Combine path of running app 
startInfo.FileName = Path.Combine(AppPath, "psexec.exe"); 
startInfo.Arguments = "\\servername c:\path\to\iisreset /restart"; 

//Execute 
Process nProc = Process.Start(startInfo); 
nProc.Start(); 
+0

応答Jasonに感謝します。しかし、私はまだ "システムはファイル指定されたファイルを見つけることができません"という出力を得ていますが、期待通りの出力は得られません。 – user28

+0

サーバ名を最初のパラメータに変更しました。リモートサーバ上のiisresetへのフルパスが必要な場合があります。これも参照してください:https://stackoverflow.com/questions/21027559/process-start-in-windows-system32-folder –

1

IISRESETは、あなたがpsexec

と-hスイッチを使用する必要がwork.Soに昇格権限が必要です-hターゲットシステムがVistaまたは高い場合は、アカウントの昇格を使用して実行プロセスを持っています利用可能な場合、トークン。

Process process = new Process(); 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    startInfo.FileName = "psexec.exe"; 
    startInfo.Arguments = "-h iisreset \\servername /restart"; 
    startInfo.RedirectStandardOutput = true; 
    startInfo.UseShellExecute = false; 
    process.StartInfo = startInfo; 
    process.Start(); 
    // capture what is generated in command prompt 
    var output = process.StandardOutput.ReadToEnd(); 
関連する問題