利用wmicWindows主机批量执行脚本
20141113
AM 10:53
 
    与类Unix操作系统相比较,Windows系统由于对字符界面的支持不完善,并没有与类Unix系统的shell可以相提并论的工具(cmd的命令行特性难用程度与shell相比简直令人发指,虽然目前Windows推出所谓的PowerShell,但要跟上bashkorn shell等前辈还需要时间来沉淀)。一直以来,对于Windows进行批量管理大多依靠于图形界面,效率低下且可靠性不足。
    其实Windows本身提供了中国高清vpswindows在线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脚本大量使用了wmicbat自身的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
 
::以下为循环等待,每次等待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:\Scripts\tmp\
::删除本地的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_wmic.bat内容结束 :::::::::::::::::::::::::::::::::::
 
假设现在需要对ip192.168.0.2,密码为AdminPassWindows Server执行扫描,则只需在本地cmd中执行以下命令即可:
chk_by_wmic.bat 192.168.0.2 AdminPass
假设有多台服务器,IP和密码写入到一个名为的文件中,每行第一列为IP,第二列为密码,然后利用以下命令按行读取并执行:

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