2014-09-11 163 views
1

我試圖在遠程機器上執行notepad.exe,但現在無法正常工作。我錯過了什麼?在遠程機器上執行EXE

var ui = new ImpersonateUser(); 
    //the process to restart 
    const string processName = "notepad.exe"; 
    var serverName = "serverName"; 

    try 
    { 
     //Use adbadmin for access 
     ui.Impersonate(_domain, _userName, _pass); 

     //Start the process 
     ProcessStartInfo info = new ProcessStartInfo("C:\\PsTools"); 
     info.FileName = @"C:\PsTools\psexec.exe"; 
     info.Arguments = @"""\\" + serverName + @"C:\WINDOWS\notepad.exe"""; 
     info.RedirectStandardOutput = true; 
     info.UseShellExecute = false; 
     Process p = Process.Start(info); 

     lblStatusResponse.Text = "Service " + processName + " was restarted correctly."; 
    } 
    catch (Exception ex) 
    { 
     lblStatusResponse.Text = ex.ToString(); 
    } 
    finally 
    { 
     ui.Undo(); 
    } 

這讓我也不例外,但我確實失去了一些東西......

+0

是否在遠程機器上啓動了「服務器」服務? – 2014-09-11 08:10:53

+1

有一件事,你需要一個C之前的空間:.. .. – 2014-09-11 08:11:42

+0

@LorenzoDematté你對服務器服務意味着什麼? – MrProgram 2014-09-11 08:12:52

回答

4

答案是從您的答覆組合。但是,正確的解決方案是:

 ProcessStartInfo info = new ProcessStartInfo("C:\\PsTools"); 
     info.FileName = @"C:\PsTools\psexec.exe"; 
     info.Arguments = @"\\" + serverName + @" -i C:\WINDOWS\notepad.exe"; 
     info.RedirectStandardOutput = true; 
     info.UseShellExecute = false; 
     Process p = Process.Start(info); 
2

你的UNC路徑不好看。

字符串連接後,它看起來像

"\\serverNameC:\WINDOWS\notepad.exe" 

嘗試打印出來。請參見文檔有關UNC on MSDN,以及一些例子here(或者google一下UNC路徑)

如果您只有默認共享,它應該像

"\\serverName\C$\WINDOWS\notepad.exe" 

OR PSEXEC讓你用不同的符號,但你必須小心雙引號

psexec \\serverName"c:\WINDOWS\notepad.exe" 

另外,確保「服務器」服務正在目標機器上運行。

PsExec在遠程系統上啓動一個可執行文件並控制可執行文件進程的輸入和輸出流,以便您可以與本地系統中的可執行文件進行交互。 PsExec通過從其可執行映像中提取名爲Psexesvc的嵌入式Windows服務並將其複製到遠程系統的Admin $共享中來完成此操作。然後,PsExec使用具有遠程接口的Windows服務控制管理器API來啓動遠程系統上的Psexesvc服務。

Admin $共享由「服務器」服務創建和管理,因此您需要它運行psexec才能使用(http://windowsitpro.com/systems-management/psexec)。

+0

現在當您提到它時,我會嘗試C $ – MrProgram 2014-09-11 08:26:06

+0

首先,您也應該嘗試在命令行中使用它。然後當它工作時,將其嵌入到C#程序中。這樣更容易... – 2014-09-11 08:27:15

+0

嗯好吧..Psexec在服務器上,所以不應該是一個問題。但是我不知道 – MrProgram 2014-09-11 08:32:19

3

運行交互式程序(如notepad.exe)並不總是在目標PC上打開一個可見窗口。嘗試在運行代碼時打開目標PC上的任務管理器,並查看正在運行的進程列表中是否出現notepad.exe。

我建議嘗試從命令行運行psexec之前嘗試通過代碼調用它。

psexec \\serverName "notepad.exe" 

您可能還想使用「交互式」標誌,以便它可以與目標上的桌面交互。

psexec \\serverName "notepad.exe" -i 
+0

它也沒有啓動該過程,我檢查了 – MrProgram 2014-09-11 08:32:55

+0

在cmd行上運行時是否收到錯誤消息?源PC和目標PC都連接到同一個域?如果是這樣,運行psexec命令的帳戶是否對目標PC有權限?嘗試將帳戶添加到目標工作站上的本地管理員組。 – 2014-09-11 08:37:32

+0

另一個可以嘗試的測試是試圖將網絡驅動器從源PC映射到目標PC。嘗試從命令行運行以下命令。淨使用\\ serverName \ c $ – 2014-09-11 08:42:25