PowerShell 技能连载 - 识别本地管理员帐户

Windows 计算机上有一些默认帐户,例如本地 “Administrator” 帐户。虽然默认情况下此帐户存在,但其名称可以因文化而异,并且其名称也可以重命名。

要始终识别本地管理员帐户而不管其名称如何,请按 SID(安全标识符)搜索本地帐户。本地管理员帐户 SID 始终以 “S-1-5-“ 开头并使用 RID “-500”:

1
2
3
4
5
PS> Get-Localuser | Where-Object Sid -like 'S-1-5-*-500'

Name Enabled Description
---- ------- -----------
Administrator False Built-in account for administering the computer/domain
评论

PowerShell 技能连载 - 识别连上的 Domain

确定您连上的域名称的一种快速方法是 WMI:

1
2
3
4
PS> Get-CimInstance -ClassName Win32_NTDomain

DomainName DnsForestName DomainControllerName
---------- ------------- --------------------

如果您未连接到域,则结果是一个空对象。

评论

PowerShell 技能连载 - 简单的内置密码生成器

.NET System.Web 程序集中有一个隐藏的功能,它可以让您立即创建任意长度的随机密码:

1
2
3
4
5
6
7
8
9
10
# total password length
$Length = 10

# number of non-alpha-chars
$NonChar = 3

Add-Type -AssemblyName 'System.Web'
$password = [System.Web.Security.Membership]::GeneratePassword($Length,$NonChar)

"Your password: $password"
评论

PowerShell 技能连载 - Creating Dummy Test Files

If you need to test file system load, test failover clusters, or need large dummy files otherwise, rather than creating new files and slowly filling them with random data, try this:

$filepath = "$env:temp\testfile.txt"
$sizeBytes = 5.75MB

$file = [System.IO.File]::Create($filepath)
$file.SetLength($sizeBytes)
$file.Close()
$file.Dispose()

# show dummy file in Windows Explorer
explorer /select,$filepath

This code creates dummy files of any size in a snap and can be used to quickly create storage load. Just don’t forget to delete these files after use.

评论

PowerShell 技能连载 - 从网站读取 HTTP 消息头

当您导航到一个网页时,您的浏览器会静默地接收 HTTP 标头中的元信息,而这些元信息通常是不可见的。

要显示任何网站的 HTTP 消息头,请尝试以下操作:

1
2
3
# replace URL with any web page you like:
$url = 'www.tagesschau.de'
(Invoke-WebRequest -Method Head -Uri $url -UseBasicParsing).RawContent

诀窍是使用 -Method 参数并提交 Head 值来获取消息头而不是网页内容。

结果类似于:

HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
Cache-Control: max-age=14
Content-Type: text/html; charset=utf-8
Date: Tue, 10 Aug 2021 12:06:37 GMT

The header info returned by a web page can vary greatly. When you replace the URL in above example with ‘www.google.de’, for example, you see many more instructions being sent to your browser, and you can actually “see” how the web page instructs your browser to set new cookies – so you can check whether the web page sets cookies before asking for consent or not:
网页返回的标题信息可能会有很大差异。例如,当您将上面示例中的 URL 替换为 “www.google.de" 时,您会看到更多的指令被发送到您的浏览器,您实际上可以“看到”网页如何指示您的浏览器设置新的 cookie——因此您可以在征求同意之前检查网页是否设置了 cookie:

HTTP/1.1 200 OK
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Date: Tue, 10 Aug 2021 12:07:06 GMT
Expires: Tue, 10 Aug 2021 12:07:06 GMT
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Set-Cookie: NID=221=C8RdXG_2bB_MwOG33_lS0hx3P5TF5_vaamoT0xj3yKgZPzCjr_g70NvJXkhenV_GMt1TYYU6XwmNOtlkRKRADiXgYJWWYp671M3DFL8DCxM_J1Cl01r39-jfA7sIxu1C
-0B7CHI-8WfXj5IGZ5dHtRxndNA84cpQov5phLhi7l8; expires=Wed, 09-Feb-2022 12:07:06 GMT; path=/; domain=.google.de; HttpOnly
Server: gws

如果您愿意,您也可以以表格形式获取消息头 —— 只需将 RawContent 替换为 Headers

1
2
3
# replace URL with any web page you like:
$url = 'www.google.de'
(Invoke-WebRequest -Method Head -Uri $url -UseBasicParsing).Headers
评论

PowerShell 技能连载 - 使用 FTP:上传文件(第 4 部分)

PowerShell 不附带用于通过 FTP 下载和上传数据的 cmdlet。但是,您可以使用 .NET 来实现。

要将文件从本地驱动器上传到 FTP 服务器,请尝试以下代码:

1
2
3
4
5
6
7
8
9
$localFile = "C:\test.txt"

$username='testuser'
$password='P@ssw0rd'

[System.Uri]$uri = "ftp://${username}:$password@192.168.1.123/test.txt"
$webclient = [System.Net.WebClient]::new()
$webclient.UploadFile($uri, $localFile)
$webclient.Dispose()
评论

PowerShell 技能连载 - 使用 FTP:下载二进制文件(第 3 部分)

PowerShell 不附带用于通过 FTP 下载和上传数据的 cmdlet。但是,您可以使用 .NET 来实现。

要以二进制模式从 FTP 服务器下载文件,请尝试以下代码,该代码还说明了如何使用显式凭据进行身份验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$username='testuser'
$password='P@ssw0rd'
[System.Uri]$uri='ftp://192.168.1.123/test.txt'

$localFile = 'C:\test.txt'

$ftprequest=[System.Net.FtpWebRequest]::Create($uri)
$ftprequest.Credentials=[System.Net.NetworkCredential]::new($username,$password)
$ftprequest.Method=[System.Net.WebRequestMethods+Ftp]::DownloadFile
$ftprequest.UseBinary = $true
$ftprequest.KeepAlive = $false
$response=$ftprequest.GetResponse()
$stream=$response.GetResponseStream()

try
{
$targetfile = [System.IO.FileStream]::($localFile,[IO.FileMode]::Create)
[byte[]]$readbuffer = New-Object byte[] 1024

do{
$readlength = $stream.Read($readbuffer,0,1024)
$targetfile.Write($readbuffer,0,$readlength)
}
while ($readlength -gt 0)

$targetfile.Close()
}
catch
{
Write-Warning "Error occurred: $_"
}
评论

PowerShell 技能连载 - 使用 FTP:下载文件(第 2 部分)

PowerShell 不附带用于通过 FTP 下载和上传数据的 cmdlet。但是,您可以为此使用 .NET。

要从 FTP 服务器下载文件,请尝试使用以下代码:

1
2
3
4
5
6
7
8
9
$localFile = "C:\test.txt"

$username='testuser'
$password='P@ssw0rd'

[System.Uri]$uri = "ftp://${username}:$password@192.168.1.123/test.txt"
$webclient = [System.Net.WebClient]::new()
$webclient.DownloadFile($uri, $localFile)
$webclient.Dispose()
评论

PowerShell 技能连载 - 使用 FTP:列出文件夹(第 1 部分)

PowerShell 不附带用于通过 FTP 下载和上传数据的 cmdlet。但是,您可以使用 .NET 来实现。

要显示 FTP 文件夹的内容,请尝试使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$username='testuser'
$password='P@ssw0rd'
$ftp='ftp://192.168.1.123'
$subfolder='/'

[System.Uri]$uri = $ftp + $subfolder
$ftprequest=[System.Net.FtpWebRequest]::Create($uri)
$ftprequest.Credentials= [System.Net.NetworkCredential]::new($username,$password)
$ftprequest.Method=[System.Net.WebRequestMethods+Ftp]::ListDirectory
$response=$ftprequest.GetResponse()
$stream=$response.GetResponseStream()
$reader=[System.IO.StreamReader]::new($stream,[System.Text.Encoding]::UTF8)
$content=$reader.ReadToEnd()

$content
评论

PowerShell 技能连载 - 发现公共 IP 地址

使用 Web 服务,确定您的公共 IP 地址和有关您的 ISP 的信息几乎是举手之劳:

1
2
3
4
5
6
7
8
9
10
11
12
13
PS> Invoke-RestMethod -Uri https://ipinfo.io


ip : 84.165.49.158
hostname : p54a5319e.dip0.t-ipconnect.de
city : Hannover
region : Lower Saxony
country : DE
loc : 52.3705,9.7332
org : AS3320 Deutsche Telekom AG
postal : 30159
timezone : Europe/Berlin
readme : https://ipinfo.io/missingauth
评论