Windows Server: Installierte Rollen und Features (remote) abfragen

    Rollen in Windows ServerMöchte man sich einen Über­blick darüber ver­schaf­fen, welche Rollen und Features auf welchen Servern instal­liert sind, dann lässt sich auch diese Auf­gabe elegant mit Power­Shell erledigen. Voraus­setzung dafür ist jedoch das PowerShell-Modul für den Server Manager, das mit den RSAT installiert wird.

    Grundsätzlich kann man auch im grafischen Server Manager erkennen, welche Rollen und Features auf bestimmten Servern aktiviert wurden. So findet sich in der Ansicht Alle Server ganz unten ein entsprechender Abschnitt, dessen Inhalt man durch eine Suchfunktion filtern kann. Damit ließe sich etwa schnell herausfinden, auf welchen der verwalteten Maschinen eine bestimmte Rolle läuft.

    Abfrage über Get-WindowsFeature

    Das kleine Fenster erlaubt aber keinen guten Überblick und das Filtern der Liste beschränkt sich auf den Namen. Noch weniger Möglichkeiten bietet der Wizard zum Hinzufügen oder Entfernen von Rollen und Features.

    Die Übersicht über installierte Rollen und Features im Server Manager.

    Daher empfiehlt sich für diese Aufgabe PowerShell als bevor­zugtes Tool. Das Cmdlet für diesen Zweck ist Get-WindowsFeature. Beim einfachsten Aufruf zeigt es die Liste aller Rollen und Features auf dem lokalen Rechner an und markiert jene, die dort installiert sind.

    Meistens möchte man aber nur die Rollen und Features sehen, die installiert sind. Dazu legt man einen Filter an, der die Eigenschaft Installed abfragt:

    Get-WindowsFeature -ComputerName WS2012R2-VM2-L1 | ? Installed -eq $true

    Dieses Beispiel ermittelt alle Rollen und Features auf dem entfernten Computer WS2012R2-VM2-L1.

    Die standardmäßige Ausgabe von Get-WindowsFeature für installierte Rollen.

    Möchte man nur die Rollen und keine Features sehen, dann schränkt man die Abfrage weiter ein:

    Get-WindowsFeature -ComputerName WS2012R2-VM2-L1 |
    ? {$_.Installed -eq $true -and $_.FeatureType -eq "Role"}

    Nach dem gleichen Muster kann man bloß Features anzeigen, indem man für FeatureType den Wert Feature wählt. Dabei sind dann aber standard­mäßig auch alle Sub-Features enthalten. Will man sich auf die oberste Ebene beschränken, dann hilft die Eigenschaft Depth:

    Get-WindowsFeature -ComputerName WS2012R2-VM2-L1 |
    ? {$_.Installed -eq $true -and $_.FeatureType -eq "Feature" -and $_.Depth -eq 1}

    Mehrere Server abfragen

    Weitere Einsatzgebiete für Get-WindowsFeature erschließen sich, wenn man nicht bloß einen Server untersucht, sondern sich einen Überblick über eine ganze Gruppe von Rechnern verschaffen will. In diesem Fall ist es ein übliches Vorgehen, die Liste der Server in eine Textdatei zu schreiben und ihren Inhalt an das Cmdlet zu übergeben:

    foreach($n in Get-Content ".\servers.txt"){Get-WindowsFeature -ComputerName $n |
    ? {$_.FeatureType -eq "Role" -and $_.Installed -eq $true}}

    Dieser Befehl iteriert er mit foreach über alle Einträge der Datei servers.txt und ruft für jeden Host das Cmdlet Get-WindowsFeature auf. Als Ergebnis spuckt es einfach eine Liste von Rollen aus, die auf sämtlichen Servern installiert sind.

    Damit kann man meistens aber nicht allzu viel anfangen. Am ehesten taugt diese Information für statistische Zwecke, indem man etwa schaut, welche Rolle wie oft installiert wurde. Dafür weist man die Ausgabe des obigen Befehls einer Variablen zu und übergibt ihren Inhalt an Group-Object:

    $roles = foreach($n in Get-Content ".\servers.txt")
    {Get-WindowsFeature -ComputerName $n |
    ? {$_.FeatureType -eq "Role" -and $_.Installed -eq $true}}

    $roles | group -property Name

    Alternativ kann man dieses Kommando so ändern, dass es den Namen des Servers in die Ausgabe einfügt. Auf diese Weise erhält man eine Art Inventar:

    foreach($n in Get-Content ".\servers.txt")
    {"### $n ###"; Get-WindowsFeature -ComputerName $n |
    ? {$_.FeatureType -eq "Role" -and $_.Installed -eq $true}}

    Auf welchen Servern läuft eine bestimmte Rolle?

    Interessant dürfte sein, herauszufinden, welche Rollen auf welchen Computern installiert sind. Das folgende Beispiel untersucht, wo überall ein DHCP-Server läuft:

    foreach($n in Get-Content ".\servers.txt")
    {if(Get-WindowsFeature -ComputerName $n -Name *DHCP* |
    ? Installed -eq $true) {$n} }

    Get-WindowsFeature akzeptiert für den Parameter Name auch Wildcards, so dass sich Abfragen relativ einfach einschränken lassen. Der Befehl in diesem Beispiel gibt über die Variable $n die Namen der Server aus, auf denen die DHCP-Rolle aktiviert wurde.

    Keine Kommentare