2014-09-11 122 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