2010-11-02 64 views
1

我使用PSEXEC用於執行一些命令行程序,但是當我把我自己的編譯C#(.NET 4.0)控制檯應用程序,PSEXEC不掛了,將無法完成......PSEXEC沒有檢測到我的C#控制檯應用程序完成

當調用其他控制檯應用程序,PSEXEC將返回類似這樣的輸出:

PsExec v1.98 - Execute processes remotely 
Copyright (C) 2001-2010 Mark Russinovich 
Sysinternals - www.sysinternals.com 
Connecting to localhost... 
Starting PsExec service on localhost... 
Connecting with PsExec service on localhost... 
Starting [MyExe] on localhost... 
[myExe] exited on localhost with error code 0. 

但在我自己的C#控制檯應用程序只顯示輸出:

PsExec v1.98 - Execute processes remotely 
Copyright (C) 2001-2010 Mark Russinovich 
Sysinternals - www.sysinternals.com 

我的控制檯應用程序有一些記錄它自我,它執行得很好,並在大約2秒內退出代碼0,但在40秒後,PsExec仍然沒有輸出。

在目標機器上,PsExecSVR仍然安裝並正在運行。

我試圖(通過讓無效的主要結束自身)與

Environment.Exit(); 

而且還刪除了此行退出控制檯應用程序,並讓在它自己的控制檯應用程序退出。但是PsExec仍然沒有運氣。

+0

您可以創建幷包括表現出'psexec'此行爲的*短*示例程序? – Richard 2010-11-02 10:59:22

回答

1

當您從PsExec執行控制檯時,請檢查過程是否確實完成。我的懷疑是它已經掛起等待輸入(例如,它試圖從標準輸入讀取並阻止?),或者已經引發異常並且當前(例如)處於「oops:{0}」狀態;按任何一個鍵退出」。

  • 的工作目錄是不是你希望它是什麼(即它是在PSEXEC文件夾,而不是你的應用程序的文件夾)
  • :這樣當執行

    對於EXE經典的原因失敗用戶(不再是交互式用戶 - 甚至可能是來賓帳戶)缺少必要的權限或未安裝該用戶的東西

  • 它甚至可能試圖向您顯示某處的UAC對話框
0

這裏是程序的代碼,我得到堅持:

// Holds the Log4Net logger. 
private static readonly Logger _Log = Logger.GetLogger(typeof(Program)); 
internal static void Main(string[] args) 
    { 
    Environment.ExitCode = 0; 
    var result = false; 
    try 
    { 
     _Log.Debug(new string('=', 80)); 
     _Log.Debug("Starting"); 
     _Log.Debug("Location: {0}", Assembly.GetExecutingAssembly().Location); 

     if (args.Length != 5) 
     { 
      throw new InvalidOperationException("Invalid number of arguments"); 
     } 
     if (args[0] != "/install" && args[0] != "/uninstall") 
     { 
      throw new InvalidOperationException("First argument should be \"/install\" or \"/uninstall\""); 
     } 
     if (args[0] == "/install") 
     { 
      _Log.Debug("Installing..."); 
      _Log.Debug("DO NOTHING, BUT START AND STOP!!!"); 
      result = true; 
      _Log.Debug("Installed: Result={0}", result); 
     } 
     else if (args[0] == "/uninstall") 
     { 
      _Log.Debug("Uninstalling..."); 
      _Log.Debug("DO NOTHING, BUT START AND STOP!!!"); 
     } 
    } 
    catch (Exception e) 
    { 
     _Log.Error("ERROR: " + e.Message + "\r\n" + e.StackTrace); 
     Environment.ExitCode = -1; 
    } 
    finally 
    { 
     _Log.Debug("Stopping..."); 
     if (result) 
     { 
      _Log.Debug("Setting ExitCode to 0."); 
      Environment.ExitCode = 0; 
     } 
     else 
     { 
      _Log.Debug("Setting ExitCode to -1."); 
      Environment.ExitCode = -1; 
     } 
    } 

    _Log.Dispose(); 

    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    _Log.Debug("Exiting with exitcode: {0}", Environment.ExitCode); 
    Environment.Exit(Environment.ExitCode); 
    } 

我第一次調用的代碼中,PSEXEC工作正常,第二次(第3等)不工作。

+0

嘗試在最後一個Debug()方法調用之後配置_Log *。一般來說,測試如果程序拋出未處理的異常會發生什麼。 – 2010-11-02 13:17:22

2

我在自動構建和部署腳本中遇到了這個問題。由於未知原因,當psexec有一些標準輸出在遠程主機上「捕獲」時,它可能會卡住。而且這不會發生每次...

若要解決此避免在控制檯上您的遠程可執行文件的輸出,無論是產生在所有(只是退出代碼),沒有輸出或標準輸出重定向到一個文件。

您可能需要調用CMD.EXE遠程重定向標準輸出

cmd /c "yourprogram.exe" > yourlog.txt 

然後打開文件(從系統共享,例如\\服務器\ d $ \文件夾\ yourlog.txt)和轉儲它你的本地控制檯。

希望這會有所幫助。

相關問題