基于WMI的局域网计算机管理的实践
2020-12-14秦子实
秦子实
摘要:随着企业内网业务的增多,接入的计算机规模也逐渐增大,网络拓扑也随之逐渐复杂,这种现象使得企业运维部门对接入计算机的管控难度越来越高。而使用域策略等静态管理方法仅能满足部分需求,难以直接进行计算机的运行时状态管控。因此,运维部门需要一种更加通用且较为动态的自动化计算机管控方法,不仅能够设置静态策略,还可以获取运行时数据,并远程执行一些特定的运行时操作。本文设计并实现了一种基于WMI的计算机运行时管理方法,通过Windows自带的WMI读写特定的属性,或执行特定脚本,以实现动态的自动化计算机管理。该方法具有容易开发、方便部署等特点,适合运维部门在局域网中自定义解决方案。
关键词:WMI;终端管理;Python
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2020)28-0070-02
1 概述
在企业内部办公网络,特别是安全级别较高且存在物理隔离的局域网中,由于办公网络规模的扩大,对计算机的控制要求也在逐渐增加,普通的通过域策略控制计算机的静态管理办法已经难以满足运维部门的管理要求。为了满足一些安全级别较高的新标准,局域网计算机管理应能够实现实时监控终端进程、读写系统属性或注册表、执行脚本、启停服务等功能。同时,为了满足管控的通用性、靈活性,以节约运维人力成本,不应该使用给每台计算机安装监控客户端的方法,而应该直接使用系统自带功能通过网络直接获取,从而降低管理的复杂度并减少疏漏。
本文针对上述需求,利用Windows自带的WMI,配合SNMP和域策略的使用,设计并实现了通往网络直接采集计算机的运行时数据,并实时执行运维脚本、配置系统属性,做到易开发、易部署、易拓展,提升网络整体安全性,并降低运维成本。
2WMI简介
2.1 WMI技术
WMI,全称为Windows Management Instrumentation,即Windows管理工具,是微软Windows系列操作系统从NT时代就自带的一种管理工具,支持通过网络对计算机进行远程管控。通过WMI连接到目标计算机,我们可以监视计算机中几乎所有资源和状态,包括但不限于进程运行时状态、内存/硬盘资源、网络使用、安全策略、用户和组等。此外,WMI还支持远程执行程序或脚本,网络管理者通过此功能即可执行任何期望的操作。
2.2 WMI网络环境
通过WMI监控局域网中的计算机,需要域控制器和支持SNMP的交换机进行简单配合。常见的局域网接入拓扑如下图所示:
其中,域控制器需要设置一些安全策略,包括开放WMI对应的防火墙135端口,保证WMI能够建立连接;设置统一的administrators组的账号密码供WMI能够成功认证。支持SNMP的交换机用于实时获取ARP信息,是一种简便且可靠的获取当前在线计算机IP列表的方法。
3实现方案
3.1 WMI连接
本文选择Python下的wmi库实现。需要注意的是,wmi依赖pywin32库与com组件进行交互,因此需要先安装pywin32,而该库是平台相关的,正常情况下需要通过源码进行平台编译。本文使用简便方法,即从互联网上直接下载非官方的已编译wheel文件安装,下载时注意自己的Python版本和系统平台版本即可,比如Python 3.6用户在Windows 2012服务器上部署,则下载诸如“pywin32-224-cp36-cp36m-win_amd64.whl”的文件即可。
WMI运行环境准备完毕后,通过从交换机SNMP的ARP数据中,可以确定当前在线的所有计算机。接下来使用域控制器下发的本地管理员账号密码进行连接,例如某在线计算机IP为“192.168.10.11”,其所在域下发的本地管理员账号密码为“administrator/passw0rd”,则wmi连接该计算机的代码为:
若连接完成后无异常抛出,则可以通过上例中的变量“c”得到目标计算机的WMI根实例。
3.2 WMI常用方法
根实例中的所有可用WMI功能类存放在“c.classes”中,用户可以根据场景选择相应的功能。对于计算机的状态监控,运维部门最常用的是运行时进程、内存/硬盘资源、网络资源、安全策略、用户和组等信息。
1)进程:通过WMI查看运行时进程,需要使用“c.Win32_Process()”,该方法返回运行时进程列表,可以直接通过for循环遍历。每个WMI获取的进程实例包含进程ID、名称、命令行等详细信息,基本满足各种场景需求。例如,在某场景中,运维人员需要了解目标计算机是否运行了特定安防软件,或是是否运行了禁止使用的软件,则可以通过“process.CommandLine”属性获取到该进程的完整命令行。如用户使用Word编辑“D:\test.docx”的进程,其命令行为“"C:\Program Files (x86)\Microsoft Office\Office14\WINWORD.EXE" /n "D:\test.docx"”。
2)操作系统概况:通过WMI查看操作系统详细信息,需要使用“c.Win32_OperatingSystem()”,该方法返回当前操作系统概况详情,包括系统名称、版本、启动盘路径、计算机名、空余内存、当前进程数等信息。例如,在某场景中,运维人员需要了解目标计算机操作系统类型及安装日期,则可以通过“c.Win32_OperatingSystem()[0].Name”和“c.Win32_OperatingSystem()[0].InstallDate”获取,其返回值为“'Microsoft Windows 7 旗舰版 |C:\\Windows|'”和“'20170421143026.000000+480'”。
3)磁盘空间:通过WMI查看各磁盘状态,需要使用“c.Win32_LogicalDisk()”,该方法返回目标计算机逻辑磁盘列表,可以直接使用for循环遍历。每个WMI获取的逻辑磁盘实例包含卷名、总空间、剩余空间、文件系统等详细信息。例如,在某场景中,运维人员需要了解目标计算机各硬盘剩余空间:
4)用户和组:通过WMI查看各计算机上的用户,需要使用“c.Win32_Account()”,该方法返回目标计算机的所有用户列表,可以直接使用for循环遍历。每个WMI获取的账号实例包含账号属主及属组、所属域、账号及密码状态等详细信息。例如,在某场景中,运维人员需要掌握来宾账户状态,则可以通过遍历列表,查找“account.Name =='Guest'”,若“account.Status == 'Degraded'”則可以确定来宾账户已禁用。
5)服务:通过WMI查看各计算机上的服务,需要使用“c.Win32_Service()”,该方法返回目标计算机的所有注册的服务列表,可以直接使用for循环遍历。每个WMI获取的服务实例包含命令行路径、进程ID、当前状态、启动模式等详细信息。例如,在某场景中,运维人员需要查看瑞星杀毒服务运行状态,则可以通过遍历列表,查找“service.Name =='RavService'”,若“account.Started== 'TRUE'”则可以确定瑞星杀毒服务已启动。
6)启动项:通过WMI查看各计算机上的启动项,需要使用“c.Win32_StartupCommand()”,该方法返回目标计算机的启动项列表,可以直接使用for循环遍历。每个WMI获取的启动项实例包含完整命令行、注册表项、所属用户等详细信息。例如,在某场景中,运维人员需要确认身份认证系统是否安装且注册,则可以通过遍历列表,若存在“startup.Caption=='GM3000PCSCMon'”则可以确定身份认证Key已安装并注册为启动项,可以通过“startup.Location”查看具体注册表项。
3.3 WMI执行程序
上文中的“c.Win32_Process()”方法可以返回进程列表,而“c.Win32_Process”则返回一个名为“Win32_Process”的类,该类具有名为“create()”的方法用于远程创建进程。该函数的参数有三个:命令行、工作路径(可选)、启动信息(可选),其返回值为进程ID和进程返回值。例如,在某场景下,运维人员需要在指定计算机上下载并运行位于服务器上的补丁程序“http://192.168.100.10:8888/xxx.exe”,则可以分为两步实施。第一步,利用“certutil.exe”进行下载,该程序为NT时代的Windows自带程序,可以用于命令行下载远程连接,我们通常将程序下载至“C:/Windows/Temp”临时文件夹中,以便于管理、删除:
如果预计所执行的程序或脚本运行时间较长,则可以通过进程ID建立“watch”函数,监控函数将在进程结束后返回:
4 结束语
本文介绍了通过WMI远程获取指定计算机状态、下载并执行程序的简便方法,该方法不需要预装任何客户端或程序,运维人员只需要掌握计算机的本地管理员密码,就可以方便地对局域网中的在线计算机进行远程运维。这是一种低成本、高可靠、维护方便的计算机运维管理方法。
【通联编辑:梁书】