41、PowerShell扩展工具与事件处理实战

PowerShell扩展工具与事件处理实战

1. PowerShell Community Extensions(PSCX)概述

PowerShell Community Extensions(PSCX)是一个积累了大量实用功能的项目。它旨在从社区收集代码,这些代码是人们用于解决实际问题的,所以当你遇到类似问题时,这些代码很可能对你有用。PSCX非常全面,只需一次安装,就能获得一个庞大的工具集,减少了对其他外部工具的依赖,使脚本在不同机器上的部署更加容易,在企业环境中也更容易获得软件安装批准。

2. PSCX的功能与应用
2.1 Active Directory用户删除操作

作为域管理员,在Active Directory中删除用户时要格外小心。例如,删除名为ADSITEST2的用户,只需使用以下命令:

PS> del ADSITEST2
PS> 

需要注意的是,执行此命令时不会有确认提示。另外,DirectoryServices提供程序仅在你的机器是Windows域的成员时才能工作,否则无法访问Active Directory对象的驱动器。

2.2 实用应用程序

PSCX附带了两个外部应用程序,能让我们在使用shell时更加便捷。
- 高级分页器应用程序 :安装PSCX后,阅读帮助文档的体验会有所不同。默认的帮助功能会将文本通过Less - 394程序进行处理,它是流行的UNIX less分页器的Windows版本。其重要特性包括:
- 可以使用向上箭头和Page Up键返回之前滚动过的文本。
- 能够搜索文本,按下斜杠(/)键,输入搜索短语,然后按Enter键,会跳转到第一个匹配项,所有匹配项都会高亮显示。还可以按N键跳转到下一个匹配项,按Shift + N键回到上一个匹配项。
不过,这个分页器也有缺点。对于Windows用户来说不够直观,其快捷命令比较晦涩,更接近vi文本编辑器的快捷键。而且,在处理通过管道输入的文本时,需要先将文本全部收集起来再显示,会增加内存使用开销和初始等待时间,处理大量文本时要格外小心。
- EchoArgs程序 :这是一个小型的传统控制台应用程序,用于调试传统程序调用。在调用时,要注意参数传递的问题,例如:

PS> echoargs $a=b
Arg 0 is <=b>

这里$a被视为变量引用,默认值为$null,会转换为空字符串。正确的调用需要对$符号进行转义:

PS> echoargs `$a=b
Arg 0 is <$a=b>

另外,要避免意外使用终止符,如分号(;)和井号(#)。分号会被视为语句结束,井号会将行的其余部分变成注释。例如:

PS> echoargs do this; that; and that
Arg 0 is <do>
Arg 1 is <this>

会出现错误,正确的做法是对分号进行转义:

PS> echoargs do this`; that`; and that
Arg 0 is <do>
Arg 1 is <this;>
Arg 2 is <that;>
Arg 3 is <and>
Arg 4 is <that>

对于注释起始字符#也是同样的处理方式:

PS> echoargs look for item #3
Arg 0 is <look>
Arg 1 is <for>
Arg 2 is <item>

PS> echoargs look for item `#3
Arg 0 is <look>
Arg 1 is <for>
Arg 2 is <item>
Arg 3 is <#3>
3. PSEventing介绍

PowerShell对.NET对象有近乎完全的控制,但对事件的支持存在不足。在处理事件时,会涉及线程同步和垃圾回收等复杂问题,如果处理不当,可能会导致整个shell崩溃。不过,大多数情况下,脚本不需要处理事件,因为它们通常是短期运行的。但有时,我们可以从脚本中消费.NET类的事件中获益,PSEventing工具就可以解决这个问题。

3.1 PSEventing安装

PSEventing是一个免费的开源项目,由Oisin Grehan运行,托管在CodePlex上(http://www.codeplex.com/PSEventing)。它以shell插件的形式实现,提供了几个用于处理事件的cmdlet。虽然当前版本1.0没有自动安装程序,但安装相对简单,步骤如下:
1. 将分发文件解压到你选择的文件夹,例如C:\Program Files\Windows PowerShell Eventing,然后导航到该文件夹。
2. 运行分发文件中的install.ps1脚本,该脚本会调用InstallUtil.exe来安装插件。

需要注意的是,安装插件只是将其注册到PowerShell中,不会在shell启动时自动运行。在使用新的cmdlet之前,需要使用Add - PSSnapin将插件添加到shell会话中:

Add-PSSnapin PSEventing

如果在安装PSEventing的同一个shell会话中,不需要再次调用Add - PSSnapin。为了安全起见,建议退出该会话,以正常权限启动一个新的shell。

为了避免重复加载插件,可以使用以下代码进行检查:

if ((Get-PSSnapin PSEventing -ErrorAction SilentlyContinue) -eq $null)
{
    Add-PSSnapin PSEventing
}

也可以使用更简单的方法:

Add-PSSnapin PSEventing -ErrorAction SilentlyContinue
3.2 事件处理机制

PSEventing采用了一种不同的方法来处理事件,它创建了一个全局事件队列的抽象概念,所有对事件队列的访问都会进行同步,以避免并发问题。事件绑定规则存储在事件绑定表中,可以使用Connect - EventListener连接到事件,该操作会在绑定表中创建一个条目,使用Get - EventBinding cmdlet可以查看该表。例如:

PS C:\> Get-EventBinding
VariableName        EventName           TypeName                 Listening
------------        ---------           --------                 ---------
fsw                 Created             FileSystemWatcher             True
fsw                 Deleted             FileSystemWatcher             True

这里有两个绑定,用于处理fsw变量(类型为FileSystemWatcher)的Created和Deleted事件。可以使用Disconnect - EventListener cmdlet解除事件绑定。

当事件被触发时,会被添加到队列中,客户端代码可以使用Get - Event cmdlet查询队列并消费事件。Get - Event会返回PSEvent对象,通过查询Args属性可以获取事件发送者传递的事件参数。Get - Event的一个特殊功能是可以阻塞执行,等待事件添加到队列中,这样就不用编写轮询循环了。

4. 实际应用示例
4.1 FileSystemWatcher示例

以下是一个使用System.IO.FileSystemWatcher对象监控文件夹,当有文件被删除时通知用户的脚本WatchDeletedFiles.ps1:

#monitor deleted files
Add-PSSnapin PSEventing -ErrorAction SilentlyContinue
$fsw = New-Object System.IO.FileSystemWatcher
$fsw.Path = "c:\powershell"
$fsw.EnableRaisingEvents = $true
Connect-EventListener fsw deleted
Get-Event -wait | `
    foreach { `
        Write-Host -foreground Yellow `
            "Warning!!! Somebody just deleted $($_.Args.FullPath)" 
    }
Disconnect-EventListener fsw deleted
$fsw.EnableRaisingEvents = $false

该脚本监控C:\powershell文件夹,只关注Deleted事件。当有文件被删除时,会在控制台输出黄色警告信息。脚本结束前会进行清理操作,断开事件监听并停止FileSystemWatcher对象的事件触发。

4.2 监控系统事件日志示例

可以创建一个脚本WatchEventLog.ps1来监听系统事件日志中的用户登录尝试事件:

Add-PSSnapin PSEventing -ErrorAction SilentlyContinue
$securityLog = New-Object System.Diagnostics.EventLog "Security"
$securityLog.EnableRaisingEvents = $true
Connect-EventListener securityLog EntryWritten
$logonAttemptEventInstanceID = 4648
Get-Event -wait | `
    where { `
        $_.Args.Entry.InstanceID -eq $logonAttemptEventInstanceID 
    } | `
    foreach { `
        Write-Host -foreground Red `
            "Logon attempt at: $($_.Args.Entry.TimeGenerated)" 
    }
Disconnect-EventListener securityLog EntryWritten
$securityLog.EnableRaisingEvents = $false

该脚本通过过滤事件的InstanceID属性,只关注登录尝试事件(InstanceID为4648),当有登录尝试时,会在控制台输出红色信息。需要注意的是,访问安全事件日志需要管理员权限,如果在Windows Vista上运行脚本时出现权限错误,需要以管理员身份运行PowerShell会话。

4.3 处理WMI事件示例

WMI是管理Windows网络的强大工具,使用PSEventing可以处理WMI触发的事件。以下是一个监听World Wide Web Publishing Service(W3SVC)服务停止事件的脚本Watch_w3svc.ps1:

Add-PSSnapin PSEventing -ErrorAction SilentlyContinue
$queryString = @'
    SELECT * 
    FROM __InstanceModificationEvent
    WITHIN 10
    WHERE 
        TargetInstance ISA 'Win32_Service'
        AND   TargetInstance.Name = 'w3svc'
        AND   TargetInstance.State = 'Stopped'
'@

$query = New-Object System.Management.WQLEventQuery `
    -argumentList $queryString
$watcher = New-Object System.Management.ManagementEventWatcher($query)
Connect-EventListener watcher EventArrived
$watcher.Start()
echo "Waiting for the W3CSVC service to stop..."
Get-Event -wait | `
    foreach { `
        Write-Host -foreground Red "The W3SVC service has stopped!" 
    }
#cleanup
$watcher.Stop()
Disconnect-EventListener watcher EventArrived
echo "done"

该脚本创建了一个WQL查询,用于查找W3SVC服务停止的实例修改事件,查询每10秒进行一次轮询,以避免系统过载。当服务停止时,会在控制台输出红色信息。脚本结束前会进行清理操作,停止事件监听器并断开事件绑定。

通过以上介绍,我们可以看到PSCX和PSEventing为PowerShell用户提供了丰富的功能和实用的工具,能够帮助我们更高效地处理各种任务。在实际应用中,要根据具体需求合理使用这些工具,并注意相关的权限和操作规范。

PowerShell扩展工具与事件处理实战

5. 工具对比与总结
5.1 PSCX与PSEventing的对比
工具名称 主要功能 特点 适用场景
PSCX 提供大量实用功能,如操作Active Directory、高级分页器、调试工具等 功能全面,减少对外部工具依赖,便于脚本部署 日常脚本编写、系统管理操作
PSEventing 处理.NET对象事件,提供事件监听、队列管理等功能 解决PowerShell事件处理复杂问题,避免并发错误 需要处理事件驱动场景,如监控文件系统、系统日志、WMI事件等

从对比中可以看出,PSCX侧重于提供通用的工具和功能,而PSEventing专注于解决事件处理的难题。在实际使用中,可以根据具体需求选择合适的工具,也可以结合使用以实现更复杂的任务。

5.2 总结

PSCX和PSEventing都是PowerShell生态系统中非常有价值的扩展工具。PSCX通过丰富的功能集,让PowerShell用户能够更轻松地完成各种系统管理和脚本编写任务,减少了对其他外部工具的依赖,提高了工作效率。PSEventing则填补了PowerShell在事件处理方面的不足,为需要处理事件驱动场景的用户提供了可靠的解决方案。

在使用这些工具时,需要注意以下几点:
- 权限问题 :如访问安全事件日志、安装PSEventing插件等操作需要管理员权限,确保以管理员身份运行PowerShell会话。
- 参数处理 :在使用EchoArgs等工具时,要注意参数传递和特殊字符的转义,避免出现错误。
- 资源管理 :使用PSEventing处理事件时,要及时进行清理操作,如断开事件监听、停止事件触发等,避免资源浪费和内存泄漏。

6. 未来展望与建议
6.1 未来发展趋势

随着PowerShell的不断发展和应用场景的不断拓展,PSCX和PSEventing也有望迎来更多的改进和功能增强。例如:
- 自动化安装与配置 :PSEventing可能会推出自动安装程序,简化安装过程,降低使用门槛。
- 更多事件类型支持 :PSEventing可能会支持更多类型的事件,如网络事件、数据库事件等,进一步扩大其应用范围。
- 性能优化 :针对PSCX和PSEventing的性能问题,如分页器的内存使用和事件处理的并发性能,可能会进行优化,提高工具的运行效率。

6.2 建议

对于PowerShell用户来说,建议积极尝试使用PSCX和PSEventing,充分发挥它们的优势。在使用过程中,可以结合实际需求,编写自定义脚本,提高工作效率。同时,要关注工具的官方文档和社区论坛,及时了解工具的更新和使用技巧,不断提升自己的PowerShell技能。

对于开发者来说,可以考虑为PSCX和PSEventing项目做出贡献,如提交代码、报告问题、提供建议等。通过社区的力量,不断完善这些工具,使其更好地服务于广大PowerShell用户。

7. 流程图示例

以下是一个使用mermaid语法绘制的PSEventing事件处理流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(创建事件源对象):::process
    B --> C(连接事件监听器):::process
    C --> D(启动事件监听):::process
    D --> E{事件是否触发?}:::decision
    E -->|是| F(事件添加到队列):::process
    E -->|否| E
    F --> G(获取事件):::process
    G --> H(处理事件):::process
    H --> I{是否继续监听?}:::decision
    I -->|是| E
    I -->|否| J(停止事件监听):::process
    J --> K(断开事件监听器):::process
    K --> L([结束]):::startend

这个流程图展示了PSEventing事件处理的基本流程,从创建事件源对象开始,连接事件监听器,启动监听,当事件触发时将事件添加到队列,然后获取并处理事件,最后根据需要决定是否继续监听。通过这个流程图,可以更直观地理解PSEventing的事件处理机制。

综上所述,PSCX和PSEventing为PowerShell用户提供了强大的功能和实用的工具,能够帮助用户更高效地完成各种任务。在未来,随着技术的不断发展,这些工具有望进一步完善和扩展,为PowerShell生态系统注入新的活力。

源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性收敛速度;②研究混合智能优化算法(如GAPSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值