VBS脚本编程(10)——编写WMI脚本
WMI介绍
- 是一项核心的Windows管理技术。
- 采用统一的、基于开放标准的、可扩展的面向对象接口的系统管理基础结构。
- 支持脚本编程,使管理员的日常管理自动化。
- 提供了统一的机制让用户来管理本地和远程的计算机。
- 由微软在1996年首先提出,由DMTF(Distributed Management Task Force,分布式管理任务组)管理维护。
- 其数据模型称为CIM(Common Information Model,公共信息模型),是一个面向对象的模型,统一定义了一组类和名称空间。
- 在计算机上启动一个进程。
- 设定在特定时间运行特定服务。
- 远程关闭计算机。
- 当磁盘余额小于预定值时记录到事件日志。
- 管理、监测IIS/SQL/Exchange/SMS/MOM等微软系列产品。
- 管理提供相应WMI Provider的第三方应用。
- ……
Set wmi = GetObject("winmgmts:\\")
Set objDisk = wmi.get("Win32_LogicalDisk.DeviceID='C:'")
Wscript.Echo objDisk.FreeSpace



命名空间与路径
常用的脚本对象库
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer
Set colItems = objSWbemServices.ExecQuery("Select * from Win32_CDROMDrive")
For Each objItem in colItems
WScript.Echo "光盘驱动器的类型: " & objItem.Caption
WScript.Echo "盘符是: " & objItem.Id
Next
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer
Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Processor")
For Each objSWbemObject In objSWbemObjectSet
Wscript.echo "CPU的型号为:" & objSWbemObject.name
Next
WQL查询语言
- 每个WQL语句必须以SELECT开始
- SELECT后跟你要查询的属性名(对应SQL的字段名),也可以像SQL一样,以*表示所有属性值
- FROM后跟关键字
- 查询的类名字
- 另外,如果你想精确查询结果还可以加上WHERE条件从句。比如某个类有Enable属性,你可以在查询的时候加上WHERE ENABLE=true。
- WQL是SQL的一个子集,但不支持更新、删除和排序等操作,可用于返回选定实例的选定属性
- SELECT 必选项。代表WQL语句的开始,
- properties 必选项。代表想查询的属性名字。可以是多个属性名,也可查询所有属性值,用*代替。
- FROM 必选项。跟在properties的后面。
- Class 必选项。代表想要查询的类的名称。
- where clause 可选项。where 从句和相关条件语句,用来缩小查询范围。
- AND运算符,连接两个逻辑运算,当同时满足条件时通过。
- OR运算符,连接两个逻辑运算,当至少一个满足条件时通过。
- = 等于
- > 大于
- < 小于
- <= 小于等于
- >= 大于等于
- <> 或 != 不等于
- Is [not] [不]是,仅仅用于比较NULL的时候
- "%"代表一个或者多个字符。 例如,%Office%可代表"My Offices," "Office VPN,"或"Office." Office%可代表"Offices"或"Office VPN,"但是不能代表"My Offices,"
- "[ ]”返回参数范围。 例如"[A-Z]ars"可代替"Mars," "Wars," and "Tars,"但是不能代替"Stars."
- "^"取范围的反面。 例如"[^A-M]ars"可代替"Wars"和"Tars,"但是不能代替"Mars"因为"M"不再指定范围内。
- "_"代替单个字符。 "M_rs"可代替"Mars," "M3rs,"
- __CLASS 在查询结果集中对象继承的类对象引用。
- GROUP Clause GROUP子句使WMI生成一个表示一组事件的通知。
- ISA ISA运算符是WQL特定的运算符,可以在事件查询中使用。当ISA包含在事件查询的WHERE子句中时,它将请求类层次结构中而不是特定事件类中所有类的事件通知。
- WITHIN 指定轮询的间隔或者分组区间,一般在event查询中使用此子句。
- REFERENCES OF 获取所有引用特定源实例的关联实例集,一般在schema和data查询中使用,REFERENCES OF语句与ASSOCIATORS OF 语句类似,。
- KEYSONLY 在REFERENCES OF和ASSOCIATORS OF 查询中用来确认返回的结果实例集中只有关键的实例/属性被填充。以此来降低查询的调用成本。
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set colServices = objSWbemServices.ExecQuery("SELECT * FROM Win32_Service Where state = 'Running'")
WScript.Echo "服务名称---服务描述"
For Each objService In colServices
WScript.Echo objService.name&"---"&objService.Description
Next
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set colAccounts = objSWbemServices.ExecQuery("SELECT * FROM Win32_Account")
WScript.Echo "账户名称---账户描述---账户SID"
For Each objAccount In colAccounts
WScript.Echo objAccount.name&"---"&objAccount.Description&"---"&objAccount.SID
Next
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set colProcess = objSWbemServices.ExecQuery("SELECT * FROM Win32_Process")
WScript.Echo "进程名称---PID---所占内存"
For Each objProcess In colProcess
m = Int(CSng(objProcess.WorkingSetSize)/1024/1024*100)/100
WScript.Echo objProcess.name&"---"&objProcess.ProcessId&"---"& CStr(m)&"MB"
Next
WMI事件监控与处理
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set objEventSource = objSWbemServices.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent " _
& "WITHIN 5" _
& "WHERE TargetInstance ISA 'Win32_Process'" _
& "AND TargetInstance.Name = 'NotePad.exe'")
Set objEventObject = objEventSource.NextEvent()
WScript.Echo "记事本已打开"
On Error Resume Next
Dim objWMI, objSHELL, objEvents, objEvent
Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
Set objSHELL = CreateObject("Wscript.Shell")
Set objEvents = objWMI.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 5 " _
& "Where TargetInstance Isa 'Win32_LogicalDisk' " _
& "And TargetInstance.DriveType = 2")
Do While True
Set objEvent = objEvents.NextEvent()
Select Case objEvent.Path_.Class
Case "__InstanceCreationEvent"
objSHELL.Popup "检测到盘符号为" & objEvent.TargetInstance.Name & "的U盘插入",3,"系统提示"
Case "__InstanceDeletionEvent"
objSHELL.Popup "盘符号为" & objEvent.TargetInstance.Name & "的U盘被移除",3,"系统提示"
End Select
Loop
On Error Resume Next
Dim objWMI, objSHELL, objEvents, objEvent, Message, Return
Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
Set objSHELL = CreateObject("Wscript.Shell")
Set objEvents = objWMI.ExecNotificationQuery _
("Select * From __InstanceCreationEvent Within 3 " _
& "Where TargetInstance Isa 'Win32_Process'")
Do While True
Set objEvent = objEvents.NextEvent()
Message = "新进程" & objEvent.TargetInstance.Name _
& "被启动,请在10秒内点击确认允许,否则系统将强行关闭!"
Return = objSHELL.Popup(Message,10,"系统警告",0+48)
If Return = -1 Then
Return = objEvent.TargetInstance.Terminate
If return <> 0 Then
Message = "进程" & objEvent.TargetInstance.Name _
& "关闭失败,请尝试手动关闭!"
objSHELL.Popup Message,3,"系统警告",0+48
End If
End If
Loop
VBS脚本编程(10)——编写WMI脚本的更多相关文章
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件.目录属性 shell数组简单用法 $( ) 和$ ...
- 【在 Nervos CKB 上做开发】Nervos CKB脚本编程简介[2]:脚本基础
CKB脚本编程简介[2]:脚本基础 原文作者:Xuejie 原文链接:Introduction to CKB Script Programming 2: Script 本文译者:Shooter,Jas ...
- 【Shell脚本编程系列】Shell脚本开发的习惯和规范
1.开头指定脚本解释器 #!/bin/sh或#!/bin/bash 2.开头加版本版权信息 #Date #Author #Mail #Function #Version 提示:可配置vim编辑文件时自 ...
- 从此编写 Bash 脚本不再难【转】
从此编写 Bash 脚本不再难 原创 Linux技术 2017-05-02 14:30 在这篇文章中,我们会介绍如何通过使用 bash-support vim 插件将 Vim 编辑器安装和配置 为一个 ...
- shell脚本编程(一) 变量、条件判断、循环
目录 1. shell脚本编程 2. 运行 Shell 脚本有两种方法 3. 变量 4. 本地变量 5. 环境变量 6. 参数变量 7. 多行注释 8. if条件判断 ...
- 【VI Script】你不知道的脚本编程
前言 近期,小黑在写程序的时候,经常会遇到一些重复性的工作.尤其是在写到QMH(Queued Message Handler)程序时,经常需要创建UI界面上的一些控件引用,并且在程序中捆绑成簇使用. ...
- Vbs 脚本编程简明教程之一
—为什么要使用 Vbs ? 在 Windows 中,学习计算机操作也许很简单,但是很多计算机工作是重复性劳动,例如你每周也许需要对一些计算机文件进行复制.粘贴.改名.删除,也许你每天启动 计算机第一件 ...
- 关于shell脚本编程的10个最佳实践
每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使 用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...
- shell脚本编程的10个最佳实践
摘要:每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快.更好的学习这些编程技巧. 每一个在U ...
随机推荐
- python爬虫——拉钩网python岗位信息
之前爬取的网页都是采用"GET"方法,这次爬取"拉勾网"是采取了"POST"的方法.其中,"GET"和"POS ...
- Linux USB ECM Gadget 驱动介绍
1 USB ECM介绍 USB ECM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Ethernet Networking Control Mo ...
- Map 实现类之一:HashMap
Map 实现类之一:HashMapHashMap是 Map 接口 使用频率最高的实现类.允许使用null键和null值,与HashSet一样,不保证映射的顺序.所有的key构成的集合是Set:无 ...
- 用JIRA管理你的项目——(一)JIRA环境搭建
JIRA,大家应该都已经不陌生了! 最初接触这个工具的时候,我还在一味地单纯依靠SVN管理代码,幻想着SVN可以有个邮件通知,至少在项目成员进行代码修改的时候,我可以第一时间通过邮件获得这个消息! 当 ...
- groovy脚本语言基础1
一 搭建groovy环境 安装JDK [root@node1 ~]# yum -y install java-11-openjdk 官网下载groovySDK下载 https://groovy.ap ...
- vim 编辑器高级用法
vim编辑器介绍 如果没有安装vim使用下面方式安装 yum -y install vim vi与vim的不同 两者最大的不同:vim可以高亮显示,vi不可以. vim三种工作模式 普通模式 # 光标 ...
- Python数学建模-02.数据导入
数据导入是所有数模编程的第一步,比你想象的更重要. 先要学会一种未必最佳,但是通用.安全.简单.好学的方法. 『Python 数学建模 @ Youcans』带你从数模小白成为国赛达人. 1. 数据导入 ...
- 3D网页小实验-基于Babylon.js与recast.js实现RTS式单位控制
一.运行效果 1.建立一幅具有地形起伏和不同地貌纹理的地图: 地图中间为凹陷的河道,两角为突出的高地,高地和低地之间以斜坡通道相连. 水下为沙土材质,沙土材质网格贴合地形,河流材质网格则保持水平. 2 ...
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- bat脚本总结
1.修改密码 @echo off set /p b=请输入新密码: net user %username% %b% echo 密码修改成功 %b% 请牢记你的密码 pause 2.删除hosts文件并 ...