利用wmic对Windows主机批量执行脚本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用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_wmic.bat批处理脚本,只需循环对所有目标服务器执行该脚本即可。
chk_by_wmic.bat脚本内容及注释:::::::::::::::::::::::::::::::::::: chk_by_wmic.bat内容开
始 :::::::::::::::::::::::::::::::::::
::以下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:\Scripts\tmp\96c221be-6ab2-ef53-1589-fe16877914ca.vbs Z:\
::在目标服务器上执行扫描脚本,扫描脚本执行完成后会在c:\tempshare生成名
为%vnode%*xml的结果文件
wmic /node:%vnode% /user:administrator /password:%vpswd% process
call create "cmd /c cscript 96c221be-6ab2-ef53-1589-
fe16877914ca.vbs","c:\tempshare"
::由于该扫描脚本执行时间很长,且上一条命令执行时,只是调起服务器的进程就会
立即返回,所以要等待扫描脚本执行完再继续
::解决方法是,对z:执行dir检查是否已生成xml结果文件,等待5分钟,发现生
成了%vnode%*xml再继续
@set slptimes=1
goto :sleep