使用 Wmi win32_Process 执行远程进程 - 获取进程的标准输出

Posted

技术标签:

【中文标题】使用 Wmi win32_Process 执行远程进程 - 获取进程的标准输出【英文标题】:Remote Process Execution using Wmi win32_Process - Getting Stdout of Process 【发布时间】:2012-04-25 12:21:08 【问题描述】:

您好,我能够使用 Wmi 执行远程进程,并且能够获得进程的返回值和进程 ID。有什么方法可以获取由 Wmi 启动的进程的输出。例如。如果我启动一个在控制台中打印某些内容的 exe,我将能够使用此 Api 获取这些值。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

您必须将输出重定向到一个文件,然后通过网络读取该文件。

使用 CMD.EXE /S /C 选项来执行此操作。

运行Program.exe的示例命令行:

CMD.EXE /S /C " "c:\path\to\program.exe" "argument1" "argument2"  > "c:\path\to\stdout.txt" 2> "c:\path\to\stderr.txt" "

然后像这样\\servername\c$\path\to\stdout.txt 连接到服务器以读取标准输出结果。

注意:请注意要运行的命令周围的额外引号。这些是确保正确解释命令行所必需的。

【讨论】:

给其他任何试图从 WMI 获取输出的人Win32_process - 请注意上述命令中的额外引号!这些非常重要。阅读cmd.exe /?,了解有关报价处理的更多信息。【参考方案2】:

您可以使用psexec来执行program.exe并通过管道获取stdout

p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while p.poll() is None:
    line = p.stdout.readline()
    line = line.strip().decode('gbk')
    if line:
        print('Subprogram output: []'.format(line))
if p.returncode == 0:
    print('Subprogram success')
    return True
else:
    print('Subprogram failed')
    return False

【讨论】:

以上是关于使用 Wmi win32_Process 执行远程进程 - 获取进程的标准输出的主要内容,如果未能解决你的问题,请参考以下文章

Win32_Printer 远程 WMI 查询真的很慢

是否可以在远程计算机上为 MicrosoftTPM 命名空间查询 WMI? [对 Win32_Tpm 类的远程 WMI 查询失败,HRESULT 0x80041013]

授予远程用户(非管理员)使用 WMI 和 C# 在命名空间 cimv2 中枚举 Win32_Service 服务的能力

WMI:获取已安装软件的列表

如何使用 WMI 了解进程的 CPU 和内存使用情况?

wmi使用的win32类库名