PowerShell 技能连载 - 读取机箱的 SKU

在 Windows 10 和 Server 2016中,WMI 添加了一个新属性,该属性简化了机箱或机壳 SKU 的收集。以下这行代码能够读取 SKU:

1
2
3
4
5
PS> Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property Name, ChassisSKUNumber

Name ChassisSKUNumber
---- ----------------
DESKTOP-8DVNI43 Convertible

SKU 编号仅仅是通用的“可替换编号”(对于笔记本电脑)还是一个独立的编号,取决于制造商和 BIOS 设置。

一个更有希望的类是 Win32_SystemEnclosure,它存在于所有 Windows 版本中:

1
2
3
4
5
PS> Get-CimInstance -ClassName Win32_SystemEnclosure | Select-Object -Property Manufacturer, SerialNumber, LockPresent

Manufacturer SerialNumber LockPresent
------------ ------------ -----------
Dell Inc. 4ZKM0Z2 False

PowerShell 技能连载 - 管理自动重启

当 Windows 系统崩溃时,通常会立即重新启动。这称为“自动重置功能”,使用此此行代码即可检查您的计算机是否支持此功能:

1
Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property Name, AutomaticResetCapability

系统是否实际执行自动重启由“AutomaticResetBootOption”控制:

1
Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property Name, AutomaticResetBootOption

If you own Administrator privileges, you can even change this setting. To turn off automatic reset booting, run this:
如果您拥有管理员特权,甚至可以更改此设置。要关闭自动重置启动,请运行以下命令:

1
Set-CimInstance -Query 'Select * From Win32_ComputerSystem' -Property @{AutomaticResetBootOption=$false}

有关 WMI 类 Win32_ComputerSystem 的更多信息,请访问http://powershell.one/wmi/root/cimv2/win32_computersystem

PowerShell 技能连载 - 使用自定义的验证器属性

从 PowerShell 5开始,您可以创建自己的属性,即自定义验证程序。它们可以应用于变量(和参数),并且一旦分配的值与验证程序不匹配,就会引发异常。

这是一个路径验证器的示例。将其应用于变量时,只能将有效文件路径应用于该变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class ValidatePathExistsAttribute : System.Management.Automation.ValidateArgumentsAttribute
{
# the value to be checked surfaces in $path and must be of type [object]
[void]Validate([object]$path, [System.Management.Automation.EngineIntrinsics]$engineIntrinsics)
{
# if anything is wrong with the value, throw an exception
if([string]::IsNullOrWhiteSpace($path))
{
Throw [System.ArgumentNullException]::new()
}
if(-not (Test-Path -Path $path))
{
Throw [System.IO.FileNotFoundException]::new()
}

# if NO exception was thrown, the value is accepted
}
}
#endregion


[ValidatePathExists()][string]$Path = "c:\windows"
$Path = "c:\test123"

当您分配不存在的路径时,PowerShell都将分配它,而是保留现有值。

PowerShell 技能连载 - 检测是否连接到计费的 WLAN

是否曾经需要知道您当前是否已连接到计费的网络?这是一种快速的检查方法:

1
2
3
4
5
6
function Test-WlanMetered
{
[void][Windows.Networking.Connectivity.NetworkInformation, Windows, ContentType = WindowsRuntime]
$cost = [Windows.Networking.Connectivity.NetworkInformation]::GetInternetConnectionProfile().GetConnectionCost()
$cost.ApproachingDataLimit -or $cost.OverDataLimit -or $cost.Roaming -or $cost.BackgroundDataUsageRestricted -or ($cost.NetworkCostType -ne "Unrestricted")
}

它使用一个 UWP API 返回有关网络状态的大量信息,包括有关网络是否计费的信息。

如果您使用的是较旧的 Windows 平台,则以下是替代的代码,该代码使用好用的旧版 “netsh“ 命令行工具并提取所需的信息。请注意,字符串操作(下面的代码广泛使用)容易出错,可能需要进行调整。

同时,以下代码很好地说明了如果手头没有适当的面向对象的 API 可调用,那么 PowerShell 中的通用字符串操作工具如何可以用作最后的保障:

1
2
3
4
5
6
7
8
9
10
11
function Test-WlanMetered
{
$wlan = (netsh wlan show interfaces | select-string "SSID" | select-string -NotMatch "BSSID")
if ($wlan) {
$ssid = (($wlan) -split ":")[1].Trim() -replace '"'
$cost = ((netsh wlan show profiles $ssid | select-string "Cost|Kosten") -split ":")[2].Trim() -replace '"'

return ($cost -ne "unrestricted" -and $cost -ne "Uneingeschränkt" -and $cost -ne 'Uneingeschr"nkt')
}
else { $false }
}

PowerShell 技能连载 - 使用 WMI 实例路径(第 2 部分)

在上一个技能中,我们演示了了新的 Get-CimInstance 命令缺少 Get-WmiObject 能够返回的重要的 “__Path“ 属性。现在让我们将此属性添加回 Get-CimInstance 中。

Get-CimInstance 返回的每个实例的类型均为 [Microsoft.Management.Infrastructure.CimInstance] 类型,因此可以用 Update-TypeData 向该类型添加新属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$code = {
# get key properties
$keys = $this.psbase.CimClass.CimClassProperties.Where{$_.Qualifiers.Name -eq 'Key'}.Name
$pairs = foreach($key in $keys)
{
'{0}="{1}"' -f $key, $this.$key
}
# add server name
$path = '\\{0}\{1}:{2}.{3}' -f $this.CimSystemProperties.ServerName.ToUpper(),
# add namespace
$this.CimSystemProperties.Namespace.Replace("/","\"),
# add class
$this.CimSystemProperties.ClassName,
# add key properties
($pairs -join ',')

return $path
}

Update-TypeData -TypeName Microsoft.Management.Infrastructure.CimInstance -MemberType ScriptProperty -MemberName __Path -Value $code -Force

运行此代码后,所有 CIM 实例都将再次具有 __Path 属性。它略有不同,因为“新的” __Path 属性引用了所有键值。对于我们测试的所有用例,这都没有什么不同:

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
PS> $old = Get-WmiObject -Class Win32_BIOS

PS> $new = Get-CimInstance -ClassName Win32_BIOS


PS> $old.__PATH
\\DESKTOP-8DVNI43\root\cimv2:Win32_BIOS.Name="1.0.13",SoftwareElementID="1.0.13",SoftwareElementState=3,TargetOperatingSystem=0,Version="DELL - 20170001"

PS> $new.__Path
\\DESKTOP-8DVNI43\root\cimv2:Win32_BIOS.Name="1.0.13",SoftwareElementID="1.0.13",SoftwareElementState="3",TargetOperatingSystem="0",Version="DELL - 20170001"


PS> [wmi]($old.__Path)

SMBIOSBIOSVersion : 1.0.13
Manufacturer : Dell Inc.
Name : 1.0.13
SerialNumber : 4ZKM0Z2
Version : DELL - 20170001

PS> [wmi]($new.__Path)

SMBIOSBIOSVersion : 1.0.13
Manufacturer : Dell Inc.
Name : 1.0.13
SerialNumber : 4ZKM0Z2
Version : DELL - 20170001

PowerShell 技能连载 - 使用 WMI 实例路径(第 1 部分)

通常,最好远离旧的和过时的 Get-WmiObject 命令,而使用像 Get-CimInstance 这样的现代且更快的 CIM 命令。在大多数情况下,它们的效果几乎相同。

但是,在某些领域,新的 CIM 命令缺少信息。最重要的领域之一是 Get-WmiObject 返回的任何对象都可以使用的属性 “__Path“。使用 Get-CimInstance 时,会丢失这个属性。

此路径是 WMI 实例的唯一路径。请看一下——此命令列出了 Win32_Share 的所有实例,并将 WMI 路径返回给这些实例:

1
2
3
4
5
6
7
PS> Get-WmiObject -Class Win32_Share | Select-Object -ExpandProperty __Path
\\DESKTOP-8DVNI43\root\cimv2:Win32_Share.Name="ADMIN$"
\\DESKTOP-8DVNI43\root\cimv2:Win32_Share.Name="C$"
\\DESKTOP-8DVNI43\root\cimv2:Win32_Share.Name="HP Universal Printing PCL 6"
\\DESKTOP-8DVNI43\root\cimv2:Win32_Share.Name="IPC$"
\\DESKTOP-8DVNI43\root\cimv2:Win32_Share.Name="OKI PCL6 Class Driver 2"
\\DESKTOP-8DVNI43\root\cimv2:Win32_Share.Name="print$"

一旦知道实例的路径,就可以随时通过 [wmi] 类型轻松访问它:

1
2
3
4
5
PS> [wmi]'\\DESKTOP-8DVNI43\root\cimv2:Win32_Share.Name="HP Universal Printing PCL 6"'

Name Path Description
---- ---- -----------
HP Universal Printing PCL 6 S/W Laser HP,LocalsplOnly S/W Laser HP

这非常有用,您可以使用现有的 WMI 路径或构造自己的 WMI 路径。例如,要访问其他服务器上的 C$ 共享,只需查看路径即可立即确定需要更改的部分:

\\SERVER12345\root\cimv2:Win32_Share.Name="C$"

__Path 属性也使类似这样的“WMI 浏览器”成为可能:

1
2
3
4
5
6
7
8
9
10
# get all WMI instances
Get-WmiObject -Class CIM_LogicalDevice |
# display propertes
Select-Object -Property __Class, Name, Description, __Path |
# let user select some
Out-GridView -Title 'Select one or more (hold CTRL)' -PassThru |
# retrieve the full selected instance by path
ForEach-Object {
[wmi]$_.__Path | Select-Object * | Out-Default
}

PowerShell 技能连载 - 安装 PowerShell 7

PowerShell 7 是便携式应用程序,可以与 Windows PowerShell 平行运行。您只需要下载并安装它。

这部分很容易,因为 PowerShell 团队提供了自动安装脚本。只需一点技巧,您就可以下载此代码并将其绑定到新的 PowerShell 功能,从而可以非常容易地从现有 Windows PowerShell 安装 PowerShell 7:

1
2
3
4
5
6
7
8
# Download installation script
$code = Invoke-RestMethod -Uri https://aka.ms/install-powershell.ps1

# Dynamically create PowerShell function
New-Item -Path function: -Name Install-PowerShell -Value $code

# Run PowerShel function and install the latest PowerShell
Install-PowerShell -UseMSI -Preview

PowerShell 技能连载 - 允许 PowerPoint 中的点击操作

在 PowerPoint 演示文稿中使用点击操作对于启动 Visual Studio Code 或 PowerShell ISE 以及无缝打开和演示 PowerShell 代码非常有用。

但是,出于安全原因,默认情况下禁止通过插入的“操作”项启动程序,并且没有启用它的简便方法。而且,即使您确实启用了此功能,PowerPoint 也会在短时间后将其恢复为保护模式。

这是一个快速的 PowerShell脚本,您可以在演示之前立即运行它,以确保所有可点击的“操作”点击后能生效。

1
2
$path = 'HKCU:\Software\Microsoft\Office\16.0\PowerPoint\Security'
Set-ItemProperty -Path $path -Name RunPrograms -Value 1 -Type DWord

PowerShell 技能连载 - 管理自动磁盘检测

当 Windows 检测到存储驱动器有异常,它就会启用自动完整性检查。对于系统分区,在下次启动时,Windows 会显示用户提示,并要求获得执行检查的权限。

要找出启用了这种检查的所有驱动器,请运行以下命令:

1
2
3
4
5
PS> Get-CimInstance -ClassName Win32_AutochkSetting | Select-Object -Property SettingID, UserInputDelay

SettingID UserInputDelay
--------- --------------
Microsoft Windows 10 Pro|C:\Windows|\Device\Harddisk0\Partition3 8

UserInputDelay 属性指定 Windows 在启动时等待用户提示的秒数。如果届时用户仍未响应,则将自动执行磁盘完整性检查。

WMI 可以更改此设置。如果要将延迟增加到 20 秒,请使用管理员权限运行以下命令:

1
Set-CimInstance -Query "Select * From Win32_AutochkSetting" -Property @{UserInputDelay=20}

请注意,此命令为所有受支持的磁盘驱动器设置 UserInputDelay。要仅对选定的驱动器进行设置,请优化提交的查询,然后添加一个过滤器,例如:

1
Set-CimInstance -Query 'Select * From Win32_AutochkSetting Where SettingID LIKE "%\\Device\\Harddisk0\\Partition3"' -Property @{UserInputDelay=30}

有关WMI查询的更多信息,请访问 http://powershell.one/wmi/wql

PowerShell 技能连载 - 获取可用的显示分辨率

WMI 可以返回显示适配器可用的显示分辨率列表:

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
32
33
34
35
36
37
38
39
40
41
42
PS> Get-CimInstance -ClassName CIM_VideoControllerResolution |
Select-Object -Property SettingID

SettingID
---------
640 x 480 x 4294967296 colors @ 60 Hertz
640 x 480 x 4294967296 colors @ 67 Hertz
640 x 480 x 4294967296 colors @ 72 Hertz
640 x 480 x 4294967296 colors @ 75 Hertz
720 x 400 x 4294967296 colors @ 70 Hertz
720 x 480 x 4294967296 colors @ 60 Hertz
720 x 576 x 4294967296 colors @ 50 Hertz (Interlaced)
800 x 600 x 4294967296 colors @ 60 Hertz
800 x 600 x 4294967296 colors @ 72 Hertz
800 x 600 x 4294967296 colors @ 75 Hertz
832 x 624 x 4294967296 colors @ 75 Hertz
1024 x 768 x 4294967296 colors @ 60 Hertz
1024 x 768 x 4294967296 colors @ 70 Hertz
1024 x 768 x 4294967296 colors @ 75 Hertz
1152 x 864 x 4294967296 colors @ 75 Hertz
1152 x 870 x 4294967296 colors @ 75 Hertz
1280 x 720 x 4294967296 colors @ 50 Hertz (Interlaced)
1280 x 720 x 4294967296 colors @ 60 Hertz
1280 x 800 x 4294967296 colors @ 60 Hertz
1280 x 1024 x 4294967296 colors @ 60 Hertz
1280 x 1024 x 4294967296 colors @ 75 Hertz
1440 x 900 x 4294967296 colors @ 60 Hertz
1600 x 900 x 4294967296 colors @ 60 Hertz
1680 x 1050 x 4294967296 colors @ 60 Hertz
1920 x 1080 x 4294967296 colors @ 24 Hertz (Interlaced)
1920 x 1080 x 4294967296 colors @ 25 Hertz (Interlaced)
1920 x 1080 x 4294967296 colors @ 30 Hertz (Interlaced)
1920 x 1080 x 4294967296 colors @ 50 Hertz (Interlaced)
1920 x 1080 x 4294967296 colors @ 60 Hertz
1920 x 1440 x 4294967296 colors @ 60 Hertz
2048 x 1152 x 4294967296 colors @ 60 Hertz
3840 x 2160 x 4294967296 colors @ 24 Hertz (Interlaced)
3840 x 2160 x 4294967296 colors @ 25 Hertz (Interlaced)
3840 x 2160 x 4294967296 colors @ 30 Hertz (Interlaced)
4096 x 2160 x 4294967296 colors @ 24 Hertz (Interlaced)
4096 x 2160 x 4294967296 colors @ 25 Hertz (Interlaced)
4096 x 2160 x 4294967296 colors @ 30 Hertz (Interlaced)

WMI 是否可以返回视频模式取决于您的视频适配器和驱动程序。如果没有可用的视频模式,则不返回任何内容。

要检查您的视频适配器,请使用 Win32_VideoController WMI类:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
PS> Get-CimInstance -ClassName CIM_VideoController -Property *


Caption : Intel(R) Iris(R) Plus Graphics
Description : Intel(R) Iris(R) Plus Graphics
InstallDate :
Name : Intel(R) Iris(R) Plus Graphics
Status : OK
Availability : 3
ConfigManagerErrorCode : 0
ConfigManagerUserConfig : False
CreationClassName : Win32_VideoController
DeviceID : VideoController3
ErrorCleared :
ErrorDescription :
LastErrorCode :
PNPDeviceID : PCI\VEN_8086&DEV_8A52&SUBSYS_08B01028&REV_07\3&11583659&0&10
PowerManagementCapabilities :
PowerManagementSupported :
StatusInfo :
SystemCreationClassName : Win32_ComputerSystem
SystemName : DESKTOP-8DVNI43
MaxNumberControlled :
ProtocolSupported :
TimeOfLastReset :
AcceleratorCapabilities :
CapabilityDescriptions :
CurrentBitsPerPixel : 32
CurrentHorizontalResolution : 3840
CurrentNumberOfColors : 4294967296
CurrentNumberOfColumns : 0
CurrentNumberOfRows : 0
CurrentRefreshRate : 59
CurrentScanMode : 4
CurrentVerticalResolution : 2400
MaxMemorySupported :
MaxRefreshRate : 0
MinRefreshRate :
NumberOfVideoPages :
VideoMemoryType : 2
VideoProcessor : Intel(R) Iris(R) Graphics Family
NumberOfColorPlanes :
VideoArchitecture : 5
VideoMode :
AdapterCompatibility : Intel Corporation
AdapterDACType : Internal
AdapterRAM : 1073741824
ColorTableEntries :
DeviceSpecificPens :
DitherType : 0
DriverDate : 06.11.2019 01:00:00
DriverVersion : 26.20.100.7463
ICMIntent :
ICMMethod :
InfFilename : oem105.inf
InfSection : iICLD_w10_DS_N
InstalledDisplayDrivers : C:\Windows\System32\DriverStore\FileRepository\iigd_dch.inf_amd64_fdbe15db86939fb5\igdumdim64.dll,C:\Windows\System32\DriverStore\FileRepository\iigd_dch.inf
_amd64_fdbe15db86939fb5\igd10iumd64.dll,C:\Windows\System32\DriverStore\FileRepository\iigd_dch.inf_amd64_fdbe15db86939fb5\igd10iumd64.dll,C:\Windows\System3
2\DriverStore\FileRepository\iigd_dch.inf_amd64_fdbe15db86939fb5\igd12umd64.dll
Monochrome : False
ReservedSystemPaletteEntries :
SpecificationVersion :
SystemPaletteEntries :
VideoModeDescription : 3840 x 2400 x 4294967296 colors
PSComputerName :
CimClass : root/cimv2:Win32_VideoController
CimInstanceProperties : {Caption, Description, InstallDate, Name...}
CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties

有关这两个类的文档,请访问 http://powershell.one/wmi/root/cimv2/cim_videocontrollerresolutionhttp://powershell.one/wmi/root/cimv2/win32_videocontroller