在远程机器上执行exe文件

3

我正在尝试在远程计算机上执行notepad.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();
    }

这段话没有任何异常,但我肯定是漏掉了些什么...

远程机器上的“server”服务是否已启动? - Lorenzo Dematté
1
首先,你需要在 C:.. 前面加上一个空格。 - Eren Ersönmez
@LorenzoDematté 你所说的服务器服务是什么意思? - MrProgram
@ErenErsönmez 在哪里?全部都是吗? - MrProgram
2
不,只是在这里:info.Arguments = @"""\\" + serverName + @" C:\WINDOWS\notepad.exe"""; - Eren Ersönmez
4个回答

6
答案是根据您的回复组合而成的。但整个正确的解决方案是:
        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);

4

运行交互式程序,例如notepad.exe,并不总是在目标PC上打开可见窗口。尝试在运行代码时在目标PC上打开任务管理器,看看notepad.exe是否出现在正在运行的进程列表中。

我建议先从命令行尝试运行psexec,然后再尝试通过代码调用它。

psexec \\serverName "notepad.exe"

您可能还想使用“交互”标志,以便可以与目标桌面进行交互。

psexec \\serverName "notepad.exe" -i

它也没有启动该进程,我已经检查过了。 - MrProgram
在命令行上运行时,您是否收到了错误?源计算机和目标计算机是否都连接到同一个域?如果是这样,运行psexec命令的帐户是否在目标计算机上具有权限?尝试将该帐户添加到目标工作站的本地管理员组中。 - Peter Evans
另一个可以尝试的测试是从源计算机到目标计算机尝试映射网络驱动器。请尝试从命令行运行以下命令:net use \serverName\c$ - Peter Evans
没有错误。嗯...域名是相同的。权限也正确。 - MrProgram
请尝试检查目标服务器防火墙上的端口135和445是否开放。 - Peter Evans
没有端口问题 =/ - MrProgram

2
您的 UNC 路径看起来不太好。
在字符串连接后,它会变成类似这样的形式。
  "\\serverNameC:\WINDOWS\notepad.exe"

尝试将其打印出来。请查看有关MSDN上的UNC的文档以及一些示例此处(或在Google中搜索UNC路径)。
如果您只有默认共享,那么它应该是类似于:
  "\\serverName\C$\WINDOWS\notepad.exe"

或者使用psexec,但在那里必须小心双引号

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

另外,请确保目标机器上的“服务器”服务正在运行。
PsExec在远程系统上启动可执行文件,并控制可执行文件进程的输入和输出流,以便您可以从本地系统与可执行文件进行交互。 PsExec通过从其可执行映像中提取一个名为Psexesvc的嵌入式Windows服务,并将其复制到远程系统的Admin $共享中来实现。然后,PsExec使用具有远程接口的Windows服务控制管理器API在远程系统上启动Psexesvc服务。
Admin $共享由“服务器”服务创建和管理,因此您需要它运行才能使psexec工作(参见http://windowsitpro.com/systems-management/psexec)。

现在你提到了它,我会尝试一下C$。 - MrProgram
嗯,好的。Psexec在服务器上,所以这不应该是个问题。但是命令行我不确定。 - MrProgram
psexec 运行在你的机器上。它“提取”一个服务(嵌入在自己的资源中),将其复制到服务器或“目标”机器上,并启动它。复制使用 Admin$ 共享完成;这就是为什么需要启动“服务器”(自动或手动)。 - Lorenzo Dematté
我已经尝试过@"\" + serverName + @"C:\WINDOWS\notepad.exe"; 和@"\" + serverName + @"C$\WINDOWS\notepad.exe";。但都没有成功。 - MrProgram
1
我现在已经把它搞定了。使用 @"\" + serverName + @" -i C:\WINDOWS\notepad.exe"; - MrProgram
显示剩余2条评论

0

仅仅是为了扩展当前版本的答案。 由于操作系统策略可能会存在执行 psexec 的问题,为了启用远程控制,您需要修改注册表:

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

您可以检查这个:远程 UAC LocalAccountTokenFilterPolicy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接