WindowsManagementInstrumentation深度解析
立即解锁
发布时间: 2025-08-14 00:54:55 阅读量: 31 订阅数: 30 AIGC 


精通PowerShell脚本编写:自动化与简化任务
### Windows Management Instrumentation 深度解析
#### 1. 创建和移除 CIM 类实例
在 Windows 管理中,部分方法需要使用 CIM 类的实例作为参数,在某些情况下,这些实例需要手动创建。
- **创建实例**:以 `Win32_Process` 为例,其参数包含 `ProcessStartupInformation`,该参数由 `Win32_ProcessStartup` 类描述。但系统中通常不存在 `Win32_ProcessStartup` 的现有实例,且该类没有 `Create` 方法来创建实例。可以使用以下三种方法创建实例:
- 使用 `New-CimInstance` 命令:
```powershell
$class = Get-CimClass Win32_ProcessStartup
$startupInfo = New-CimInstance -CimClass $class -ClientOnly
```
- 使用 `New-Object`:
```powershell
$class = Get-CimClass Win32_ProcessStartup
$startupInfo = New-Object CimInstance $class
```
- 使用 `new` 方法:
```powershell
$class = Get-CimClass Win32_ProcessStartup
$startupInfo = [CimInstance]::new($class)
```
创建实例后,可以设置属性来定义进程的启动方式。例如,设置 `pwsh.exe` 窗口的位置和标题:
```powershell
$class = Get-CimClass Win32_ProcessStartup
$startupInfo = New-CimInstance -CimClass $class -ClientOnly
$startupInfo.X = 50
$startupInfo.Y = 50
$startupInfo.Title = 'This is the window title'
$params = @{
ClassName = 'Win32_Process'
MethodName = 'Create'
Arguments = @{
CommandLine = 'pwsh.exe'
ProcessStartupInformation = $startupInfo
}
}
$returnObject = Invoke-CimMethod @params
```
若进程成功启动,`$returnObject` 的返回值为 0。
- **移除实例**:移除实例通常是一个具有破坏性的操作。`Remove-CimInstance` 常用于类没有明确的销毁实例方法(如 `Delete` 方法)的情况。例如,启动一个 `notepad.exe` 进程并移除它:
```powershell
$params = @{
ClassName = 'Win32_Process'
MethodName = 'Create'
Arguments = @{
CommandLine = 'notepad.exe'
}
}
$returnObject = Invoke-CimMethod @params
$params = @{
ClassName = 'Win32_Process'
Filter = 'ProcessID={0}' -f $returnObject.ProcessID
}
$process = Get-CimInstance @params
$process | Remove-CimInstance
```
另外,`Remove-CimInstance` 还常用于清理用户配置文件:
```powershell
$params = @{
ClassName = 'Win32_UserProfile'
Filter = 'Special=FALSE'
}
Get-CimInstance @params |
Where-Object LastUseTime -lt (Get-Date).AddDays(-90) |
Remove-CimInstance -WhatIf
```
在测试确认目标对象正确后,应移除 `-WhatIf` 参数。
#### 2. 使用 CIM 会话
CIM cmdlets 的一个关键特性是能够改变连接的形成和使用方式。`Get-CimInstance` 命令有 `ComputerName` 参数,使用该参数时,命令会自动使用 WSMAN 创建与远程系统的会话,命令完成后连接即销毁。
`Get-CimSession`、`New-CimSession`、`New-CimSessionOption` 和 `Remove-CimSession` 命令可用于定义远程连接的行为。
- **创建 CIM 会话**:使用 `New-CimSession` 命令创建与远程服务器的连接:
```powershell
PS> $cimSession = New-CimSession -ComputerName Remote1
PS> $cimSession
Id : 1
Name : CimSession1
InstanceId : 1cc2a889-b649-418c-94a2-f24e033883b4
ComputerName : Remote1
Protocol : WSMAN
```
`New-CimSession` 还有 `Credential` 参数,可与 `Get-Credential` 结合使用进行连接认证。
- **切换协议**:若远程系统不允许访问 WSMAN,可使用 `New-CimSessionOption` 命令将协议切换为 DCOM:
```powershell
PS> $option = New-CimSessionOption -Protocol DCOM
PS> $cimSession = New-CimSession -ComputerName Remote1 –SessionOption $option
PS> $cimSession
Id : 2
Name : CimSession2
InstanceId : 62b2cb56-ec84-472c-a992-4bee59ee0618
ComputerName : Remote1
Protocol : DCOM
```
DCOM 连接使用 RPC,与旧的 `Get-WmiObject` 命令使用的连接方法相同。
会话创建后会存在于内存中,直到使用 `Remove-CimSession` 命令移除。`Get-CimSession` 命令可显示已建立的连接列表。
#### 3. 关联类的使用
WMI 中的类可以相互关联,例如 `Win32_NetworkAdapter` 实例与 `Win32_NetworkAdapterConfiguration` 实例相关联,将硬件信息与配置信息关联起来。
- **获取关联类信息**:使用 `Get-CimAssociatedClass` 命令可以查询相关类的信息。例如,获取与 `Win32_NetworkAdapterConfiguration` 关联的类实例:
```powershell
$params = @{
ClassName = 'Win32_NetworkAdapterConfiguration'
Filter = 'IPEnabled=TRUE AND DHCPEnabled=TRUE'
}
Get-CimInstance @params | Get-CimAssociatedInstance
```
还可以使用该命令获取与 IP 配置相关的物理接口信息:
```powershell
$params = @{
ClassName = 'Win32_NetworkAdapterConfiguration'
Filter = 'IPEnabled=TRUE AND DHCPEnabled=TRUE'
}
Get-CimInstance @params | ForEach-Object {
$adapter = $_ | Get-CimAssociatedInstance -ResultClassName Win32_NetworkAdapter
[PSCust
```
0
0
复制全文