最近研究了一下Windows如何像Linux那样多用户同时远程执行命令,发现了有好几种方法可以实现,今天介绍其中一种Wmic。


wmic是Windows的WMI的一部分,它提供了远程管理功能,可以通过 wmic 命令在远程计算机上执行命令。wmic远程执行命令是无回显的,执行结果并不会返回到当前计算机。
要在远程计算机上执行 wmic 命令,需要使用 /node 选项指定远程计算机的名称或 IP 地址,使用 /user 和 /password 选项指定凭据。使用process call create语句在远程计算机上创建一个进程
例如:查询远程计算机的网络信息并将结果保存到c盘的ip.txt

1
wmic /node:ComputerIP /user:admin /password:Password process call create "cmd /c ipconfig>c:\ip.txt"

例如远程更新补丁,远程卸载安装软件等操作。
更新Windows补丁:

1
wmic /node:ComputerIP /user:admin /password:Password process call create "wusa windowsMSUpath /quit /norestart"

通过这个远程执行命令的特性,我们可以将要在远程的计算机上编写好bat脚本来执行更加复杂的操作。
远程执行c盘下a.bat脚本

1
wmic /node:ComputerIP /user:admin /password:Password process call create "cmd /c c:\a.bat"

当我们要在多台电脑上执行同一个脚本时可以编写一个bat脚本循环读取多台电脑的ip执行远程代码

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
setlocal enabledelayedexpansion
REM 设置要远程的计算机列表文件位置和要执行文件位置
set "computer_list=C:\computer_list.txt"
set "bat_file_path=C:\test.bat"

for /f %%a in (computer_list) do (
REM 复制bat文件到远程计算机
xcopy /Y %bat_file_path% \\%%a\c$\
REM 发送代码执行拷贝下来的bat脚本
wmic /node:ComputerIP /user:admin /password:Password process call create "cmd /c c:\test.bat"
)

下面写一个应用实例,批量更新Windows,先使用xcopy将文件拷贝到目标计算机,然后使用wmic发送命令,使用dims更新Windows映像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
setlocal enabledelayedexpansion

REM 设置要更新的 MSU 文件路径和计算机列表
set "update_file_path=C:\software\update.msu"
set "computer_list=C:\path\to\your\computerlist.txt"

REM 设置要使用的管理员账号和密码
set "username=Administrator"
set "password=password"

REM 循环遍历计算机列表并执行更新操作
for /f %%a in (%computer_list%) do (
REM 复制 MSU 文件到远程计算机
xcopy /Y %update_file_path% \\%%a\c$\software\"

REM 在远程计算机上执行更新
set "dism_command=dism /online /add-package /packagepath:C:\software\update.msu /quiet /logpath:C:\updates\updatalog.txt"
wmic /node:%%a /user:%username% /password:%password% process call create "%dism_command%"
)
REM 如果遇到无法更新的情况可以使用 expand -F:* <msu_file_name> <destination_folder>将MSU文件解包为CBA文件再使用dism命令安装