深入了解PowerShell:COM对象、事件及标准动词
1. 精选COM对象及其用途
许多应用程序通过COM对象提供了有用的功能,尽管PowerShell可以直接处理很多任务,但这些COM对象仍具有重要价值。以下是一些对系统管理员非常有用的COM对象:
| 标识符 | 描述 |
| — | — |
| Access.Application | 允许与Microsoft Access进行交互和自动化操作 |
| Agent.Control | 允许控制Microsoft Agent 3D动画角色 |
| AutoItX3.Control (nondefault) | 通过AutoIt管理工具提供对Windows自动化的访问 |
| CEnroll.CEnroll | 提供对证书注册服务的访问 |
| Certificate Authority.Request | 提供对证书颁发机构请求的访问 |
| COMAdmin.COMAdminCatalog | 提供对Windows COM+目录的访问和管理 |
| Excel.Application | 允许与Microsoft Excel进行交互和自动化操作 |
| Excel.Sheet | 允许与Microsoft Excel工作表进行交互 |
| HNetCfg.FwMgr | 提供对Windows防火墙管理功能的访问 |
| HNetCfg.HNetShare | 提供对Windows连接共享管理功能的访问 |
| HTMLFile | 允许与新的Internet Explorer文档进行交互和创作 |
| InfoPath.Application | 允许与Microsoft InfoPath进行交互和自动化操作 |
| InternetExplorer.Application | 允许与Microsoft Internet Explorer进行交互和自动化操作 |
| IXSSO.Query | 允许与Microsoft Index Server进行交互 |
| IXSSO.Util | 提供与IXSSO.Query对象一起使用的实用工具的访问 |
| LegitCheckControl.LegitCheck | 提供当前计算机上Windows正版增值计划状态的信息 |
| MakeCab.MakeCab | 提供创建和管理压缩包(.cab)文件的功能 |
| MAPI.Session | 提供对消息应用程序编程接口(MAPI)会话的访问,如文件夹、消息和地址簿 |
| Messenger.MessengerApp | 允许与Messenger进行交互和自动化操作 |
| Microsoft.FeedsManager | 允许与Microsoft RSS提要平台进行交互 |
| Microsoft.ISAdm | 提供对Microsoft Index Server的管理 |
| Microsoft.Update.AutoUpdate | 提供对Microsoft Update自动更新计划的管理 |
| Microsoft.Update.Installer | 允许从Microsoft Update安装更新 |
| Microsoft.Update.Searcher | 提供从Microsoft Update搜索更新的功能 |
| Microsoft.Update.Session | 提供对Microsoft Update历史记录的本地信息的访问 |
| Microsoft.Update.SystemInfo | 提供与当前系统的Microsoft Update相关的信息 |
| MMC20.Application | 允许与Microsoft管理控制台(MMC)进行交互和自动化操作 |
| MSScriptControl.ScriptControl | 允许对WSH脚本进行评估和控制 |
| Msxml2.XSLTemplate | 允许处理XSL转换 |
| Outlook.Application | 允许通过Microsoft Outlook与电子邮件、日历、联系人、任务等进行交互和自动化操作 |
| OutlookExpress.MessageList | 允许通过Microsoft Outlook Express与电子邮件进行交互和自动化操作 |
| PowerPoint.Application | 允许与Microsoft PowerPoint进行交互和自动化操作 |
| Publisher.Application | 允许与Microsoft Publisher进行交互和自动化操作 |
| RDS.DataSpace | 提供对远程数据空间业务对象代理的访问 |
| SAPI.SpVoice | 提供对Microsoft语音API的访问 |
| Scripting.FileSystemObject | 提供对计算机文件系统的访问。大多数功能可以通过PowerShell或PowerShell对.NET框架的支持更直接地实现 |
| Scripting.Signer | 提供对WSH文件数字签名的管理 |
| Scriptlet.TypeLib | 允许动态创建脚本类型库(.tlb)文件 |
| ScriptPW.Password | 允许以掩码形式输入纯文本密码。尽可能避免使用此方法,建议使用带有 -AsSecureString 参数的Read-Host cmdlet |
| SharePoint.OpenDocuments | 允许与Microsoft SharePoint服务进行交互 |
| Shell.Application | 提供对Windows资源管理器外壳应用程序的某些方面的访问,如管理窗口、文件和文件夹以及当前会话 |
| Shell.LocalMachine | 提供与Windows外壳相关的当前计算机的信息 |
| Shell.User | 提供对当前用户的Windows会话和配置文件的某些方面的访问 |
| SQLDMO.SQLServer | 提供对Microsoft SQL Server管理功能的访问 |
| Vim.Application (nondefault) | 允许与VIM编辑器进行交互和自动化操作 |
| WIA.CommonDialog | 提供通过Windows图像采集设施进行图像捕获的访问 |
| WMPlayer.OCX | 允许与Windows Media Player进行交互和自动化操作 |
| Word.Application | 允许与Microsoft Word进行交互和自动化操作 |
| Word.Document | 允许与Microsoft Word文档进行交互 |
| WScript.Network | 提供对联网Windows环境的某些方面的访问,如打印机和网络驱动器,以及计算机和域信息 |
| WScript.Shell | 提供对Windows外壳的某些方面的访问,如应用程序、快捷方式、环境变量、注册表和操作环境 |
| WSHController | 允许在远程计算机上执行WSH脚本 |
2. 精选事件及其用途
PowerShell的事件命令可以让你访问.NET框架中的事件,以及Windows管理规范(WMI)公开的事件。
2.1 .NET事件
| 类型 | 事件 | 描述 |
|---|---|---|
| System.AppDomain | AssemblyLoad | 当程序集加载时发生 |
| System.AppDomain | TypeResolve | 当类型解析失败时发生 |
| System.AppDomain | ResourceResolve | 当资源解析失败,因为资源不是程序集中有效的链接或嵌入资源时发生 |
| System.AppDomain | AssemblyResolve | 当程序集解析失败时发生 |
| System.AppDomain | ReflectionOnlyAssemblyResolve | 当在仅反射上下文中程序集解析失败时发生 |
| System.AppDomain | UnhandledException | 当异常未被捕获时发生 |
| System.Console | CancelKeyPress | 当同时按下Control修饰键(Ctrl)和C控制台键(C)时发生(Ctrl - C) |
| Microsoft.Win32.SystemEvents | DisplaySettingsChanging | 当显示设置正在更改时发生 |
| Microsoft.Win32.SystemEvents | DisplaySettingsChanged | 当用户更改显示设置时发生 |
| Microsoft.Win32.SystemEvents | InstalledFontsChanged | 当用户向系统添加或删除字体时发生 |
| Microsoft.Win32.SystemEvents | LowMemory | 当系统可用RAM不足时发生 |
| Microsoft.Win32.SystemEvents | PaletteChanged | 当用户切换到使用不同调色板的应用程序时发生 |
| Microsoft.Win32.SystemEvents | PowerModeChanged | 当用户暂停或恢复系统时发生 |
| Microsoft.Win32.SystemEvents | SessionEnded | 当用户注销或关闭系统时发生 |
| Microsoft.Win32.SystemEvents | SessionEnding | 当用户试图注销或关闭系统时发生 |
| Microsoft.Win32.SystemEvents | SessionSwitch | 当当前登录用户更改时发生 |
| Microsoft.Win32.SystemEvents | TimeChanged | 当用户更改系统时钟上的时间时发生 |
| Microsoft.Win32.SystemEvents | UserPreferenceChanged | 当用户首选项更改时发生 |
| Microsoft.Win32.SystemEvents | UserPreferenceChanging | 当用户首选项正在更改时发生 |
| System.Net.WebClient | OpenReadCompleted | 当打开包含资源的流的异步操作完成时发生 |
| System.Net.WebClient | OpenWriteCompleted | 当打开用于向资源写入数据的流的异步操作完成时发生 |
| System.Net.WebClient | DownloadStringCompleted | 当异步资源下载操作完成时发生 |
| System.Net.WebClient | DownloadDataCompleted | 当异步数据下载操作完成时发生 |
| System.Net.WebClient | DownloadFileCompleted | 当异步文件下载操作完成时发生 |
| System.Net.WebClient | UploadStringCompleted | 当异步字符串上传操作完成时发生 |
| System.Net.WebClient | UploadDataCompleted | 当异步数据上传操作完成时发生 |
| System.Net.WebClient | UploadFileCompleted | 当异步文件上传操作完成时发生 |
| System.Net.WebClient | UploadValuesCompleted | 当异步上传名称/值集合完成时发生 |
| System.Net.WebClient | DownloadProgressChanged | 当异步下载操作成功传输部分或全部数据时发生 |
| System.Net.WebClient | UploadProgressChanged | 当异步上传操作成功传输部分或全部数据时发生 |
| System.Net.Sockets.SocketAsyncEventArgs | Completed | 用于完成异步操作的事件 |
| System.Net.NetworkInformation.NetworkChange | NetworkAvailabilityChanged | 当网络可用性更改时发生 |
| System.Net.NetworkInformation.NetworkChange | NetworkAddressChanged | 当网络接口的IP地址更改时发生 |
| System.IO.FileSystemWatcher | Changed | 当指定路径中的文件或目录发生更改时发生 |
| System.IO.FileSystemWatcher | Created | 当指定路径中的文件或目录被创建时发生 |
| System.IO.FileSystemWatcher | Deleted | 当指定路径中的文件或目录被删除时发生 |
| System.IO.FileSystemWatcher | Renamed | 当指定路径中的文件或目录被重命名时发生 |
| System.Timers.Timer | Elapsed | 当间隔时间过去时发生 |
| System.Diagnostics.EventLog | EntryWritten | 当条目写入本地计算机上的事件日志时发生 |
| System.Diagnostics.Process | OutputDataReceived | 当应用程序写入其重定向的标准输出流时发生 |
| System.Diagnostics.Process | ErrorDataReceived | 当应用程序写入其重定向的标准错误流时发生 |
| System.Diagnostics.Process | Exited | 当进程退出时发生 |
| System.IO.Ports.SerialPort | ErrorReceived | 表示处理SerialPort对象错误事件的方法 |
| System.IO.Ports.SerialPort | PinChanged | 表示处理SerialPort对象串行引脚更改事件的方法 |
| System.IO.Ports.SerialPort | DataReceived | 表示处理SerialPort对象数据接收事件的方法 |
| System.Management.Automation.Job | StateChanged | 当作业状态更改时触发的事件,例如作业在所有运行空间中完成或在任何一个运行空间中失败时。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.Debugger | DebuggerStop | 当Windows PowerShell停止执行脚本并进入调试器时引发的事件,这是由于遇到断点或执行单步命令导致的。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.Debugger | BreakpointUpdated | 当断点更新时引发的事件,例如启用或禁用断点时。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.Runspaces.Runspace | StateChanged | 当运行空间状态更改时引发的事件 |
| System.Management.Automation.Runspaces.Runspace | AvailabilityChanged | 当运行空间的可用性更改时引发的事件,例如运行空间变为可用或繁忙时。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.Runspaces.Pipeline | StateChanged | 当管道状态更改时引发的事件 |
| System.Management.Automation.PowerShell | InvocationStateChanged | 当PowerShell对象的管道状态更改时引发的事件。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.PSDataCollection[T] | DataAdded | 向集合中添加数据后触发的事件。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.PSDataCollection[T] | Completed | 调用Complete方法以指示不再向集合中添加数据时触发的事件。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.Runspaces.RunspacePool | StateChanged | 当运行空间池状态更改时引发的事件。此事件在Windows PowerShell 2.0中引入 |
| System.Management.Automation.Runspaces.PipelineReader[T] | DataReady | 当数据添加到缓冲区时触发的事件 |
| System.Diagnostics.Eventing.Reader.EventLogWatcher | EventRecordWritten | 允许设置一个委托(事件处理程序方法),每当发布与该对象的事件查询中指定的条件匹配的事件时调用该委托 |
| System.Data.Common.DbConnection | StateChange | 当事件状态更改时发生 |
| System.Data.SqlClient.SqlBulkCopy | SqlRowsCopied | 每当处理了NotifyAfter属性指定的行数时发生 |
| System.Data.SqlClient.SqlCommand | StatementCompleted | 当Transact - SQL语句执行完成时发生 |
| System.Data.SqlClient.SqlConnection | InfoMessage | 当SQL Server返回警告或信息性消息时发生 |
| System.Data.SqlClient.SqlConnection | StateChange | 当事件状态更改时发生 |
| System.Data.SqlClient.SqlDataAdapter | RowUpdated | 在Update期间,对数据源执行命令后发生。尝试进行更新,因此触发事件 |
| System.Data.SqlClient.SqlDataAdapter | RowUpdating | 在Update期间,对数据源执行命令之前发生。尝试进行更新,因此触发事件 |
| System.Data.SqlClient.SqlDataAdapter | FillError | 在填充操作期间发生错误时返回 |
| System.Data.SqlClient.SqlDependency | OnChange | 当收到与此SqlDependency对象关联的任何命令的通知时发生 |
2.2 WMI事件
| 事件 | 描述 |
|---|---|
| __InstanceCreationEvent | 此事件类通常表示WMI提供程序中实例的创建,如进程、服务、文件等。注册此通用事件的示例如下: |
$query = "SELECT * FROM __InstanceCreationEvent " +
"WITHIN 5 " +
"WHERE targetinstance is a 'Win32_UserAccount'"
Register-CimIndicationEvent -Query $query
``` |
| __InstanceDeletionEvent | 此事件类通常表示WMI提供程序中实例的删除,如进程、服务、文件等。注册此通用事件的示例如下:
```powershell
$query = "SELECT * FROM __InstanceDeletionEvent " +
"WITHIN 5 " +
"WHERE targetinstance is a 'Win32_UserAccount'"
Register-CimIndicationEvent -Query $query
``` |
| __InstanceModificationEvent | 此事件类通常表示WMI提供程序中实例的修改,如进程、服务、文件等。注册此通用事件的示例如下:
```powershell
$query = "SELECT * FROM __InstanceModificationEvent " +
"WITHIN 5 " +
"WHERE targetinstance is a 'Win32_UserAccount'"
Register-CimIndicationEvent -Query $query
``` |
| Msft_WmiProvider_OperationEvent | Msft_WmiProvider_OperationEvent事件类是所有WMI提供程序事件的根定义。提供程序操作定义为代表客户端通过WMI执行的某些操作,该操作会导致对提供程序可执行文件的一个或多个调用。此类的属性定义了与正在执行的操作关联的提供程序的标识,并且与Msft_Providers类的实例唯一关联。目前TransactionIdentifier始终为空字符串 |
| Win32_ComputerSystemEvent | 此事件类表示与计算机系统相关的事件 |
| Win32_ComputerShutdownEvent | 此事件类表示计算机开始关机过程时的事件 |
| Win32_IP4RouteTableEvent | Win32_IP4RouteTableEvent类表示由于计算机系统上IP路由的添加、删除或修改而导致的IP路由更改事件 |
| RegistryEvent | 注册表事件类允许你订阅涉及注册表项子树、键和特定值更改的事件 |
| RegistryKeyChangeEvent | RegistryKeyChangeEvent类表示特定键的更改。更改仅适用于该键,不适用于其子键 |
| RegistryTreeChangeEvent | RegistryTreeChangeEvent类表示键及其子键的更改 |
| RegistryValueChangeEvent | RegistryValueChangeEvent类表示特定键的单个值的更改 |
| Win32_SystemTrace | SystemTrace类是所有系统跟踪事件的基类。系统跟踪事件由内核记录器通过事件跟踪API触发 |
| Win32_ProcessTrace | 此事件是进程事件的基事件 |
| Win32_ProcessStartTrace | ProcessStartTrace事件类表示新进程已启动 |
| Win32_ProcessStopTrace | ProcessStopTrace事件类表示进程已终止 |
| Win32_ModuleTrace | ModuleTrace事件类是模块事件的基事件 |
| Win32_ModuleLoadTrace | ModuleLoadTrace事件类表示进程已加载新模块 |
| Win32_ThreadTrace | ThreadTrace事件类是线程事件的基事件 |
| Win32_ThreadStartTrace | ThreadStartTrace事件类表示新线程已启动 |
| Win32_ThreadStopTrace | ThreadStopTrace事件类表示线程已终止 |
| Win32_PowerManagementEvent | Win32_PowerManagementEvent类表示由于电源状态更改而导致的电源管理事件。这些状态更改与高级电源管理(APM)或高级配置和电源接口(ACPI)系统管理协议相关 |
| Win32_DeviceChangeEvent | Win32_DeviceChangeEvent类表示由于计算机系统上设备的添加、删除或修改而导致的设备更改事件。这包括硬件配置更改(对接和取消对接)、硬件状态更改或新映射的设备(网络驱动器映射)。例如,当发送WM_DEVICECHANGE消息时,表示设备已更改 |
| Win32_SystemConfigurationChangeEvent | Win32_SystemConfigurationChangeEvent是一个事件类,表示系统上的设备列表已刷新,即已添加或删除设备或配置已更改。当发送Windows消息“DevMgrRefreshOn<ComputerName>”时触发此事件。消息中不包含设备列表的确切更改,因此需要刷新设备以获取当前系统设置。受影响的配置更改示例包括IRQ设置、COM端口和BIOS版本等 |
| Win32_VolumeChangeEvent | Win32_VolumeChangeEvent类表示由于计算机系统上添加驱动器号或挂载驱动器(如CD - ROM)而导致的本地驱动器事件。目前不支持网络驱动器 |
## 3. 标准PowerShell动词
Cmdlet和脚本应使用动词 - 名词语法命名,例如Get - ChildItem。官方建议,除极少数情况外,Cmdlet应使用标准PowerShell动词,避免使用任何可映射到标准的同义词或概念,这样管理员可以快速理解使用新名词的一组Cmdlet。可以通过输入Get - Verb快速访问此列表(无定义)。动词应使用现在时态,名词应使用单数形式。以下是不同类别的标准PowerShell动词:
### 3.1 通用动词
| 动词 | 含义 | 同义词 |
| --- | --- | --- |
| Add | 向容器中添加资源或将元素附加到另一个元素 | Append, Attach, Concatenate, Insert |
| Clear | 从容器中移除所有元素 | Flush, Erase, Release, Unmark, Unset, Nullify |
| Close | 移除对资源的访问 | Shut, Seal |
| Copy | 将资源复制到另一个名称或容器 | Duplicate, Clone, Replicate |
| Enter | 将资源设置为上下文 | Push, Telnet, Open |
| Exit | 返回进入新上下文之前的上下文 | Pop, Disconnect |
| Find | 在未知上下文中搜索所需项 | Dig, Discover |
| Format | 将项转换为指定的结构或布局 | Layout, Arrange |
| Get | 检索数据 | Read, Open, Cat, Type, Dir, Obtain, Dump, Acquire, Examine, Find, Search |
| Hide | 使显示不可见 | Suppress |
| Join | 加入资源 | Combine, Unite, Connect, Associate |
| Lock | 锁定资源 | Restrict, Bar |
| Move | 移动资源 | Transfer, Name, Migrate |
| New | 创建新资源 | Create, Generate, Build, Make, Allocate |
| Open | 启用对资源的访问 | Release, Unseal |
| Pop | 从堆栈顶部移除项 | Remove, Paste |
| Push | 将项放入堆栈顶部 | Put, Add, Copy |
| Redo | 重复操作或撤销Undo操作 | Repeat, Retry, Revert |
| Remove | 从容器中移除资源 | Delete, Kill |
| Rename | 为资源赋予新名称 | Ren, Swap |
| Reset | 将资源恢复到预定义或原始状态 | Restore, Revert |
| Select | 从较大的数据集中创建子集 | Pick, Grep, Filter |
| Search | 在集合中查找资源(或有关该资源的摘要信息)(实际上不检索资源,但提供检索时使用的信息) | Find, Get, Grep, Select |
| Set | 放置数据 | Write, Assign, Configure |
| Show | 检索、格式化并显示信息 | Display, Report |
| Skip | 在搜索或导航中绕过元素 | Bypass, Jump |
| Split | 将数据分隔成较小的元素 | Divide, Chop, Parse |
| Step | 将进程或导航向前移动一个单位 | Next, Iterate |
| Switch | 在不同的替代方案或选项之间切换资源状态 | Toggle, Alter, Flip |
| Unlock | 解锁资源 | Free, Unrestrict |
| Use | 将资源应用或关联到上下文 | With, Having |
| Watch | 持续监视项 | Monitor, Poll |
### 3.2 通信动词
| 动词 | 含义 | 同义词 |
| --- | --- | --- |
| Connect | 将源连接到目标 | Join, Telnet |
| Disconnect | 将源与目标断开连接 | Break, Logoff |
| Read | 从非连接源获取信息 | Prompt, Get |
| Receive | 从连接源获取信息 | Read, Accept, Peek |
| Send | 将信息写入连接目标 | Put, Broadcast, Mail |
| Write | 将信息写入非连接目标 | Puts, Print |
### 3.3 数据动词
| 动词 | 含义 | 同义词 |
| --- | --- | --- |
| Backup | 备份数据 | Save, Burn |
| Checkpoint | 创建数据或其配置的当前状态的快照 | Diff, StartTransaction |
| Compare | 将资源与另一个资源进行比较 | Diff, Bc |
| Compress | 减小项的大小或资源使用量 | Zip, Squeeze, Archive |
| Convert | 当Cmdlet支持双向转换或多种数据类型的转换时,从一种表示形式转换为另一种表示形式 | Change, Resize, Resample |
| ConvertFrom | 从一个主要输入转换为多个支持的输出 | Export, Output, Out |
| ConvertTo | 从多个支持的输入转换为一个主要输出 | Import, Input, In |
| Dismount | 从命名空间中的位置分离命名实体 | Dismount, Unlink |
| Edit | 就地修改项 | Change, Modify, Alter |
| Expand | 增加项的大小或资源使用量 | Extract, Unzip |
| Export | 将主要输入资源存储到后备存储或交换格式中 | Extract, Backup |
| Group | 将项与其他相关项组合 | Merge, Combine, Map |
| Import | 从后备存储或交换格式创建主要输出资源 | Load, Read |
| Initialize | 准备资源以供使用并将其初始化为默认状态 | Setup, Renew, Rebuild |
| Limit | 对资源应用约束 | Quota, Enforce |
| Merge | 从多个数据集创建单个数据实例 | Combine, Join |
| Mount | 将命名实体附加到命名空间中的位置 | Attach, Link |
| Out | 将数据发送到终端位置 | Print, Format, Send |
| Publish | 使资源对他人可见 | Deploy, Release, Install |
| Restore | 将资源恢复到预定义或由检查点设置的一组条件 | Repair, Return, Fix |
| Save | 将挂起的更改存储到可恢复的存储中 | Write, Retain, Submit |
| Sync | 使两个资源相互同步 | Push, Update |
| Unpublish | 使资源不再公开可见 | Uninstall, Revert |
| Update | 更新或刷新资源 | Refresh, Renew, Index |
### 3.4 诊断动词
| 动词 | 含义 | 同义词 |
| --- | --- | --- |
| Debug | 检查资源,诊断操作问题 | Attach, Diagnose |
| Measure | 识别操作消耗的资源或检索有关资源的统计信息 | Calculate, Determine, Analyze |
| Ping | 确定资源是否活跃且响应(在大多数情况下,应使用Test动词代替) | Connect, Debug |
| Repair | 从损坏或故障状态恢复项 | Fix, Recover, Rebuild |
| Resolve | 将简写表示映射到更完整的表示 | Expand, Determine |
| Test | 验证资源的有效性或一致性 | Diagnose, Verify, Analyze |
| Trace | 跟踪资源的活动 | Inspect, Dig |
### 3.5 生命周期动词
| 动词 | 含义 | 同义词 |
| --- | --- | --- |
| Approve | 批准或允许项或资源 | Allow, Let |
| Assert | 声明项或事实的状态 | Verify, Check |
| Complete | 完成挂起的操作 | Finalize, End |
| Confirm | 批准或确认资源或过程 | Check, Validate |
| Deny | 不批准或不允许资源或过程 | Fail, Halt |
| Disable | 将项配置为不可用 | Halt, Hide |
| Enable | 将项配置为可用 | Allow, Permit |
| Install | 将资源放置在指定位置并可选地进行初始化 | Setup, Configure |
| Invoke | 调用或启动无法停止的活动 | Run, Call, Perform |
| Register | 将项添加到受监视或发布的资源中 | Record, Submit, Journal, Subscribe |
| Request | 提交以供考虑或批准 | Ask, Query |
| Restart | 停止操作并重新启动 | Recycle, Hup |
| Resume | 在操作暂停后继续进行 | Continue |
| Start | 开始活动 | Launch, Initiate |
| Stop | 停止活动 | Halt, End, Discontinue |
| Submit | 添加到挂起操作列表或发送以供批准 | Send, Post |
| Suspend | 暂停操作,但不停止 | Pause, Sleep, Break |
| Uninstall | 从指定位置移除资源 | Remove, Clear, Clean |
| Unregister | 从受监视或发布的资源中移除项 | Unsubscribe, Erase, Remove |
| Wait | 暂停直到预期事件发生 | Sleep, Pause, Join |
### 3.6 安全动词
| 动词 | 含义 | 同义词 |
| --- | --- | --- |
| Block | 限制对资源的访问 | Prevent, Limit, Deny |
| Grant | 授予对资源的访问 | Allow, Enable |
| Protect | 限制对资源的访问 | Encrypt, Seal |
| Revoke | 移除对资源的访问 | Remove, Disable |
| Unblock | 移除对资源访问的限制 | Clear, Allow |
| Unprotect | 移除受保护资源的限制 | Decrypt, Decode |
## 4. 总结
通过了解这些COM对象、事件和标准PowerShell动词,系统管理员可以更高效地使用PowerShell进行系统管理和自动化操作。合理利用这些资源可以提高工作效率,减少手动操作的错误和时间成本。在实际应用中,应根据具体需求选择合适的COM对象、监听相应的事件,并使用标准的PowerShell动词来命名Cmdlet和脚本。
## 5. 实际应用案例分析
### 5.1 使用COM对象进行文件操作
以Scripting.FileSystemObject为例,我们可以使用它来进行文件和文件夹的创建、复制、删除等操作。以下是一个简单的示例,展示如何使用该COM对象创建一个新的文件夹并在其中创建一个文本文件:
```powershell
# 创建FileSystemObject对象
$fs = New-Object -ComObject Scripting.FileSystemObject
# 创建新文件夹
$newFolderPath = "C:\Temp\NewFolder"
if (-not $fs.FolderExists($newFolderPath)) {
$fs.CreateFolder($newFolderPath)
Write-Host "文件夹 $newFolderPath 已创建"
}
# 在新文件夹中创建文本文件
$newFilePath = "$newFolderPath\test.txt"
$newFile = $fs.CreateTextFile($newFilePath)
$newFile.WriteLine("这是一个测试文件。")
$newFile.Close()
Write-Host "文件 $newFilePath 已创建"
这个示例中,我们首先创建了一个Scripting.FileSystemObject对象,然后检查指定的文件夹是否存在,如果不存在则创建它。接着,在该文件夹中创建了一个文本文件并写入了一行文本。
5.2 监听WMI事件实现系统监控
假设我们要监控系统中进程的创建和终止事件,可以使用WMI的__InstanceCreationEvent和__InstanceDeletionEvent事件。以下是一个示例代码:
# 注册进程创建事件
$queryCreation = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'"
Register-CimIndicationEvent -Query $queryCreation -SourceIdentifier ProcessCreationEvent -Action {
$process = $Event.SourceEventArgs.NewEvent.TargetInstance
Write-Host "新进程已创建: $($process.Name) (PID: $($process.ProcessId))"
}
# 注册进程终止事件
$queryDeletion = "SELECT * FROM __InstanceDeletionEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'"
Register-CimIndicationEvent -Query $queryDeletion -SourceIdentifier ProcessDeletionEvent -Action {
$process = $Event.SourceEventArgs.NewEvent.TargetInstance
Write-Host "进程已终止: $($process.Name) (PID: $($process.ProcessId))"
}
# 保持脚本运行以持续监听事件
while ($true) {
Start-Sleep -Seconds 1
}
在这个示例中,我们分别注册了进程创建和终止的WMI事件,并为每个事件指定了一个动作。当有新进程创建或现有进程终止时,相应的动作会被执行,输出相关信息。
5.3 使用标准PowerShell动词编写Cmdlet
下面我们通过一个简单的示例来展示如何使用标准PowerShell动词编写一个自定义的Cmdlet。假设我们要创建一个Cmdlet来添加用户到一个用户组中,我们可以使用Add动词:
function Add-UserToGroup {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$UserName,
[Parameter(Mandatory = $true)]
[string]$GroupName
)
try {
# 模拟添加用户到组的操作
Write-Host "将用户 $UserName 添加到组 $GroupName 中..."
# 这里可以添加实际的代码来完成添加操作
Write-Host "用户 $UserName 已成功添加到组 $GroupName"
}
catch {
Write-Error "添加用户时发生错误: $_"
}
}
# 使用示例
Add-UserToGroup -UserName "testuser" -GroupName "testgroup"
在这个示例中,我们定义了一个名为Add-UserToGroup的Cmdlet,使用了标准的Add动词。该Cmdlet接受用户名和组名作为参数,并模拟了将用户添加到组中的操作。
6. 最佳实践和注意事项
6.1 选择合适的COM对象
在使用COM对象时,要根据具体需求选择合适的对象。例如,如果只是进行简单的文件操作,优先考虑使用PowerShell本身的命令或.NET框架的功能,因为它们通常更简洁和高效。只有在需要特定的COM对象功能时才使用它们。同时,要注意COM对象的兼容性和稳定性,某些COM对象可能只在特定的操作系统版本或环境中可用。
6.2 合理监听事件
监听事件会消耗系统资源,因此要合理选择需要监听的事件。避免不必要的事件监听,只监听与实际需求相关的事件。同时,要注意事件处理程序的性能,避免在事件处理程序中执行耗时的操作,以免影响系统性能。
6.3 遵循标准PowerShell动词规范
在编写Cmdlet和脚本时,一定要遵循标准PowerShell动词规范。使用标准动词可以提高代码的可读性和可维护性,让其他管理员更容易理解和使用你的代码。同时,要避免使用自定义的动词,除非有特殊的需求并且无法使用标准动词来表达。
7. 总结与展望
通过本文的介绍,我们了解了PowerShell中一些重要的COM对象、事件和标准动词。这些知识对于系统管理员来说是非常有用的,可以帮助他们更高效地进行系统管理和自动化操作。
在未来,随着技术的不断发展,PowerShell可能会有更多的功能和改进。例如,可能会有更多的COM对象被支持,事件机制可能会更加完善,标准动词可能会进一步扩展。作为系统管理员,我们需要不断学习和掌握这些新的知识和技能,以适应不断变化的技术环境。同时,我们也可以将这些知识应用到实际工作中,不断优化我们的系统管理流程,提高工作效率和质量。
7.1 未来发展趋势
- 更多集成功能 :PowerShell可能会与更多的系统组件和第三方工具进行集成,提供更强大的功能。例如,与云服务的集成,使得管理员可以更方便地管理云资源。
- 性能优化 :随着系统规模的不断扩大,对PowerShell的性能要求也越来越高。未来可能会对PowerShell的性能进行进一步优化,提高其执行效率。
- 更智能的事件处理 :事件处理机制可能会变得更加智能,例如可以根据事件的类型和严重程度自动采取不同的处理措施。
7.2 学习建议
- 持续学习 :关注PowerShell的官方文档和社区论坛,及时了解最新的功能和使用技巧。
- 实践项目 :通过实际项目来应用所学的知识,加深对PowerShell的理解和掌握。
- 交流分享 :与其他PowerShell爱好者和专业人士交流分享经验,共同提高。
下面是一个简单的mermaid流程图,展示了使用PowerShell进行系统管理的基本流程:
graph LR
A[确定管理需求] --> B[选择合适的COM对象或事件]
B --> C[编写脚本或Cmdlet]
C --> D[测试和调试]
D --> E[部署和执行]
E --> F[监控和优化]
F --> B{是否有新需求}
B -- 是 --> B
B -- 否 --> G[结束]
这个流程图展示了从确定管理需求开始,到选择合适的COM对象或事件,编写脚本或Cmdlet,进行测试和调试,最后部署和执行的整个过程。在执行过程中,还需要进行监控和优化,根据是否有新的需求来决定是否继续循环。
超级会员免费看
249

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



