你能区分 Windows 7 和 Windows Server 2008 R2 吗?

Can you differentiate between Windows 7 and Windows Server 2008 R2?

我所追求的用例:我的目标是能够通过自动化将 PowerShell 5 静默部署到工作站,我需要能够防止我的部署影响服务器,所以我不会让世界自行崩溃。

我目前正在使用下面的代码抢权shell版本

$BuildVersion = [System.Environment]::OSVersion.Version
Write-Host($BuildVersion)

并使用

if ($BuildVersion.Major -le '6')

排除任何不是 运行 至少 7 的机器,但我发现 Windows 7 和 Windows Server 2008 都会有问题R2 具有相同的主要内部版本号。

我的第一个想法是更改代码以仅允许特定的内部版本号

但通过一些谷歌搜索,我发现 7 和 2008 R2 共享相同的内部版本号 6.1.7601。

我想知道的是,PowerShell 2.0 中是否有其他方法可以识别 Windows 满足我需求的构建。

我查看了堆栈溢出,但找不到任何可以直接解决我的问题的东西。

查询Win32_OperatingSystem class。它的属性之一是 ProductType 值。 1 表示客户端(即 Windows 7),2 表示域控制器,3 表示服务器(均为 Windows Server 2008 R2)。

对于版本,[System.Version] 类型在顺序上是可比较的,因此您不必同时检查 MajorMinor 版本($BuildVersion.Major -eq 6 将包括Vista 和 7)

# Define a minimum version (Win7 family pre-release build)
$MinimumVersion = [version]'6.1'

# Fetch ProductType from WMI
$OSType = (Get-WmiObject -Class Win32_OperatingSystem -Property ProductType).ProductType

if($OSType -eq 1 -and [Environment]::Version -ge $MinimumVersion){
    # client OS, 7 or newer
}