PowerShell 技能连载 - 查找登录事件
假设您有管理员特权,以下是一个快速、简单地转储所有登录事件的方法。这样你就可以知道谁登录了一台特定的电脑,以及使用了哪种身份验证类型:
1 | #requires -RunAsAdministrator |
假设您有管理员特权,以下是一个快速、简单地转储所有登录事件的方法。这样你就可以知道谁登录了一台特定的电脑,以及使用了哪种身份验证类型:
1 | #requires -RunAsAdministrator |
经常有一种情况,URL 重定向到另一个最终的 URL。这种情况下,如果您希望知道一个指定的 URL 究竟指向哪,可以用类似这样的函数:
1 | function Resolve-Url |
例如,最新的 PowerShell 总是在这个 URL 发布:https://github.com/PowerShell/PowerShell/releases/latest
解析这个 URL,就可以获取最新的 URL。这是找到可用的最新 PowerShell 版本的快速方法:
1 | PS C:\> Resolve-Url -url https://github.com/PowerShell/PowerShell/releases/latest |
当您用 PowerShell 从 internet 下载文件,您可能会想知道下载需要多少时间。您可以检查已下载的数据大小,而且在知道总下载尺寸的情况下可以计算进度百分比。
以下是得到文件尺寸的快速方法:
1 | function Get-DownloadSize |
以下是一个示例:
1 | PS> "https://github.com/PowerShell/PowerShell/releases/download/v6.2.1/PowerShell-6.2.1-win-x64.zip" | Get-DownloadSize |
有些时候如果一个脚本能检测按键,而不需要干预脚本和输入,那是很棒的事情。通过这种方式,您可以增加按住 SHIFT
键的逻辑,例如退出脚本或者启用详细日志。在用户数据脚本中,您可以在 PowerShell 启动时根据是否按下某些键加载模块以及进行其它调整。
这归结到一个问题:最好的以及最少干预的检测按键的方式是什么?以下是解决方案:
1 | Add-Type -AssemblyName WindowsBase |
增加了两个缺省的程序集之后,您的脚本可以操作 Windows.Input.Keyboard
类。这个类有一个 IsKeyDown()
方法。它可以检测键盘的按键,并且当该按键当前处于按下状态时会返回 $true
。
以上示例代码持续运行知道用户按下左侧的 SHIFT
键。
在前一个技能中我们介绍了 FileSystemWatcher
对象以及如何用它监控文件夹的变化。不过,为了不错过所有变化,需要使用异步的方法,类似这样:
1 | $FileSystemWatcher = New-Object System.IO.FileSystemWatcher |
在这个例子中,当检测到任何一个变化事件,就会触发一个事件,并且 FileSystemWatcher
继续监听。由 PowerShell 负责响应这个事件,并且它使用一个事件处理器来响应。事件处理器是在后台执行的。
如果不想使用后台事件管理器,请运行这行代码:
1 | Get-EventSubscriber -SourceIdentifier Monitoring1 | Unregister-Event |
请注意每个支持的变更类型会发出不同的事件。在这个例子中,我们关注 “Created
“ 事件,当创建新文件或新文件夹的时候会发出这个事件。要响应其它变化类型,请添加更多的事件处理器。这将返回所有支持的事件名称:
1 | PS C:\> $FileSystemWatcher | Get-Member -MemberType *Event |
以下是一段演示 PowerShell 如何用 FileSystemWatcher
同步地监控一个包含字文件夹的文件夹变化:
1 | $folder = $home |
这段代码将会监测用户配置文件中 FileName
和 LastWrite
属性的变化。
一个同步的监听器会导致 PowerShell 处于忙碌状态,所以要退出监听,需要设置一个 1000ms 的超时值,PowerShell 将会将控制权返回给你,而如果您没有按下 CTRL
+C
,则循环会继续。
请注意同步的 FileSystemWatcher
可能会错过改变:正好当 WaitForChange()
返回时一个文件发生改变,那么在下一次调用 WaitForChange()
之前的文件变化都会丢失。
如果不想错过任何变化,请使用异步的方法(请见下一个技能)。
如果您的公司使用一个需要身份认证的代理服务器,PowerShell 可能有时候无法访问 Internet。您可能需要通知代理服务器使用凭据缓存中的缺省凭据:
1 | [System.Net.WebRequest]::DefaultWebProxy.Credentials=[System.Net.CredentialCache]::DefaultCredentials |
今天我们不讨论代码,而是讨论 PowerShell 的总体情况。Microsoft 宣布了下一代 PowerShell 叫做 “PowerShell 7”,并且是基于 .NET Core 3.0 的。这是非常重大的变化,因为 .NET Core 3.0 重新引入了 WPF (Windows Presentation Foundation, GUI),至少在 Windows 平台上。基于这个变化,PowerShell 可以重新引入 GUI 相关的 cmdlet 例如 Out-GridView
,并且可以期待 PowerShell 7 能够弥补大多数使用 PowerShell 6 的 Windows 管理员所缺少的功能。
虽然在 PowerShell 7 之前,使用目前的版本也是可行的,但我们建议您关注新闻并阅读以下链接:
https://devblogs.microsoft.com/powershell/the-next-release-of-powershell-powershell-7/
远程服务器管理工具 (RSAT) 过去是一个外部下载,添加了两个重要的 PowerShell 模块:ActiveDirectory
和 GroupPolicy
。不幸的是,主要的 Windows 更新移除了已安装的 RSAT 工具,所以如果您的脚本需要客户端的 Active Dicrectory 命令,那么需要人工确定并且下载合适新版 Windows 10 的 RSAT 包并且手工安装它。
在 Windows 10 Build 1809 和以后的版本中,这要更容易一些。您可以通过 PowerShell 以类似这样的方式控制 RSAT 状态(假设您有管理员特权):
1 | PS> Get-WindowsCapability -Online -Name *RSAT.ActiveDirectory* |
要安装 RSAT,请运行以下代码:
1 | PS> Get-WindowsCapability -Online -Name *RSAT.ActiveDirectory* | |
虽然在某些情况下仍然需要下载 RSAT 包,但您不再需要搜索正确的版本并手动构建。
Windows 索引服务能够对您的用户数据文件进行索引,并且在文件资源管理器中快速搜索。以下是一个基于内容返回文件的函数:
1 | function Search-FileContent ([String][Parameter(Mandatory)]$FilterText, $Path = $home ) |
要使用它,请指定一个关键字。以下代码返回所有包含该关键字的文件:
1 | PS> Search-FileContent -FilterText testcase -Path C:\Users\tobwe\Documents\ |
如你快速发现的,Index Search 并不会返回 PowerShell 脚本(*.ps1 文件)。缺省情况下,PowerShell 脚本并没有被索引。如果您希望通过内容搜索到这些文件,请到 Index Service 设置并且包含 PowerShell 脚本。点击这里了解更多:https://devblogs.microsoft.com/scripting/use-windows-search-to-find-your-powershell-scripts/