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 ...
随机推荐
- Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试
前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...
- FreeSWITCH的安装与使用
FreeSWITCH
- NABCD-name not found
项目 内容 课程 2020春季计算机学院软件工程(罗杰 任健) 作业要求 团队项目选择 项目名称 FOTT 项目内容 在OCR-Form-Tools开源项目的基础上,扩展功能,支持演示更多的API,例 ...
- 通过CRM系统改变传统工作模式
在现在这个互联网时代,同行业的竞争越发激烈,因此许多企业都选择使用CRM来提高企业的销售业绩.CRM客户关系管理系统是能够优化企业的销售流程.维护良好的客户关系.对销售流程进行管理的强大工具.但是很多 ...
- CRM系统实施中如何避免“踩雷”
CRM系统实施后,效果没有达到预期是很多企业出现的情况.而最主要的原因就是在实施之前没有足够的思考和相应的计划.那么,企业应如何避免CRM系统实施时"踩雷"?这里有几条建议希望可以 ...
- 解决SSH自动断线,无响应的问题。
解决SSH自动断线,无响应的问题. 3 Replies 在连接远程SSH服务的时候,经常会发生长时间后的断线,或者无响应(无法再键盘输入). 总体来说有两个方法: 1.依赖ssh客户端定时发送心跳. ...
- Mysql不知道默认密码情况下登录/重置/忘记密码
场景一: 基础系统:linux 镜像:LAMP环境(Ubuntu 18.04 Apache PHP7.0) 问题:ERROR 1405 (28000): Access denied for user ...
- git OpenSSL SSL_connect问题
遇到这个问题,查找别人也遇到,省时间不写了直接复制 在使用Git来克隆仓库报了错误,如下: fatal: unable to access 'https://github.com/xingbuxing ...
- 【Java】Jackson解析xml的坑
为了获取xml数据,在spring mvc中针对 @ResponseBody配置了jackson. 刚用的时候内心是狂喜的,终于不用自己解析了---- but----------还是有坑的-- 坑一 ...
- 优秀电路资料--- IOT方案
完整的IOT方案 http://www.cirmall.com/circuit/4117/%E3%80%90%E5%BC%80%E6%BA%90%E3%80%91%E5%AE%8C%E6%95%B4% ...