尝试通过 cmd 外壳在远程计算机上启动 exe 或 bat 文件



从命令行运行以下命令以在远程计算机上启动进程

wmic /node:remotemachine /user:localadmin process call create "cmd.exe /c C:tempmyfoldertest.bat"

基本上只是

echo Some Text > output.txt

我通过双击批处理文件进行了测试,它创建了输出.txt文件。

批处理文件只是回显到文件。我这样做是为了看看它是否真的运行。

cmd 进程启动。我可以在流程中看到它,但批处理文件永远不会创建文本文件。

我开始尝试从我的 C# 应用程序运行 EXE,但它将为可执行文件创建进程,但可执行文件执行的操作永远不会发生。

所以我开始测试其他方法来做同样的事情,我遇到了同样的问题。 它创建进程,但实际上并不运行 BAT 或 EXE。

任何帮助将不胜感激。

我需要更具体

我在 C# 应用程序中使用以下代码:

public static void ConnectToRemoteClient(string client_machine, string target_exe )
{
var connection = new ConnectionOptions();
object[] theProcessToRun = { target_exe };
var wmiScope = new ManagementScope($@"\{client_machine}rootcimv2", connection);
wmiScope.Connect();
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
managementClass.InvokeMethod("Create", theProcessToRun );
}   
}

它的调用方式如下:

使用以下语法调用它:

string exe = string.Format(@"cmd.exe /c C:tempMyfoldertest.bat");
ConnectToRemoteClient("ClientMachine", exe);

它将启动该过程,我看到cmd.exe正在运行,但测试.bat操作从未发生。

告诉 WMIC 运行单个命令非常简单。 一旦我们尝试将一个命令嵌套在另一个命令中,就会出现麻烦。 :-)

由于这种情况有一个外部命令(cmd.exe)和一个内部命令(C:\temp\Myfolder\test.bat),因此诀窍是以WMIC可以使用的方式将它们分开。 有 3 种技术可以工作,但特殊字符问题最少的一种是单换行到双换行方法。 实际上,您可以在外部命令两边使用单引号,在内部命令两边使用双引号。 例如:

wmic /node:NameOfRemoteSystem process call create 'cmd.exe /c "whoami /all >c:tempz.txt"'

以这种方式包装将保留重定向器 (>),并且也不需要您在内部命令上加倍反斜杠。

示例输出:

dir \NameOfRemoteSystemc$tempz.txt
File Not Found
wmic /node:NameOfRemoteSystem process call create 'cmd.exe /c "whoami /all >c:tempz.txt"'
Executing (Win32_Process)->Create()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
ProcessId = 20460;
ReturnValue = 0;
};
dir \NameOfRemoteSystemc$tempz.txt
03/27/2019  04:40 PM            17,977 z.txt

请使用下面提到的powershell命令

Invoke-Command -ComputerName  <remoteMachine> -Credential $cred -ScriptBlock {<location of batch file>}

最新更新