利用wmic对Windows主机批量执行脚本


2023年12月20日发(作者:橱柜定制十大名牌排名)

利用wmic对Windows主机批量执行脚本

2014年11月13日

AM 10:53

与类Unix操作系统相比较,Windows系统由于对字符界面的支持不完善,并没有与类Unix系统的shell可以相提并论的工具(cmd的命令行特性难用程度与shell相比简直令人发指,虽然目前Windows推出所谓的PowerShell,但要跟上bash、korn shell等前辈还需要时间来沉淀)。一直以来,对于Windows进行批量管理大多依靠于图形界面,效率低下且可靠性不足。

其实Windows本身提供了WMI管理规范和接口,专用于支持命令行方式的系统管理,更推出wmic工具来给系统管理员使用,以下是百度百科对于wmic的介绍:

WMIC扩展WMI(Windows Management Instrumentation,Windows管理规范)

,提供了从命令行接口和批命令脚本执行系统管理的支持。在WMIC出现之前,如果要管理WMI系统,必须使用一些专门的WMI应用,例如SMS,或者使用WMI的脚本编程API,或者使用象CIM Studio之类的工具。如果不熟悉C++之类的编程语言或VBScript之类的脚本语言,或者不掌握WMI名称空间的基本知识,要用WMI管理系统是很困难的。WMIC改变了这种情况,为WMI名称空间提供了一个强大的、友好的命令行接口。

概念的介绍总是容易让读者云里雾里,以下试验将演示如何使用wmic以及Windows共享功能来对批量服务器执行一个离线安全扫描脚本并取回结果。

试验背景:

现需要对批量Windows Server服务器进行离线安全扫描,即登录到每一台服务器执行一个vbs脚本,脚本会生成扫描结果文件,然后将结果文件下载到本地。倘若服务器数量不多,那么一台台登录执行也就罢了,但当目标服务器数量达到一定数量后,再手工进行此操作,就成为一件繁琐重复的工作。有人说,懒惰是推动人类文明不断进步的源动力。所以为了偷懒,不,为了人类文明的进步,这个工作必须使用批量和自动化的工具来完成。

实现思路:

将此工作分解为以下步骤,逐一实现:

1、登录Windows Server服务器;

2、上传扫描脚本到目标服务器;

3、执行扫描脚本;

4、下载结果文件;

5、对其他服务器重复前4个步骤。

第1步的登录服务器,传统来说,肯定是使用远程桌面了,但如前面所说,图形界面的东西,要进行批量操作是很麻烦的。那自然要使用字符界面来进行登录了,再自然地想到telnet方式是最简便通用的协议。但现今所有负责任的系统或安全管理人员都会告诉你,想用telnet来连接我的服务器?门都没有!幸好wmic就提供了远程主机的管理接口,使用"wmic /node:IP地址 /user:帐号 /password:密码"的形式可以登录到远程主机执行wmic命令。第3步的执行脚本,其实与登录是同时进行的,此处结合第1、第3步,命令就是:

wmic /node:IP地址 /user:帐号 /password:密码 process call create "cmd

/c cmd命令或脚本"

第2和第4步,上传与下载,其实是同样的需求,如果开通了ftp之类的文件传输服务,自然简单。但当前环境并未开通ftp,所以考虑使用Windows的文件夹共享与网络映射来实现。首先在远端服务器使用wmic创建一个路径为c:tempshare的共享目录,然后将其映射到本地的Z盘,再直接在Z盘上进行文件的读取。

第5步,假设将前4步的所有操作命令放入名为chk_by_批处理脚本,只需循环对所有目标服务器执行该脚本即可。

chk_by_脚本内容及注释:

::::::::::::::::::::::::::::::::::: chk_by_内容开始 :::::::::::::::::::::::::::::::::::

::以下bat脚本大量使用了wmic和bat自身的goto,对于wmic不熟悉的,可百度或直接在任何Windows系统内执行wmic /?来查看帮助

::从命令行读入ip和密码(分别为变量%vnode%和%vpswd%)

@set vnode=%1

@set vpswd=%2

::检查连通性,以下命令为登录到目标服务器,并执行wmic os命令(该命令用于读取系统的一些信息)

::若执行失败,则表示可能出现以下情况:

::1、网络不通

::2、帐号密码错误

::3、未知原因,反正是无法继续了

::检查失败的话,则跳转到:notconn标签(即跳转到脚本中:notconn这一行内容的地方,并从下一行开始继续执行)

wmic /node:%vnode% /user:administrator /password:%vpswd% os >nul ||

goto :notconn

::检测本地的Z盘盘符是否已被占用,若已被占用则无法映射远端的共享目录

dir z: >nul 2>&1 && goto :notZ

::在目标服务器创建c:tempshare目录

wmic /node:%vnode% /user:administrator /password:%vpswd% process

call create "cmd /c mkdir c:tempshare"

::将目标服务器的c:tempshare目录设置为共享

::创建共享的命令格式为:wmic share call create

"Access","Description","MaximumAllowed","Name","Password","Password","Type"

::详见wmic share call /?

wmic /node:%vnode% /user:administrator /password:%vpswd% share call

create "","temp description","","tempshare","","c:tempshare",0

::映射目标服务器的tempshare共享目录到本地的Z盘

net use Z: %vnode%tempshare

::复制扫描脚本到Z盘,即完成上述的步骤1

copy c: Z:

::在目标服务器上执行扫描脚本,扫描脚本执行完成后会在c:tempshare生成名为%vnode%*xml的结果文件

wmic /node:%vnode% /user:administrator /password:%vpswd% process

call create "cmd /c cscript ","c:tempshare"

::由于该扫描脚本执行时间很长,且上一条命令执行时,只是调起服务器的进程就会立即返回,所以要等待扫描脚本执行完再继续

::解决方法是,对z:执行dir检查是否已生成xml结果文件,等待5分钟,发现生成了%vnode%*xml再继续

@set slptimes=1

goto :sleep

::以下为循环等待,每次等待5秒钟,最多等待60次

:sleep

set /a slptimes+=1

if %slptimes% gtr 60 (echo exceeded 5 min && goto :eof)

@echo ---------------- waiting %slptimes% ----------------

::利用ping命令来进行5秒的定时等待

@ping -n 5 localhost >nul

::判断是否已生成xml结果文件,已生成则跳转到:getfile,否则进入下一轮的等待

dir z:*%vnode%*xml >nul 2>&1 || goto :sleep

dir z:*%vnode%*xml >nul 2>&1 && goto :getfile

:::sleep循环已退出(结果文件已生成或超时),开始下载结果文件

:getfile

rem dir z:

::从Z盘将结果文件复制到C盘,即上述步骤的第4步

copy z:*96c221be*xml c:Scriptstmp

::删除本地的Z盘映射,并在目标服务器取消共享

goto :delshare

:delshare

net use z: /delete

wmic /node:%vnode% /user:administrator /password:%vpswd% share where

name="tempshare" call delete

::跳转到:eof,退出脚本

goto :eof

:notconn

@echo =================================== Can't connect to %vnode%

===================================

goto :eof

:notZ

@echo =================================== Can't use Z: %vnode%

===================================

:eof

::::::::::::::::::::::::::::::::::: chk_by_内容结束 :::::::::::::::::::::::::::::::::::

假设现在需要对ip为192.168.0.2,密码为AdminPass的Windows Server执行扫描,则只需在本地cmd中执行以下命令即可:

chk_by_ 192.168.0.2 AdminPass

假设有多台服务器,将IP和密码写入到一个名为的文件中,每行第一列为IP,第二列为密码,然后利用以下命令按行读取并执行:

for /f "tokens=1,2" %i in () do chk_by_ %i %j

至此,利用wmic来对Windows主机批量执行脚本的试验完成。虽说看起来复杂麻烦,但对于无法安装其他批量管理工具的服务器环境,wmic提供了一个可用且可定制的批量管理渠道。


本文发布于:2024-09-21 12:41:21,感谢您对本站的认可!

本文链接:https://www.17tex.com/fanyi/18887.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:脚本   执行   服务器   使用   扫描
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议