# com.wmi 库模块帮助文档

[💻 WMI 查询入门](https://www.aardio.com/zh-cn/docs/examples/COM/WMI/query.html) [📈 WMI 事件回调](https://www.aardio.com/zh-cn/docs/examples/COM/WMI/SWbemSink.html)

## com 成员列表 <a id="com" href="#com">&#x23;</a>

### com.wmi() <a id="com.wmi" href="#com.wmi">&#x23;</a>
[返回对象:ComObject](#ComObject)

### com.wmi(path,computer) <a id="com.wmi" href="#com.wmi">&#x23;</a>
创建并返回 WMI 客户端对象,失败返回 null,  
所有参数可省略,  
@path 默认为 `\root\cimv2`  
@computer 默认为"."

## com.wmi 成员列表 <a id="com.wmi" href="#com.wmi">&#x23;</a>

WMI / Windows Management Instrumentation 客户端。  
用法也可可参考 com.monitor 库源码，以及『 范例 » COM 组件 » WMI 』。  
参考文档 https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-reference

创建 WMI 客户端对象,失败返回 null

### com.wmi._alias <a id="com.wmi._alias" href="#com.wmi._alias">&#x23;</a>
这是一个表对象指定了 WMI 类的别名。

### com.wmi.each() <a id="com.wmi.each" href="#com.wmi.each">&#x23;</a>
[返回对象:SWbemObject](#SWbemObject)

### com.wmi.each(wqlOrObject,parameters,path) <a id="com.wmi.each" href="#com.wmi.each">&#x23;</a>

```aardio
for index,item in com.wmi.each("/*遍历参数  @wqlOrObject 指定的 WMI 对象。  
参数 @wqlOrObject 也可以指定 WQL 查询语句或 WMI 类名。  
可选用参数 @path 指定 WMI 路径，默认为 `\root\cimv2`  

可选用参数 @parameters 指定包含 WQL 参数值的表对象，  
包含 WQL 语句中 `@` 号开头的命名参数值或以 `?` 号为占位符的匿名参数值（数组成员） */") {

}
```

### com.wmi.eachNotification(wqlOrObject,parameters,path) <a id="com.wmi.eachNotification" href="#com.wmi.eachNotification">&#x23;</a>

```aardio
for event,targetInstance  in com.wmi.eachNotification("/*遍历参数  @wqlOrObject 指定的查询事件通知，同步阻塞执行。  
参数 @wqlOrObject 也可以输入 WQL 查询语句或 WMI 类名。  
可选用参数 @path 指定 WMI 路径，默认为 `\root\cimv2`  

可选用参数 @parameters 指定包含 WQL 参数值的表对象，  
包含 WQL 语句中 `@` 号开头的命名参数值或以 `?` 号为占位符的匿名参数值（数组成员） */") {

}
```

### com.wmi.eachProperties(wqlOrObject,parameters,path) <a id="com.wmi.eachProperties" href="#com.wmi.eachProperties">&#x23;</a>

```aardio
for item,index in com.wmi.eachProperties("/*遍历参数  @wqlOrObject 指定的 WMI 对象的属性表。  
参数 @wqlOrObject 也可以输入 WQL 查询语句或 WMI 类名。  
可选用参数 @path 指定 WMI 路径，默认为 `\root\cimv2`  

可选用参数 @parameters 指定包含 WQL 参数值的表对象，  
包含 WQL 语句中 `@` 号开头的命名参数值或以 `?` 号为占位符的匿名参数值（数组成员） */") {

}
```

### com.wmi.formatWqlParameters <a id="com.wmi.formatWqlParameters" href="#com.wmi.formatWqlParameters">&#x23;</a>
格式化参数 @1 指定的 WQL 语句,  
com.wmi.query 等函数调用此函数格式化 WQL 语句

### com.wmi.formatWqlParameters(wql,...) <a id="com.wmi.formatWqlParameters" href="#com.wmi.formatWqlParameters">&#x23;</a>
格式化参数 @1 指定的 WQL 语句,  
参数@2及后续参数指定格式化参数,  
支持 @号 开头的命名参数或以 ? 号为占位符的匿名参数,  
如果参数不是一个表,则调用 string.format 格式化

### com.wmi.get <a id="com.wmi.get" href="#com.wmi.get">&#x23;</a>
可输入 WQL 查询语句或类名，  
如果成功则返回查询结果中的第一个元素。

### com.wmi.get() <a id="com.wmi.get" href="#com.wmi.get">&#x23;</a>
[返回对象:SWbemObject](#SWbemObject)

### com.wmi.get(className,property,path) <a id="com.wmi.get" href="#com.wmi.get">&#x23;</a>
参数 @className 指定 WMI 类名，可省略 "Win32_"前缀 。  
参数 @property 指定要取的属性名（只能包含字母、数字、下划线）。  
可选用参数 @path 指定 WMI 路径，默认为 `\root\cimv2`。  

成功则返回查询结果的首个元素指定属性的值，失败返回 null。  
如果返回值为 CIM_DATETIME 格式的时间字符串，则转换为 time.cim 时间对象。  

例如 aardio 代码 `com.wmi.get("diskdrive","serialnumber")`  
的返回的字符串值与执行 `wmic diskdrive get serialnumber` 命令输出的字符串相同。

### com.wmi.get(wql) <a id="com.wmi.get" href="#com.wmi.get">&#x23;</a>
参数 @wql 可输入 WQL 查询语句或类名。  
仅指定类名时可省略 "Win32_"前缀。  
成功则返回查询结果的首个元素（ COM 对象 ）。  
要注意此函数返回的是单个元素，不一定是能用 com.each 遍历的集合对象。

### com.wmi.get(wql,parameters,path) <a id="com.wmi.get" href="#com.wmi.get">&#x23;</a>
参数 @wql 指定 WQL 查询语句  
可选参数 @parameters 可使用一个表对象指定 WQL 参数值。  
- 表中的命名值指定 WQL 语句中 `@`号 开头的命名参数值。  
- 表中的数组值指定 WQL 语句中以 `?` 号为占位符的数组参数的值。  
可选用参数 @path 指定 WMI 路径,默认为 `\root\cimv2`。  
成功则返回首个查询结果（返回 COM 对象），失败返回 null。  
要注意返回结果中的第一个元素如果不是集合则不能也不需要用 com.each 遍历。  
如果要返回纯 aardio 值可改用 com.wmi.getProperties 。

### com.wmi.get(wql,property) <a id="com.wmi.get" href="#com.wmi.get">&#x23;</a>
参数 @wql 可输入 WQL 查询语句。  
可选用参数 @property 指定要取的属性名（只能包含字母、数字、下划线）。  
成功则返回查询结果的首个元素指定属性的值，失败返回 null。  
如果返回值为 CIM_DATETIME 格式的时间字符串，则转换为 time.cim 时间对象。  

可选用参数 @path 指定 WMI 路径，默认为 `\root\cimv2`。  
可选用参数 @3 及后续参数指定格式化参数。  
如果指定了格式化参数则调用 string.format 格式化参数 @wql 。

### com.wmi.getProperties <a id="com.wmi.getProperties" href="#com.wmi.getProperties">&#x23;</a>
执行 WQL 查询并获取查询结果内的首个元素。  
成功返回包含查询结果内首个元素有效属性名值对的纯表对象（非 COM 对象）。   
失败返回 null 值。

### com.wmi.getProperties(wmiObject) <a id="com.wmi.getProperties" href="#com.wmi.getProperties">&#x23;</a>
将参数 @wmiObject 指定 WMI 对象转换为普通的表对象。  
返回包含该对象所有属性名值对的表对象。  
失败返回 null

### com.wmi.getProperties(wql,parameters,path) <a id="com.wmi.getProperties" href="#com.wmi.getProperties">&#x23;</a>
参数 @wql 指定 WQL 查询语句。  
可选参数 @parameters 可使用一个表对象指定 WQL 参数值。  
- 表中的命名值指定 WQL 语句中 `@`号 开头的命名参数值。  
- 表中的数组值指定 WQL 语句中以 `?` 号为占位符的数组参数的值。  
可选用参数 @path 指定 WMI 路径,默认为 `\root\cimv2`。

### com.wmi.getTable <a id="com.wmi.getTable" href="#com.wmi.getTable">&#x23;</a>
执行 WQL 查询并返回一个包含了所有查询结果的纯数组。  
数组元素为包含 WMI 对象所有属性名值对的属性表（纯值表，非 COM 对象）。  
失败返回 null 值。

### com.wmi.getTable(wql,parameters,path) <a id="com.wmi.getTable" href="#com.wmi.getTable">&#x23;</a>
参数 @wql 指定 WQL 查询语句。  
可选参数 @parameters 可使用一个表对象指定 WQL 参数值。  
- 表中的命名值指定 WQL 语句中 `@`号 开头的命名参数值。  
- 表中的数组值指定 WQL 语句中以 `?` 号为占位符的数组参数的值。  
可选用参数 @path 指定 WMI 路径,默认为 `\root\cimv2`。

### com.wmi.query <a id="com.wmi.query" href="#com.wmi.query">&#x23;</a>
调用 ExecQuery 执行 WQL 查询，返回查询结果。

### com.wmi.query(wql,parameters,path) <a id="com.wmi.query" href="#com.wmi.query">&#x23;</a>
参数 @wql 指定 WQL 查询语句。  
可选参数 @parameters 可使用一个表对象指定 WQL 参数值。  
- 表中的命名值指定 WQL 语句中 `@`号 开头的命名参数值。  
- 表中的数组值指定 WQL 语句中以 `?` 号为占位符的数组参数的值。  
可选用参数 @path 指定 WMI 路径,默认为 `\root\cimv2`。

### com.wmi.queryAsync <a id="com.wmi.queryAsync" href="#com.wmi.queryAsync">&#x23;</a>
执行异步 WQL 查询。

### com.wmi.queryAsync(objSink,wql,parameters,path) <a id="com.wmi.queryAsync" href="#com.wmi.queryAsync">&#x23;</a>
参数 @objSink 可指定包含了回调事件的表对象或 com.wmi.sink 对象。  
参数 @wql 指定 WQL 查询语句。  
可选参数 @parameters 可使用一个表对象指定 WQL 参数值。  
- 表中的命名值指定 WQL 语句中 `@`号 开头的命名参数值。  
- 表中的数组值指定 WQL 语句中以 `?` 号为占位符的数组参数的值。  
可选用参数 @path 指定 WMI 路径,默认为 `\root\cimv2`。

### com.wmi.queryNotificationAsync <a id="com.wmi.queryNotificationAsync" href="#com.wmi.queryNotificationAsync">&#x23;</a>
执行异步 WQL 查询以接收事件。

### com.wmi.queryNotificationAsync(objSink,wql) <a id="com.wmi.queryNotificationAsync" href="#com.wmi.queryNotificationAsync">&#x23;</a>
参数 @objSink 可指定包含了回调事件的表对象或 com.wmi.sink 对象。  
参数 @objSink 可指定 com.wmi.sink 对象或者指定了普通表对象。  
参数 @wql 可输入 WQL 查询语句或 WMI 类名。  
仅指定类名时可省略 "Win32_" 前缀或使用 com.wmi._alias 注册的别名。  
可选用参数 @path 指定 WMI 路径，默认为 `\root\cimv2`。

### com.wmi.queryNotificationAsync(objSink,wql,parameters,path) <a id="com.wmi.queryNotificationAsync" href="#com.wmi.queryNotificationAsync">&#x23;</a>
参数 @objSink 可指定包含了回调事件的表对象或 com.wmi.sink 对象。  
参数 @wql 指定 WQL 查询语句。  
可选参数 @parameters 可使用一个表对象指定 WQL 参数值。  
- 表中的命名值指定 WQL 语句中 `@`号 开头的命名参数值。  
- 表中的数组值指定 WQL 语句中以 `?` 号为占位符的数组参数的值。  
可选用参数 @path 指定 WMI 路径,默认为 `\root\cimv2`。

### com.wmi.sink(event) <a id="com.wmi.sink" href="#com.wmi.sink">&#x23;</a>

```aardio
com.wmi.sink(  
	OnCompleted = function(hResult,wbemErrorObject,wbemAsyncContext){  

	};  
	OnObjectPut = function(wbemObjectPath,wbemAsyncContext){  

	};  
	OnObjectReady = function(wbemObject,wbemAsyncContext){  

	};  
	OnProgress = function(upperBound,current,message,wbemAsyncContext){  

	};  
)
```

## ComObject 成员列表 <a id="ComObject" href="#ComObject">&#x23;</a>

### ComObject.ExecNotificationQuery(wqlQuery) <a id="ComObject.ExecNotificationQuery" href="#ComObject.ExecNotificationQuery">&#x23;</a>
执行查询并接收事件

### ComObject.ExecNotificationQueryAsync(sinkObj,wqlQuery) <a id="ComObject.ExecNotificationQueryAsync" href="#ComObject.ExecNotificationQueryAsync">&#x23;</a>
执行异步查询以接收事件,  
参数@1必须传入 com.wmi.sink 创建的对象,  
参数@2指定 WQL 查询语句  
更多参数说明请参考 https://docs.microsoft.com/en-us/windows/win32/wmisdk/swbemservices-execnotificationquery

### ComObject.ExecQuery("SELECT * FROM Win32_BaseBoard") <a id="ComObject.ExecQuery" href="#ComObject.ExecQuery">&#x23;</a>
使用 WQL 进行查询,返回 COM 对象,  
参数@2必须省略,可选用参数@3指定选项,  
半同步优化请将参数@3指定以下值 _wbemFlagReturnImmediately | _wbemFlagForwardOnly  
更多参数说明请参考 https://docs.microsoft.com/en-us/windows/win32/wmisdk/swbemservices-execquery

### ComObject.ExecQueryAsync(sinkObj,wqlQuery) <a id="ComObject.ExecQueryAsync" href="#ComObject.ExecQueryAsync">&#x23;</a>
异步查询对象，  
参数@1必须传入 com.wmi.sink 创建的对象,  
参数@2指定 WQL 查询语句。  
更多参数说明请参考 https://docs.microsoft.com/en-us/windows/win32/wmisdk/swbemservices-execqueryasync

### ComObject.InstancesOf(strClass,iFlags) <a id="ComObject.InstancesOf" href="#ComObject.InstancesOf">&#x23;</a>
根据指定的类名,返回可使用 com.each 遍历的对象

## SWbemObject 成员列表 <a id="SWbemObject" href="#SWbemObject">&#x23;</a>

### SWbemObject.Delete_ <a id="SWbemObject.Delete_" href="#SWbemObject.Delete_">&#x23;</a>
删除对象

### SWbemObject.PutAsync_ <a id="SWbemObject.PutAsync_" href="#SWbemObject.PutAsync_">&#x23;</a>
异步创建或更新 WMI 对象

### SWbemObject.Put_() <a id="SWbemObject.Put_" href="#SWbemObject.Put_">&#x23;</a>
创建或更新 WMI 对象,  
修改属性后要调用这个函数才会生效,  
进程可能需要管理权限

### 自动完成常量
_wbemFlagForwardOnly=32  
_wbemFlagReturnImmediately=16  
