PowerShell 技能连载 - 从 Internet 下载信息(第 6 部分)

在之前的技能中我们介绍了如何用 Invoke-WebRequestInvoke-RestMethod 从网页获取 XML 数据。对于 XML 数据,还有一种用 XML 对象自身内建方法的处理方法

这是 Invoke-RestMethod 的使用方法:

1
2
$url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
(Invoke-RestMethod -Uri $url -UseBasicParsing).Envelope.Cube.Cube.Cube

作为另一种选择,请试试这种方法:

1
2
3
4
$url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
$xml = New-Object -TypeName XML
$xml.Load($url)
$xml.Envelope.Cube.Cube.Cube

这种方法快得多。不过它没有提供 Invoke-RestMethod 中的多个参数来处理代理服务器和凭据。

PowerShell 技能连载 - 从 Internet 下载信息(第 5 部分)

在前一个技能中我们演示了如何使用 Invoke-WebRequest 从网页下载 JSON 或 XML 数据。这个例子从 psconf.eu 下载 JSON 格式的议程表:

1
$page = Invoke-WebRequest -Uri powershell.beer -UseBasicParsing $($page.Content | ConvertFrom-Json) | Out-GridView

这个例子下载 XML 格式的货币兑换率:

1
$url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'$result = Invoke-WebRequest -Uri $url -UseBasicParsing$xml = [xml]$result.Content$xml.Envelope.Cube.Cube.Cube

现在,有另一个名为 Invoke-RestMethod 的 cmdlet,专门设计来获取对象数据。基本上,它的工作方式和 Invoke-WebRequest 很接近,但是能够自动识别数据格式,并相应地转换它的类型。以下是用一行代码获取 psconf.eu 议程表的例子:

1
$(Invoke-RestMethod -Uri powershell.beer -UseBasicParsing) | Out-GridView

这是轻松地获取货币兑换率的方法:

1
2
$url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
(Invoke-RestMethod -Uri $url -UseBasicParsing).Envelope.Cube.Cube.Cube

PowerShell 技能连载 - 从 Internet 下载信息(第 4 部分)

在前一个技能中我们介绍了如何使用 Invoke-WebRequest 从网页下载数据,例如从一个提供随机借口的网页中获取借口。然而,当您做测试的时候,有可能每次都获取到相同的借口(或数据)。

1
2
3
4
5
6
7
8
9
10
$url = 'http://pages.cs.wisc.edu/~ballard/bofh/bofhserver.pl'
$page = Invoke-WebRequest -Uri $url -UseBasicParsing
$content = $page.Content

$pattern = '(?s)<br><font size\s?=\s?"\+2">(.+)</font'

if ($page.Content -match $pattern)
{
$matches[1]
}

最有可能的原因是处在一个代理服务器之后,代理服务器缓存了网站信息。要解决这个问题,只需要将 URL 加上一个类似这样的随机参数:

1
2
3
4
5
6
7
8
9
10
$url = "http://pages.cs.wisc.edu/~ballard/bofh/bofhserver.pl?$(Get-Random)"
$page = Invoke-WebRequest -Uri $url -UseBasicParsing
$content = $page.Content

$pattern = '(?s)<br><font size\s?=\s?"\+2">(.+)</font'

if ($page.Content -match $pattern)
{
$matches[1]
}

PowerShell 技能连载 - 从 Internet 下载信息(第 3 部分)

在前一个技能中,我们演示了如何使用 Invoke-WebRequest 从网页下载数据,并且处理 JSON 或 XML 格式的数据。然而,多数网页包含的是纯 HTML 数据。您可以使用正则表达式来从纯 HTML 中提取信息。

以下是获得网页内容的方法:

1
2
3
$url = 'http://pages.cs.wisc.edu/~ballard/bofh/bofhserver.pl'
$page = Invoke-WebRequest -Uri $url -UseBasicParsing
$page.Content

这个例子中的网页提供随机的借口。要获得最终的借口,得先创建正则表达式模式:

1
2
3
4
5
6
7
8
9
10
$url = 'http://pages.cs.wisc.edu/~ballard/bofh/bofhserver.pl'
$page = Invoke-WebRequest -Uri $url -UseBasicParsing
$content = $page.Content

$pattern = '(?s)<br><font size\s?=\s?"\+2">(.+)</font'

if ($page.Content -match $pattern)
{
$matches[1]
}

当您运行这段代码时,它可以提供一个新的借口。我们在此不深入讨论正则表达式。该正则表达式的基本原理是查找 )<br><font size\s?=\s?"\+2"> 这样的静态文本,然后取出之后的任何文本 ((.+)),直到结尾的静态文本 (</font)。$matches[1] 的值就是正则表达式中的第一个模式代表的内容,在这里就是我们要提取的借口。

PowerShell 技能连载 - 从 Internet 下载信息(第 2 部分)

Invoke-WebRequest 可以下载任意类型的信息,而且可以根据您的需要将它转为任意类型。在前一个技能里,我们演示了如何处理 JSON 数据。现在我们来看看返回 XML 数据的网页:

这个例子从欧洲中央银行获取当前的货币兑换率:

1
2
3
$url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
$result = Invoke-WebRequest -Uri $url -UseBasicParsing
$result.Content

以下是结果:

1
2
3
4
$url = 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml'
$result = Invoke-WebRequest -Uri $url -UseBasicParsing
$xml = [xml]$result.Content
$xml.Envelope.Cube.Cube.Cube

PowerShell 技能连载 - 从 Internet 下载信息(第 1 部分)

PowerShell 带来了两个 cmdlet,可以用来从 internet 获取信息。今天,我们重点关注 Invoke-WebRequest

这个 cmdlet 提供了一个简单的 web 客户端。传给它一个 URL,它就可以帮您下载该网页。以下简单的几行代码可以帮您下载 psconf.eu 的议程表:

1
2
$page = Invoke-WebRequest -Uri powershell.beer -UseBasicParsing
$page.Content

由于它是 JSON 格式的,所以可以将它通过管道传递给 ConvertFrom-Json 来获得对象:

1
2
$page = Invoke-WebRequest -Uri powershell.beer -UseBasicParsing
$page.Content | ConvertFrom-Json | Out-GridView

然而,有些时候(例如这个例子),它并不能正确地“展开”集合结果,所以得手工操作它:

1
2
$page = Invoke-WebRequest -Uri powershell.beer -UseBasicParsing
$($page.Content | ConvertFrom-Json) | Out-GridView

通过这种方法,您可以下载网页上的任意信息,然后处理它。如果一个 web 页返回的是 XML,您可以将它转换为 XML,而如果它是纯 HTML,您可以使用正则表达式来提取您需要的信息。更多信息请见将来的技能。

PowerShell 技能连载 - 清除所有账户的 Kerberos 票证

在前一个技能中我们介绍了 klist.exe 以及如何用它来清除当前用户的所有 Kerberos 票证,这样新的权限可以立即生效。

由于 PowerShell 可以很好地调用外部应用程序,例如 klist.exe,所以结合其它 PowerShell 命令,功能可以变得更强大。以下代码可以获取所有非使用 NTLM(例如 Kerberos 会话)的登录会话:

1
Get-WmiObject -ClassName Win32_LogonSession -Filter "AuthenticationPackage != 'NTLM'"

在提权过的 PowerShell 中运行这行代码,将可以看到所有登录会话。只需要做一点小修改,就可以获取十六进制的登录 ID:

1
2
Get-WmiObject -ClassName Win32_LogonSession -Filter "AuthenticationPackage != 'NTLM'" |
ForEach-Object {[Convert]::ToString($_.LogonId, 16)}

要清除所有会话的缓存的 Kerberos 票证,您可以(在提权的 PowerShell 中)运行这段代码:

1
2
3
Get-WmiObject -ClassName Win32_LogonSession -Filter "AuthenticationPackage != 'NTLM'" |
ForEach-Object {[Convert]::ToString($_.LogonId, 16)} |
ForEach-Object { klist.exe purge -li $_ }

PowerShell 技能连载 - 清除当前用户的 Kerberos 票证

如果要应用更新的权限设置,并不需要重启系统。而只需要清除 Kerberos 票证就可以基于当前的权限获取一个新的票证。

In PowerShell, use this command to purge all cached Kerberos tickets:
在 PowerShell 中,只需要用这条命令就可以清除所有缓存的 Kerberos:

1
2
3
4
5
6
7
PS> klist purge

Current LogonId is 0:0x2af9a
Deleting all tickets:
Ticket(s) purged!

PS>

PowerShell 技能连载 - 创建十六进制数值

有一系列方法可以将十进制数据转为十六进制表示:

1
2
3
4
5
6
7
$value = 255

[Convert]::ToString($value, 16)
'{0:x}' -f $value
'{0:X}' -f $value
'{0:x10}' -f $value
'{0:X10}' -f $value

PowerShell 技能连载 - 用 Chocolatey 安装 PowerShell 6

在之前的技能中,我们解释了如何下载和安装 Chocolatey,一个免费的 Windows 包管理器,可以用来安装软件。

今天,我们将看看如何用 Chocolatey 下载 PowerShell Core 6,这样您就可以体验它了。该安装并不会改变当前的 PowerShell 版本,所以您可以安全地同时安装它。

要安装 PowerShell Core 包,您需要管理员权限。用完整管理员权限打开一个 PowerShell 窗口。请不要用 PowerShell ISE 打开 Chocolatey,因为 PowerShell ISE 无法显示交互式控制台信息和提示。

如果您将 chocolatey 安装为一个便携式软件,请将它的路径添加到 Windows 的 Path 环境变量中。然后运行安装命令:

1
2
3
PS> $env:path += ";C:\ProgramData\chocoportable"

PS> choco install powershell-core -y

当 Choco 确定依赖关系、下载和安装必备项时,您将会见到一系列信息,最后才是安装 PowerShell Core 6。

当安装完成时,PowerShell Core 6 可以在 C:\Program Files\PowerShell\[Version]\pwsh.exe 这儿找到。

要确认您通过 Chocolatey 安装的包是否过时,请运行这条命令:

1
PS> choco outdated

如果需要更新一个已安装的包,请使用这条命令:

powershell
PS C:\> choco upgrade powershell-core
Chocolatey v0.10.8
Upgrading the following packages:
powershell-core
By upgrading you accept licenses for the packages.
powershell-core v6.0.2 is the latest version available based on your source(s).

Chocolatey upgraded 0/1 packages.
See the log for details (C:\ProgramData\chocoportable\logs\chocolatey.log).
PS C:\>