Windows管理规范与HTML、XML、JSON处理
立即解锁
发布时间: 2025-08-14 00:54:55 阅读量: 30 订阅数: 26 AIGC 


精通PowerShell脚本编写:自动化与简化任务
### Windows管理规范与HTML、XML、JSON处理
#### 1. Windows管理规范(WMI)基础操作
##### 1.1 获取类实例
可以使用 `wmiclass` 加速器创建类的实例,示例代码如下:
```powershell
PS> [wmiclass]'Win32_Process'
NameSpace: ROOT\cimv2
Name Methods Properties
---- ------- ----------
Win32_Process {Create, Terminate,… {Caption, CommandLine, Creat…}
```
这个类描述了可使用的方法和属性。
##### 1.2 调用方法
使用 `wmisearcher` 找到对象的现有实例后调用方法,类似于调用其他 .NET 方法。以下示例获取并重启打印假脱机程序服务,此操作需要管理员权限:
```powershell
$query = '
SELECT *
FROM Win32_SERVICE
WHERE DisplayName="Print Spooler"
'
$service = ([WmiSearcher]$query).Get()
$service.StopService() # 调用 StopService 方法
$service.StartService() # 调用 StartService 方法
```
可以使用 WMI 类查找方法的详细信息,例如 `Win32_Share` 的 `Create` 方法:
```powershell
PS> ([WmiClass]'Win32_Share').Methods['Create']
Name : Create
InParameters : System.Management.ManagementBaseObject
OutParameters : System.Management.ManagementBaseObject
Origin : Win32_Share
Qualifiers : {Constructor, Implemented, MappingStrings, Static}
```
当 `Invoke-CimMethod` 命令接受哈希表时,在 WMI 对象上调用的方法期望按特定顺序传递参数,顺序可在 [WMI 参考](https://learn.microsoft.com/windows/win32/cimwin32prov/create-method-in-class-win32-share) 中找到。
也可以通过以下方式查看参数顺序:
```powershell
PS> ([WmiClass]'Win32_Share').Create.OverloadDefinitions -split '(?<=,)'
System.Management.ManagementBaseObject Create(System.String Path,
System.String Name,
System.UInt32 Type,
System.UInt32 MaximumAllowed,
System.String Description,
System.String Password,
System.Management.ManagementObject#Win32_SecurityDescriptor Access)
```
创建共享时,参数列表必须按特定顺序包含参数。如果参数是可选的,可以忽略或提供空值。例如:
```powershell
([wmiclass]'Win32_Share').Create(
'C:\Temp\Share1', # 路径
'Share2', # 名称
0 # 类型(磁盘驱动器)
)
```
如果要设置 `Description` 但不设置 `MaximumAllowed`,可以为该参数添加空值:
```powershell
([wmiclass]'Win32_Share').Create(
'C:\Temp\Share1', # 路径
'Share3', # 名称
0, # 类型(磁盘驱动器)
$null, # 最大允许值
'Description' # 描述
)
```
`ReturnValue` 描述操作结果,值为 0 表示成功。由于此操作需要管理员权限,值为 2 表示没有足够权限运行。如果使用的文件夹不存在,`ReturnValue` 将设置为 24。
还可以通过设置对象的值来传递参数,示例如下:
```powershell
$class = [WmiClass]'Win32_Share'
$params = $class.GetMethodParameters('Create')
$params.Name = 'Share1'
$params.Path = 'C:\Temp\Share1'
$params.Type = 0
$class.InvokeMethod('Create', $params)
```
创建对象来表示参数的优点是每个属性都有明确的名称,而不是依赖于发现和使用位置参数。
##### 1.3 创建实例
可以使用类的 `CreateInstance` 方法创建 WMI 类的实例,例如创建 `Win32_Trustee` 的实例:
```powershell
([WmiClass]'Win32_Trustee').CreateInstance()
```
##### 1.4 关联类
`Wmisearcher` 返回的对象有一个 `GetRelated` 方法,可用于查找关联实例。该方法接受参数来过滤结果,第一个参数 `relatedClass` 用于将返回的实例限制为特定类,示例如下:
```powershell
using namespace System.Management
([wmisearcher]'SELECT * FROM Win32_LogonSession').Get() | ForEach-Object {
[PSCustomObject]@{
LogonName = $_.GetRelated('Win32_Account').Caption
SessionStarted = [ManagementDateTimeConverter]::ToDateTime(
$_.StartTime
)
}
}
```
一般来说,使用 CIM 命令比上述类型加速器更简单。类型加速器提供了一种在不完全重写为新的 CIM 风格的情况下替代 `Get-WmiObject` 的方法。
#### 2. WMI 权限管理
##### 2.1 共享权限
`Get-Acl` 和 `Set-Acl` 是处理文件系统权限或其他提供程序下权限的好工具,但不能用于影响 SMB 共享权限。以下操作需要管理员权限。
创建共享目录的示例代码如下:
```powershell
$path = 'C:\Temp\WmiPermissions'
New-Item $path -ItemType Directory
$params = @{
ClassName = 'Win32_Share'
MethodName = 'Create'
Arguments = @{
Name = 'WmiPerms'
Path = $path
Type = 0u
}
}
Invoke-CimMethod @params
```
这里的 `Create` 方法如果 `Type` 参数未正确定义为 `UInt32` 值会失败。如果不使用数字后缀 “u” 而使用值 0,PowerShell 会将类型设置为 `Int32`。可以通过以下方式查看该方法所需参数:
```powershell
(Get-CimClass Win32_Share).
CimClassMethods['Create'].Parameters |
Where-Object Name -eq Type
```
输出如下:
| Name | CimType | Qualifiers | ReferenceClassName |
| ---- | ------- | ---------- | ------------------ |
| Type | UInt32 | {ID, In, MappingStrings} | |
`SmbShare` 模块有影响共享权限的命令,这里使用 WMI 类修改权限,可使用 `Get-SmbShareAccess` 命令验证结果。
##### 2.2 获取安全描述符
使用 `Get-Acl` 时,获取的对象是安全描述符,它包括一组控制信息(如所有权等)以及 discretionary 和系统访问控制列表。使用 `Win32_LogicalShareSecuritySetting` 类表示计算机上每个共享的安全性:
```powershell
$params = @{
ClassName = 'Win32_LogicalShareSecuritySetting'
Filter = "Name='WmiPerms'"
}
$security = Get-CimInstance @params
```
返回对象的属性如下:
```plaintext
Caption : Security settings of WmiPerms
Description : Security settings of WmiPerms
SettingID :
ControlFlags : 32772
Name : WmiPerms
PSComputerName :
```
这个实例对于使用 `GetSecurityDescriptor` 方
0
0
复制全文
相关推荐










