Windows 8 – oder: Welche Version habe ich denn nun…?!?

Die Reisen mit der Deutschen Bahn – im Gegensatz zu Fahrten mit dem PKW – haben zumeist den Vorteil Kopf und Hände für etwas anderes frei zu haben. Für Fahrten im Bereich Köln gilt das mitunter auch etwas länger als ursprünglich im Fahrplan angegeben – aber dies ist ein anderes Thema…

Gestern hatte ich auf einer dieser Fahrten die Möglichkeit, mir ein wenig Gedanken über die  Frage eines Support- und Helpdesk-Teams im Zusammenhang mit der Windows 8-Familie zu machen: Es ging um eine technische Möglichkeit, die derzeit am Markt befindlichen Versionen von Windows 8 (namentlich Windows 8, Windows 8.1 und Windows 8.1 Update 1) auseinanderzuhalten und schnell – auch aus der Ferne – zu erkennen, welche Version an einem spezifischen PC zum Einsatz kommt.

In diesem Zusammenhang wird man seitens Microsoft und den sonstigen einschlägigen Foren meist auf die visuellen und funktionalen Unterschiede der Modern UI verwiesen. Für das Helpdesk eine denkbar ungeeignete Variante, da mit dem meist telefonisch verbundenen Endbenutzer eine gemeinsame ‚Absuche‘ des Betriebssystems auf markante Unterschiede durchgeführt werden muss. Und auch ein Support-Team wird nicht gerne das System routinemäßig nach Versionsunterschieden absuchen…

Die Unterschiede zwischen den einzelnen Windows 8-Versionen lassen sich jedoch auch informativ erfassen – so ist der Unterschied zwischen Windows 8 und Windows 8.1 (entsprechend auch zwischen Windows Server 2012 und Windows Server 2012 R2) durch die Versionsnummer gegeben: Windows 8 wurde am 26.10.2012 mit der Versionsnummer 6.2.9200 freigegeben, Windows 8.1 am 18.10.2013 mit der Versionsnummer 6.3.9600. Etwas umständlicher wird es mit der Überprüfung auf Windows 8.1 Update 1, da sich durch das am 05.05.2014 veröffentlichte Paket (KB2919355) die Versionsnummer des Betriebssystems nicht erhöht. Allerdings muss das Paket als Update manuell oder über die Windows Update-Funktion installiert werden. Somit würde die Präsenz dieses Updates für ein Windows 8.1 Update 1 sprechen.

Da ich nun keine manuelle Überprüfung dieser beiden Faktoren in den Raum stellen wollte, habe ich ein kleines PowerShell-Skript ‚on the rail‘ entworfen und hoffe, das dies allen Gegebenheiten gerecht wird. Für Korrektur- und / oder Optimierungshinweise bin ich natürlich dankbar…

<#
.SYNOPSIS
Überprüfung der aktuellen Windows 8-Version.
.DESCRIPTION
Dieses Skript überprüft einen PC auf die Version von Windows 8 (Windows 8, Windows 8.1, Windows 8.1 Update 1), sowie Windows Server 2012 (Windows Server 2012, Windows Server 2012 R2, Windows Server 2012 R2 Update 1) und kann auch einige andere Microsoft-Betriebssysteme erkennen. Daneben wird auch noch die Ausführung des Produkts (32 Bit / 64 Bit) überprüft.
.PARAMTER Computer
Gibt den Namen des abzufragenden Computers an (Standard: localhost)
.PARAMETER Hotfix
Gibt die Kennung des Updates 1 für Windows 8.1 und Windows Server 2012 vor (Standard: KB2919355).
.PARAMETER OS
Erfasst via CIM die Versionsinformationen des Betriebssystems.
.PARAMETER Version
Extrahiert die Versionsnummer aus dem Parameter OS.
.PARAMETER Type
Extrahiert den Typ des Betriebssystems (1 = Workstation, 2 = Server, 3 = Domänencontroller) aus dem Parameter OS.
.PARAMETER Win81
Gibt die aktuelle Versionsnummer von Windows 8.1 vor (Standard: 6.3.9600).
.NOTES
Dateiname      : GetWindowsVersion.ps1
Autor          : Markus Tigges (mtigges@mctnet.de)
Voraussetzung  : PowerShell V2 mit Windows Vista und höher
.LINK
http://www.mctnet.de
.EXAMPLE
.\GetWindowsVersion.ps1
Fragt den lokalen PC nach der verwendeten Windows-Version ab.
.EXAMPLE
.\GetWindowsVersion.ps1 -Computer WKS1
Fragt den Computer WKS1 nach der verwendeten Windows-Version ab.
#>

[CmdletBinding()]
Param (
[Parameter(Mandatory=$False,Position=1)]
[string]$Computer,
[Parameter(Mandatory=$False,Position=2)]
[string]$Hotfix,
[Parameter(Mandatory=$False,ValueFromPipeline=$False)]
[array]$OS,
[Parameter(Mandatory=$False,ValueFromPipeline=$False)]
[string]$Version,
[Parameter(Mandatory=$False,ValueFromPipeline=$False)]
[int]$Type,
[Parameter(Mandatory=$False,ValueFromPipeline=$False)]
[string]$Win81
)

# Überprüfen auf kompatible PowerShell-Versionen (ab Version 3)

if ($PSVersionTable.PSVersion.Major -lt 3)
{
    Write-Host "Leider habe ich eine falsche PowerShell-Version gefunden. Ich brauche mindestens PowerShell in der Version 3..." -ForegroundColor Red
    BREAK
}

# Setzten einiger Parameter

$Hotfix = 'KB2919355'
$Win81 = '6.3.9600'

if ([string]::IsNullOrEmpty($Computer)) {

        Write-Host "Ich beschaffe mir Informationen zum Betriebssystem für den lokalen Computer..." -ForegroundColor Yellow
        $OS = (Get-CimInstance -ClassName Win32_OperatingSystem)
        $Version = ($OS.Version)
        $Type = ($OS.ProductType)

    } else {

        Try {
    
            Write-Host "Ich versuche Informationen vom Computer $Computer auszuwerten. Mal gucken ob es klappt..." -ForegroundColor Yellow
            $OS = (Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $Computer -ErrorAction Stop)
            $Version = ($OS.Version)
            $Type = ($OS.ProductType)
    
        } Catch {

            Write-Host "Ich kann den Computer $Computer leider derzeit nicht erreichen. Sorry..." -ForegroundColor Red
            BREAK

        }
}

# Überprüfen der Windows-Version nach OS-Typen (1 = Workstation, 2 = Server, 3 = DC)

if ($Type -eq 1) {

        switch ($Version)
        {
            '6.0.6000' {"Sie verwenden Windows Vista, Version $Version."}
            '6.0.6002' {"Sie verwenden Windows Vista SP2, Version $Version."}
            '6.1.7600' {"Sie verwenden Windows 7, Version $Version."}
            '6.2.9200' {"Sie verwenden Windows 8, Version $Version."}
            '6.3.9600' {"Sie verwenden Windows 8.1, Version $Version."}
            default {"Sie verwenden Version $Version - diese Version ist leider nicht eingepflegt."}
        }

    } elseif ($Type -eq 2) {

        switch ($Version)
        {
            '6.0.6001' {"Sie verwenden Windows Server 2008, Version $Version."}
            '6.0.6002' {"Sie verwenden Windows Server 2008 SP2, Version $Version."}
            '6.1.7600' {"Sie verwenden Windows Server 2008 R2, Version $Version."}
            '6.2.9200' {"Sie verwenden Windows Server 2012, Version $Version."}
            '6.3.9600' {"Sie verwenden Windows Server 2012 R2, Version $Version."}
            default {"Sie verwenden Version $Version - diese Version ist leider nicht eingepflegt."}
        }

    } elseif ($Type -eq 3) {

        switch ($Version)
        {
            '6.0.6001' {"Sie verwenden Windows Server 2008, Version $Version als Domänencontroller."}
            '6.0.6002' {"Sie verwenden Windows Server 2008 SP2, Version $Version als Domänencontroller."}
            '6.1.7600' {"Sie verwenden Windows Server 2008 R2, Version $Version."}
            '6.2.9200' {"Sie verwenden Windows Server 2012, Version $Version als Domänencontroller."}
            '6.3.9600' {"Sie verwenden Windows Server 2012 R2, Version $Version als Domänencontroller."}
            default {"Sie verwenden Version $Version - diese Version ist leider nicht eingepflegt."}
        }

    } else {

        Write-Host "Der Typ und die Version des Betriebssystems kann leider nicht näher spezifiziert werden."
        BREAK

}

# Überprüfen auf Update 1 (KB2919355) für Windows 8

if ($Version -eq $Win81) {

        try {

            Get-HotFix -Id $Hotfix -ErrorAction Stop | Out-Null
            Write-Host "Update 1 (KB2919355) ist installiert." -ForegroundColor Green

        } catch {

            Write-Host "Update 1 (KB2919355) ist nicht installiert." -ForegroundColor Yellow

        } 

    } elseif ($Version -ne $Win81) {

        Write-Host "Überprüfung auf Update 1 (KB2919355) nicht notwendig."

    } else {

        Write-Host "Irgendetwas ist bei der Überprüfung nach Update 1 (KB2919355) schiefgegangen." -ForegroundColor Red
}

# Überprüfen auf 32 Bit oder 64 Bit OS

if ([System.IntPtr]::Size -eq 4) {

        Write-Host "Betriebssystem: 32 Bit"
    
    } else {
    
        Write-Host "Betriebssystem: 64 Bit"

}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.