Windows管理工具(WMI)的使用与管理
1. 使用Get - CimInstance获取WMI对象
-
在默认命名空间中使用Get - CimInstance
- 可以使用以下命令返回SRV1上Win32_Share类的所有实例:
Get - CimInstance - ClassName Win32_Share
-
从非默认命名空间获取WMI对象
- 首先定义一个哈希表,指定命名空间和类名,然后获取对象并进行排序、选择和格式化输出:
$GCIMHT1 = @{
Namespace = 'ROOT\directory\LDAP'
ClassName = 'ds_group'
}
Get - CimInstance @GCIMHT1 |
Sort - Object - Property Name |
Select - Object - First 10 |
Format - Table - Property DS_name, DS_distinguishedName
-
使用WMI过滤器
- 定义一个过滤器,然后使用Get - CimInstance结合过滤器获取对象并格式化输出:
$Filter = "ds_Name LIKE '%operator%' "
Get - CimInstance @GCIMHT1 - Filter $Filter |
Format - Table - Property DS_Name
-
使用WMI查询
- 定义一个完整的WMI查询,然后使用Get - CimInstance执行查询并格式化输出:
$Q = @"
SELECT * from ds_group
WHERE ds_Name like '%operator%'
"@
Get - CimInstance - Query $Q - Namespace 'root\directory\LDAP' |
Format - Table DS_Name
-
从远程系统获取WMI对象
- 可以使用以下命令从远程主机DC1获取Win32_ComputerSystem类的对象并格式化输出:
Get - CimInstance - CimSession DC1 - ClassName Win32_ComputerSystem |
Format - Table - AutoSize
2. 使用WMI方法
-
WMI方法概述
- 在面向对象编程中,方法是对象可以执行的操作。WMI类也提供方法,例如Win32_Share类有Delete()方法用于删除SMB共享,Create()静态方法用于创建新的SMB共享。在很多情况下,WMI方法的功能可以通过其他PowerShell cmdlet实现。
- WMI方法分为实例方法和静态方法。实例方法作用于特定的实例,如删除特定的SMB共享;静态方法不需要引用现有的类实例,如创建新的SMB共享。
-
操作步骤
- 查看Win32_Share类的方法
Get - CimClass - ClassName Win32_Share |
Select - Object - ExpandProperty CimClassMethods
2. **查看Win32_Share类的属性**
Get - CimClass - ClassName Win32_Share |
Select - Object - ExpandProperty CimClassProperties |
Format - Table - Property Name, CimType
3. **使用Create()静态方法创建新的SMB共享**
$NSHT = @{
Name = 'TestShare1'
Path = 'C:\Foo'
Description = 'Test Share'
Type = [uint32] 0 # disk
}
Invoke - CimMethod - ClassName Win32_Share - MethodName Create - Arguments $NSHT
4. **查看新的SMB共享**
Get - SMBShare - Name 'TestShare1'
5. **使用Get - CimInstance查看新的SMB共享**
Get - CimInstance - Class Win32_Share - Filter "Name = 'TestShare1'"
6. **删除共享**
Get - CimInstance - Class Win32_Share - Filter "Name = 'TestShare1'" |
Invoke - CimMethod - MethodName Delete
3. 管理WMI事件
-
WMI事件类型
- 内在事件(Intrinsic Events) :当CIM类发生更改(新实例创建、实例更新或删除)时,WMI本身会发出事件信号。例如,启动新进程时,Win32_Process类会添加新实例,这就是一个内在事件。
- 外在事件(Extrinsic Events) :由WMI提供程序实现。例如,AD WMI提供程序在AD组的成员发生变化时会触发事件;Windows注册表提供程序可以检测注册表的更改。
-
临时WMI事件操作步骤
- 注册内在事件
$Query1 = "SELECT * FROM __InstanceCreationEvent WITHIN 2
WHERE TargetInstance ISA 'Win32_Process'"
$CEHT = @{
Query = $Query1
SourceIdentifier = 'NewProcessEvent'
}
Register - CimIndicationEvent @CEHT
2. **触发事件**
notepad.exe
3. **获取新进程事件**
$Event = Get - Event - SourceIdentifier 'NewProcessEvent' |
Select - Object - Last 1
4. **显示事件详细信息**
$Event.SourceEventArgs.NewEvent.TargetInstance
5. **取消事件注册**
Unregister - Event - SourceIdentifier 'NewProcessEvent'
6. **注册基于注册表提供程序的事件**
New - Item - Path 'HKLM:\SOFTWARE\Packt' | Out - Null
$Query2 = "SELECT * FROM RegistryValueChangeEvent
WHERE Hive='HKEY_LOCAL_MACHINE'
AND KeyPath='SOFTWARE\\Packt' AND ValueName='MOLTUAE'"
$Action2 = {
Write - Host - Object "Registry Value Change Event Occurred"
$Global:RegEvent = $Event
}
Register - CimIndicationEvent - Query $Query2 - Action $Action2 - Source RegChange
7. **创建新的注册表键并设置值**
$Q2HT = [ordered] @{
Type = 'DWord'
Name = 'MOLTUAE'
Path = 'HKLM:\Software\Packt'
Value = 42
}
Set - ItemProperty @Q2HT
Get - ItemProperty - Path HKLM:\SOFTWARE\Packt
8. **取消注册表事件注册**
Unregister - Event - SourceIdentifier 'RegChange'
9. **检查事件详细信息**
$RegEvent.SourceEventArgs.NewEvent
10. **创建WQL事件查询**
$Group = 'Enterprise Admins'
$Query1 = @"
Select * From __InstanceModificationEvent Within 5
Where TargetInstance ISA 'ds_group' AND
TargetInstance.ds_name = '$Group'
"@
11. **创建临时WMI事件注册**
$Event = @{
Namespace = 'ROOT\directory\LDAP'
SourceID = 'DSGroupChange'
Query = $Query1
Action = {
$Global:ADEvent = $Event
Write - Host 'We have a group change'
}
}
Register - CimIndicationEvent @Event
12. **向Enterprise Admins组添加用户**
Add - ADGroupMember - Identity 'Enterprise Admins' - Members Malcolm
13. **查看新添加的用户**
$ADEvent.SourceEventArgs.NewEvent.TargetInstance |
Format - Table - Property DS_sAMAccountName,DS_Member
14. **取消事件注册**
Unregister - Event - SourceIdentifier 'DSGroupChange'
4. 永久WMI事件处理
-
永久事件处理概述
- 之前介绍的是临时WMI事件处理,其事件处理程序仅在PowerShell会话活动且用户登录主机时有效。而永久事件处理允许WMI在没有活动会话的情况下订阅和处理事件。例如,可以配置WMI在高权限AD组(如Enterprise Admins)添加新成员时执行预定义的操作,如创建报告或发送电子邮件。
-
永久事件消费者类型
| 消费者类型 | 说明 |
| ---- | ---- |
| Active Script Consumer | 用于运行特定的VBS脚本 |
| Log File Consumer | 将事件详细信息写入事件日志文件 |
| NT Event Log Consumer | 将事件详细信息写入Windows事件日志 |
| SMTP Event Consumer | 在事件发生时发送SMTP电子邮件消息 |
| Command Line Consumer | 可以运行程序(如PowerShell 7)并传递脚本文件名,脚本可以访问事件详细信息并执行各种操作 | -
实现永久事件处理步骤
- 定义事件过滤器 :通过向特定的事件类添加新实例,指定WMI应处理的特定事件。
- 定义事件消费者 :定义事件发生时WMI应执行的操作。
- 绑定事件过滤器和事件消费者 :向事件绑定类添加新实例,指示WMI在检测到特定事件时调用事件消费者。
5. 注意事项
- 在使用WMI永久事件处理时要格外小心,最好了解如何移除与永久事件处理程序相关的对象。如果不明确移除这些记录,WMI会持续监控主机的事件,可能会不必要地消耗主机资源。
以下是临时WMI事件处理的流程图:
graph LR;
A[注册内在事件] --> B[触发事件];
B --> C[获取事件];
C --> D[显示事件详情];
D --> E[取消事件注册];
F[注册注册表事件] --> G[创建注册表键并设置值];
G --> H[取消注册表事件注册];
H --> I[检查事件详情];
J[创建WQL查询] --> K[创建临时事件注册];
K --> L[添加用户到组];
L --> M[查看新添加用户];
M --> N[取消事件注册];
Windows管理工具(WMI)的使用与管理
6. 不同WMI操作对比分析
为了更清晰地了解各种WMI操作的特点和适用场景,下面对前面介绍的不同操作进行对比分析。
| 操作类型 | 特点 | 适用场景 |
|---|---|---|
| 使用Get - CimInstance获取WMI对象 | 可在默认或非默认命名空间获取对象,支持过滤器和查询,还能从远程系统获取 | 日常系统信息查询,如查看共享信息、远程系统信息等 |
| 使用WMI方法 | 包括实例方法和静态方法,可对对象进行操作 | 创建、删除共享等对系统配置进行修改的场景 |
| 临时WMI事件处理 | 事件处理程序仅在PowerShell会话活动时有效 | 临时监控系统事件,用于故障排查等 |
| 永久WMI事件处理 | 可在无活动会话时订阅和处理事件 | 需要长期监控系统事件,如监控AD组变化并自动处理 |
7. 代码示例总结与优化建议
-
代码示例总结
- 在获取WMI对象方面,Get - CimInstance提供了灵活的方式,无论是在默认命名空间还是非默认命名空间,都能通过不同参数组合满足各种查询需求。
- 使用WMI方法时,通过Invoke - CimMethod可以方便地调用类的方法,实现对系统资源的操作。
- 对于WMI事件处理,临时事件适合短期监控,而永久事件则适用于长期稳定的监控任务。
-
优化建议
- 在使用WMI方法创建或删除共享时,可以添加错误处理机制,例如:
$NSHT = @{
Name = 'TestShare1'
Path = 'C:\Foo'
Description = 'Test Share'
Type = [uint32] 0 # disk
}
try {
Invoke - CimMethod - ClassName Win32_Share - MethodName Create - Arguments $NSHT
Write - Host "SMB共享创建成功"
}
catch {
Write - Error "SMB共享创建失败:$($_.Exception.Message)"
}
- 在临时WMI事件处理中,如果需要处理多个事件,可以将事件注册和处理逻辑封装成函数,提高代码的复用性。
8. 实际应用案例
-
监控系统进程启动
- 可以使用临时WMI事件处理来监控系统中进程的启动情况。当有新进程启动时,可以记录相关信息,便于后续分析系统活动。
$Query1 = "SELECT * FROM __InstanceCreationEvent WITHIN 2
WHERE TargetInstance ISA 'Win32_Process'"
$CEHT = @{
Query = $Query1
SourceIdentifier = 'NewProcessEvent'
}
Register - CimIndicationEvent @CEHT
while ($true) {
Start - Sleep - Seconds 5
$Event = Get - Event - SourceIdentifier 'NewProcessEvent' |
Select - Object - Last 1
if ($Event) {
$processName = $Event.SourceEventArgs.NewEvent.TargetInstance.Name
Write - Host "新进程启动:$processName"
}
}
-
监控AD组变化
- 利用永久WMI事件处理,可以监控高权限AD组(如Enterprise Admins)的成员变化。当有新成员添加时,自动发送邮件通知管理员。
# 定义事件过滤器
$Group = 'Enterprise Admins'
$Query1 = @"
Select * From __InstanceModificationEvent Within 5
Where TargetInstance ISA 'ds_group' AND
TargetInstance.ds_name = '$Group'
"@
# 定义事件消费者(这里简单示例为发送邮件,实际需要配置SMTP等信息)
$consumerParams = @{
Name = "ADGroupChangeConsumer"
CommandLineTemplate = "powershell.exe -Command 'Send - Email - Subject ""AD组变化通知"" - Body ""Enterprise Admins组有成员变化"""
}
# 绑定事件过滤器和事件消费者(具体绑定代码省略,需要使用相关WMI类操作)
9. 总结
WMI作为Windows系统中强大的管理工具,提供了丰富的功能,包括获取系统信息、操作系统资源以及监控系统事件等。通过不同的操作方式,如使用Get - CimInstance、WMI方法、临时和永久事件处理,可以满足各种不同的管理需求。
在实际应用中,需要根据具体场景选择合适的操作方式,并注意代码的优化和错误处理。同时,对于永久事件处理,要谨慎操作,避免不必要的资源消耗。
以下是永久WMI事件处理的流程图:
graph LR;
A[定义事件过滤器] --> B[定义事件消费者];
B --> C[绑定事件过滤器和消费者];
C --> D[WMI监控事件];
D --> E{事件发生?};
E -- 是 --> F[执行消费者操作];
E -- 否 --> D;
希望通过本文的介绍,能帮助你更好地理解和使用WMI进行系统管理。
超级会员免费看
886

被折叠的 条评论
为什么被折叠?



