如何在远程计算机上执行命令?

25

我在服务器上有一个共享文件夹,需要远程执行一些文件上的命令。怎样做?

为了使其正常工作,服务器上需要哪些服务运行?

一些细节:只能使用C#,不能在服务器上安装任何程序。


你想要在远程机器上运行命令还是本地机器上运行? - GEOCHET
你正在使用哪些操作系统?这只涉及Windows到Windows的通信吗? - Anderson Green
5个回答

39

另一种解决方案是使用WMI.NET或Windows Management Instrumentation

通过使用.NET Framework命名空间System.Management,您可以使用Windows Management Instrumentation(WMI)自动化管理任务。

代码示例

using System.Management;
...
var processToRun = new[] { "notepad.exe" };
var connection = new ConnectionOptions();
connection.Username = "username";
connection.Password = "password";
var wmiScope = new ManagementScope(String.Format("\\\\{0}\\root\\cimv2", REMOTE_COMPUTER_NAME), connection);
var wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
wmiProcess.InvokeMethod("Create", processToRun);

如果您遇到身份验证问题,请检查DCOM配置。

  1. 在目标计算机上,从命令提示符运行dcomcnfg
  2. 展开组件服务\计算机\我的电脑\DCOM配置
  3. 查找Windows管理指令,其GUID为8BC3F05E-D86B-11D0-A075-00C04FB68820(您可以在详细信息视图中查看此内容)。
  4. 编辑属性,然后在权限选项卡下添加您要登录的用户名。
  5. 您可能需要重新启动服务或整个计算机。

注意: 用于远程进程的所有路径都需要在目标计算机上本地化。


4
这个解决方案可以运行一个应用程序,但没有交互(没有界面)。 - unruledboy
命令行参数的方法是什么?它只是附加在可执行文件名后面吗? - spy
有没有 .NET Core 的替代方案? - user122222

8

你可以使用SysInternal的PsExec


到目前为止,我尝试使用PsExec调用appcmd.exe的所有尝试都失败了,或者在读取成功长度>1046后卡住了。 - Maslow

1

在您的情况下,您可以尝试以下方法:

  1. 将共享文件夹映射到计算机上的驱动器或文件夹中。(这里是如何操作
  2. 像访问本地文件一样访问映射的驱动器/文件夹。

无需安装任何内容。除了启用文件夹共享的服务外,不需要运行其他服务。

如果您可以访问共享文件夹并将其映射到计算机上,则大多数功能应该与本地文件一样正常工作,包括命令提示符和所有资源管理器增强工具。

这与使用 PsExec(或 RDP 远程桌面连接)不同,因为您不需要在远程服务器上拥有管理员权限和/或远程桌面/终端服务连接权限,您只需要能够访问那些共享文件夹即可。

还要确保您具有运行想要在这些共享文件夹上运行的任何命令/工具所需的所有必要安全权限。


如果您希望在目标机器上进行处理,则可以尝试@divo和@recursive指出的PsExec,类似于:

PsExec \\yourServerName -u yourUserName cmd.exe

这将为您在远程计算机上提供一个命令提示符从那里您可以执行任何操作。

我不确定,但我认为您需要运行服务器(lanmanserver)或终端服务(TermService)服务(应该已经在运行中)。


10
如果您通过共享文件夹运行可执行文件,它们不会在共享服务器上运行,而是在浏览客户端上运行。 - recursive
如果“某些”文件不是很多文件,那么我认为这不是一个问题。 - chakrit

0
try
{
    string AppPath = "\\\\spri11U1118\\SampleBatch\\Bin\\";
    string strFilePath = AppPath + "ABCED120D_XXX.bat";
    System.Diagnostics.Process proc = new System.Diagnostics.Process();

    proc.StartInfo.FileName = strFilePath;
    string pwd = "s44erver";

    proc.StartInfo.Domain = "abcd";
    proc.StartInfo.UserName = "sysfaomyulm";

    System.Security.SecureString secret = new System.Security.SecureString();
    foreach (char c in pwd)

        secret.AppendChar(c);

    proc.StartInfo.Password = secret;
    proc.StartInfo.UseShellExecute = false;

    proc.StartInfo.WorkingDirectory = "psexec \\\\spri11U1118\\SampleBatch\\Bin ";

    proc.Start();
    while (!proc.HasExited)
    {
        proc.Refresh();
        // Thread.Sleep(1000);
    }

    proc.Close();
}
catch (Exception ex)
{
    throw ex;
}

-3

我使用PureMPI.net附带的小工具execcmd.exe。它的语法如下:

execcmd \\yourremoteserver <your command here>

没有比这更简单的了 :)


3
很遗憾,那个网站好像无法访问了 - 有人知道是否有镜像站点吗? - Contango

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