在远程系统上查找Windows操作系统版本,包括PowerShell中的修订版号

时间:2017-09-01 19:18:08

标签: powershell

我需要在远程系统列表中使用PowerShell获取操作系统版本和修订版号。

我需要从[environment] :: OSVersion.Version获得的结果,但是在远程系统上。

当我运行[environment] :: OSVersion.Version

它返回

主要次要构建修订

6 1 7601 65536

最终目标是它看起来像这样(系统名称是我正在查询的远程系统。)

SystemName 6.1.7601.65536

我目前的代码:

$expectedVersion = "6.1.7601.65536"
$computer = Get-content "C:\temp\servers.txt"
foreach ($computer in $computer)
{
$a=[environment]::OSVersion.Version 
If ($a -lt $expectedVersion)
{
  Write-Host "$computer $a is NOT Patched" -ForegroundColor Red
}
Else
{
  Write-Host "$computer $a is Patched" -ForegroundColor Green
}}

给我以下结果:

System-01 6.1.7601.65536已修补

System-02 6.1.7601.65536已修补

System-41 6.1.7601.65536已修补

System-42 6.1.7601.65536已修补

我遇到的问题是生成的操作系统版本只是本地系统而不是远程系统。

我知道这是因为它是从一个Win 7框中运行的,只有很长的Server列表和唯一的服务器操作系统,它们是不同的操作系统版本号,然后显示在结果中。

我在这里错过了什么。你们都可以帮助我调整它以使其适用于远程系统吗?

感谢

2 个答案:

答案 0 :(得分:0)

查看您的咖啡样本,首先获取服务器名称列表,然后迭代它们。但是在迭代中,目标远程服务器中没有任何反应。

您需要做的是创建一个实现查询的脚本块,然后在每次迭代时使用PowerShell远程处理在远程服务器上执行它。

喜欢这个

$block={....}
$result=()
foreach($server in $servers)
{
    $result+= Invoke-Command -Computer $server -ScrptBlock $block
 }

Powershell远程处理不是一个容易的主题。它要求每个目标服务器都启用了PowerShell远程处理。在上面的代码中,您的凭据将被使用,但是对于高级变体,通过使用参数或额外的PowerShell会话将允许您执行任何操作。

如果您需要更多远程帮助,请告诉我们。用一个答案解释这是一个非常大的主题。

答案 1 :(得分:0)

作为使用PSRemoting的替代方法,您可以使用其他方法获取操作系统版本。 WMI类Win32_OperatingSystem包含系统的版本信息。

$expectedVersion = "6.1.7601.65536"
$Servers = Get-Content "C:\temp\servers.txt"
$OSData = Get-CimInstance -ComputerName $Servers -ClassName Win32_OperatingSystem
ForEach ($Entry in $OSData) {
    If ($Entry.Version -lt $expectedVersion) {
        Write-Host "$($Entry.PSComputerName) $($Entry.Versions) is NOT Patched" -ForegroundColor Red
    } Else {
        Write-Host "$($Entry.PSComputerName) $($Entry.Versions) is Patched" -ForegroundColor Green
    }
}

或者,您可以使用Get-HotFix检查是否安装了特定的修补程序。

$PatchID = 'KB1234567'
$Servers = Get-Content "C:\temp\servers.txt"
$HotFixes = Get-HotFix -ID $PatchID -ComputerName $Servers
ForEach ($Server in $Servers) {
    if ($Server -notin $HotFixes.PSComputerName) {
        Write-Host "$PatchID missing on $Server" -ForegroundColor Red
    } else {
        Write-Host "$PatchID installed on $Server" -ForegroundColor Green
    }
}