PowerShell 技能连载 - 评价事件日志信息

Get-EventLog 可以访问传统的 Windows 事件日志写入的内容。可以在一个名为 ReplacementStrings 的属性中找到最有价值的信息。以下是一个使该信息可视化并且可以利用它来生成报告的方法。

在这个例子中,将获取 Windows Update 客户端写入的 ID 为 44 的事件,并且这段代码输出替换的字符串。它们将精确地告知我们何时下载了哪些更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Get-EventLog -LogName System -InstanceId 44 -Source Microsoft-Windows-WindowsUpdateClient |
ForEach-Object {

$hash = [Ordered]@{}
$counter = 0
foreach($value in $_.ReplacementStrings)
{
$counter++
$hash.$counter = $value
}
$hash.EventID = $_.EventID
$hash.Time = $_.TimeWritten
[PSCustomObject]$hash


}

始终确保查询一个唯一的事件 ID:对于每个事件 ID,ReplacementStrings 中的信息是唯一的,您一定不希望将不同的事件 ID 类型中的信息混在一起。

PowerShell 技能连载 - 转换奇怪的数据格式

有些时候,您会被奇怪的数据格式难住,例如在 log 文件中,它无法自动转换为 DateTime 对象。以下是一个快速的解析此类日期时间信息的方法:

1
2
3
$weirdDate = '03 12 --- 1988'

[DateTime]::ParseExact($weirdDate, 'MM dd --- yyyy', $null)

如您所见,ParseExact() 用标准的 .NET 日期和时间字符,如您所愿处理自定义日期和时间格式。以下是大小写敏感的:

yy,yyyy: Year
M, MM, MMM, MMMM: Month
d,dd,ddd,dddd: Day
H, HH: Hour (24hr clock)
h,hh: Hour (12hr clock)
m,mm: Minute
s,ss: Second

PowerShell 技能连载 - 查找所有域控制器(不依赖于模块)

在前一个技能中我们解释了如何使用 ActiveDirectory 模块和它的 cmdlet 来查找组织中的所有域控制器,或执行任何其它 LDAP 查询。

以下使用纯 .NET 方法实现相同目的。它不需要任何其它 PowerShell 模块,而且不需要事先安装 RSAT 工具。它需要您的电脑是 Active Directory 中的一个成员。

1
2
3
4
$ldapFilter = "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))"
$searcher = [ADSISearcher]$ldapFilter

$searcher.FindAll()

这行代码返回搜索结果对象。如果您确实想查看真实的 AD 对象,请试一试:

1
$searcher.FindAll() | ForEach-Object { $_.GetDirectoryEntry() }

PowerShell 技能连载 - 查找所有域控制器

如果您安装了免费的 Microsoft RSAT tools,那么您就拥有了 ActiveDirectory 模块。以下是一个查找组织中所有域控制器的简单方法:

1
2
3
4
#requires -Module ActiveDirectory

$filter = '(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))'
Get-ADComputer -LDAPFilter $filter

基本上,您可以运行任意的 LDAP 过滤器查询。只需要选择合适的 cmdlet,例如 Get-ADComputerGet-ADUser 或最通用的 Get-ADObject

PowerShell 技能连载 - 来自 Microsoft 的免费电子书

微软正在提供关于不同主题,无限量的免费电子书。电子书可以通过 PowerShell 来下载。
https://blogs.msdn.microsoft.com/mssmallbiz/2017/07/11/largest-free-microsoft-ebook-giveaway-im-giving-away-millions-of-free-microsoft-ebooks-again-including-windows-10-office-365-office-2016-power-bi-azure-windows-8-1-office-2013-sharepo/

以下是下载这些电子书的 PowerShell 代码:

http://ligman.me/2ux8pSo

当您运行这个脚本之前,请确保创建了 c:\book 目录。这是电子书的下载目录。不过,这个脚本还不够智能,如果该目录不存在的话需要手动创建这个目录。

PowerShell 技能连载 - 将网络连接模式从私有网络切到公有网络(反之亦然)

Starting with Windows Server 2012 R2 and Windows 8.1, PowerShell ships with many useful cmdlets for client and server configuration. This comes handy as some settings can no longer be controlled via UI.
从 Windows Server 2012 R2 和 Windows 8.1 开始,随着 PowerShell 发布了许多有用的客户端和服务器配置 cmdlet。这些 cmdlet 十分趁手,因为一些设置可以不再通过 UI 来控制。

例如,要改变网络的类型,只需要以管理员身份运行以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS> Get-NetConnectionProfile


Name : internet-cafe
InterfaceAlias : WiFi
InterfaceIndex : 13
NetworkCategory : Private
IPv4Connectivity : Internet
IPv6Connectivity : Internet




PS> Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Public -WhatIf
What if:

PowerShell 技能连载 - 移除 Windows 10 APP

PowerShell 可能是最简单的移除预装 Windows 10 APP 的方法。如果您知道想要移除的应用程序名称,只需要以管理员身份打开 PowerShell,然后像这样移除 APP:

1
2
3
4
PS> Get-AppxPackage *bingweather* | Remove-AppxPackage -WhatIf
What if: Performing the operation "Remove package" on target "Microsoft.BingWeather_4.20.1102.0_x64__8wekyb3d8bbwe".

PS>

注意:请去掉 -WhatIf 参数来实际移除 APP,不要删除作用不明的应用程序。可能其它 APP 会依赖这个 Appx 包。

PowerShell 技能连载 - Launching Daily Tools via Alias

您可能知道一些 PowerShell 预定义的缩写名称:例如 dirls 等别名能够节约您每天的打字时间。有许多好的原因值得扩展这些别名的列表并且增加您日常使用的工具。

例如,原先需要点击使用 SnippingTool 截屏工具,不如为它增加一个别名:

1
2
3
PS> Set-Alias -Name snip -Value snippingtool.exe

PS> snip

下一次您需要截取窗体的一部分到 bug 报告中时,只需要在 PowerShell 中运行 snip 即可。

另一个可能有用的工具是 osk.exe,您的 Windows 10 屏幕键盘,或者 mstsc.exe 来创建一个远程桌面连接。

要将您的别名持久化,只需要将它们增加到 PowerShell 配置文件脚本中。它的路径可以在这里找到:

1
2
PS> $profile.CurrentUserAllHosts
C:\Users\username\Documents\WindowsPowerShell\profile.ps1

这个文件默认不存在。如果您创建了它,脚本中的任何内容都会在您启动一个 PowerShell 宿主的时候执行。您只需要启用脚本执行一次即可:

1
PS> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force

PowerShell 技能连载 - PowerShell 2 接近过期

Microsoft 刚刚宣布 PowerShell 2 很快将会标记为“已过期的”。它在一段时间内仍然可以用,但是友情提醒您最好不要使用它,并请关注 PowerShell 5。

PowerShell 2 是 Windows 7 缺省带的 PowerShell。但即使在现代的操作系统中,PowerShell 2 仍然存在。让我们看看 PowerShell 2 对你的系统有多大影响。

以下这行代码返回当前 PowerShell 的版本号:

1
2
PS> $PSVersionTable.PSVersion.Major
5

如果显示的版本号低于 5,那么您需要检查升级的策略。PowerShell 5 是 PowerShell 最新的版本,并且 Windows 7 和 Server 2008 R2 以上的版本都可以通过更新获得它。通常没有任何理由运行 PowerShell 5 以下的版本,除非在那些运行着过时的可能依赖于更早版本的 PowerShell 的软件组件的服务器上。

这行代码将告诉您 PowerShell 2 子系统是否仍然存在:

1
2
3
4
5
PS> powershell -version 2.0
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS>

如果这行代码运行后没有报任何错,并且启动了一个版权为“2009”的 PowerShell,那么说明 Windows 功能 PowerShell 2 还是启用状态。这不太好。这个功能原本是作为需要 PowerShell 2 的脚本的降级环境。现在该子系统基本不再使用,而变成一个恶意脚本代码的攻击维度,因为PowerShell 2 比起 PowerShell 5 缺少一些安全和保护功能。例如,相比于 PowerShell 5,运行在在 PowerShell 2 子系统中的恶意代码不会在反病毒引擎中有效地记录和报告。

除非有很强的理由保留 PowerShell 2,正常情况下您应该移除它。在客户端操作系统中,请打开控制面板,程序和功能,“启用或关闭 Windows 功能”,然后反选“Windows PowerShell 2.0”。

对于服务器系统,请使用 Remove-WindowsFeature

PowerShell 技能连载 - 准备磁盘驱动器

以前,我们用 chkdsk.exe 来修复磁盘。现在这个功能仍然能用。

从 Windows Server 2012 R2 和 Windows 8.1 开始,加入了一个新的 cmdlet,名字叫 Repair-Volume。类似 chkdsk.exe 它需要以管理员身份运行。

您可以用它来扫描驱动器的错误:

1
2
3
4
PS> Repair-Volume -Scan -DriveLetter c
NoErrorsFound

PS>

您也可以使用 cmdlet 来修复错误:

-OfflineScanAndFix 选项:将卷置于脱机,扫描并且修复所有遇到的错误(相当于 chkdsk /f)。

-SpotFix 选项:暂时将卷置于脱机,并只修复记录在 $corrupt 文件中的错误(相当于 chkdsk /spotfix)。