Identifizieren Sie den Windows 2012 Server-Kern

18

Ich möchte feststellen, ob ein 2012-Server mithilfe von WMI als Core-Installation eingerichtet wurde. Eine frühere Frage scheint darauf hinzudeuten, dass ich die OperatingSystemSKU von Win32_OperatingSystem erhalten kann . Meine Windows 2012 Core-Systeme melden eine OperatingSystemSKU von 7. Der Artikel aus der anderen Frage scheint darauf hinzudeuten, dass es sich um einen PRODUCT_STANDARD_SERVER handelt. Bei einer Core-Installation sollte stattdessen der Wert 0x0000000D für PRODUCT_STANDARD_SERVER_CORE angezeigt werden.

Was vermisse ich hier? Ich möchte schließlich eine Richtlinie erstellen und das Targeting auf Elementebene verwenden, um diese Richtlinie nur auf Windows 2012 Server Core-Installationen anzuwenden.

PS C:\Users\zoredache\Documents> gwmi -Query "select OPeratingSystemSKU,Version,ProductType from Win32_OperatingSystem"

__GENUS            : 2
__CLASS            : Win32_OperatingSystem
__SUPERCLASS       :
__DYNASTY          :
__RELPATH          : Win32_OperatingSystem=@
__PROPERTY_COUNT   : 3
__DERIVATION       : {}
__SERVER           :
__NAMESPACE        :
__PATH             :
OperatingSystemSKU : 7
ProductType        : 2
Version            : 6.2.9200
Zoredache
quelle
Als leichte Ablenkung zu Ihrer Frage ... Wie würde man Serverkern definieren? Ich habe gelesen, dass der Serverkern mit ein oder zwei Features weniger (der GUI) genau dasselbe ist. Könnten Sie stattdessen nicht danach fragen?
John
Wenn Sie eine Antwort dazu geben können, wie Sie feststellen, dass diese Funktion über WMI installiert wurde, stelle ich sie hoch und teste sie aus. Jede Antwort, die verwendet werden kann, um Server Core mit WMI zu identifizieren, wäre meiner Meinung nach hilfreich.
Zoredache
Versuchen Sie, WMI auf den Remotecomputern zu verwenden. Get-WMIObject Win32_OptionalFeature | Select Name, InstallStateund filtern, ob auf dem Server die Server-GUI-Bits installiert sind oder nicht.
Ryan Ries

Antworten:

24

In PowerShell:

Get-WMIObject Win32_OptionalFeature | where Name -eq 'Server-Gui-Shell' | Select InstallState

gibt 1 auf einem vollständigen Server und 2 auf einer Server-Core-Installation zurück.

Bearbeiten:

Während meine Antwort oben richtig ist, gibt es zwei Probleme damit:

  1. Wenn Sie diesen Befehl auf einer Workstation verwenden, wird nichts zurückgegeben, sodass Sie eine zusätzliche Prüfung hinzufügen müssen.

  2. Es ist langsam, als ich es versuchte, es dauerte zwischen 600 und 3500 Millisekunden.

Der pragmatischere Ansatz besteht also darin, nur das Vorhandensein einer bestimmten Datei zu überprüfen:

(Test-Path "$env:windir\explorer.exe")

Dies kehrt $falsefür eine Server Core-Installation und $truefür alle anderen zurück und die Ausführung dauert eine Millisekunde .

Peter Hahndorf
quelle
Tolle Antwort - Mir gefällt besonders die von Ihnen angebotene Problemumgehung mit allen Erklärungen;) Perfekt.
TomTom
6

Komischerweise enthielt der von Ihnen verlinkte MSDN-Artikel die Antwort:

PRODUCT _ * _ SERVER_CORE-Werte werden in Windows Server 2012 nicht zurückgegeben.

Dies liegt daran, dass Server 2012 frei zwischen "Server Core" und "Voll" -Installation konvertiert werden kann, indem einfach die entsprechenden Funktionen hinzugefügt oder entfernt werden.

Sie möchten prüfen, ob diese Funktionen vorhanden sind oder nicht (z. B. Server-Gui-Mgmt-Infra, Server-Gui-Shell, Desktop-Experience).

Michael Hampton
quelle
5

Da die GUI nur eine Funktion ist, können Sie die Liste der installierten Funktionen abfragen

Nur dies in Powershell auf einem Server hier zu testen, hat gut genug funktioniert:

Erstellen Sie eine Liste mit Funktionen, um den Namen zu ermitteln

Get-WmiObject Win32_OptionalFeature > features.txt

Wenn ich den Text von features.txt durchsuche, erfahre ich, dass das Feature den Namen "Server-Gui-Mgmt" trägt (möglicherweise werden auch andere Features installiert, wie Michael in seiner Antwort festhält, sodass Sie auch nach diesen suchen können) wenn das da ist

Get-WmiObject -query "select * from Win32_OptionalFeature where name = 'Server-Gui'"

Bildbeschreibung hier eingeben

Rob Moir
quelle
2

Ich vermute, dass Sie stattdessen die Features abfragen können, da sie im Wesentlichen gleich sind wie im Jahr 2012 und nur einige optionale Features aufweisen, um sie voneinander zu trennen.

Dieser Artikel ist eine Referenz für die Klasse Win32_OptionalFeature, mit der Sie die Features abfragen können. Die optionalen Funktionen sind wie in diesem Artikel beschrieben als Server-Gui-Mgmt-Infra, Server-Gui-Shell und Desktop-Experience definiert .

Sie können die drei abfragen und mithilfe der Booleschen UND- und NICHT-Logik Server auswählen, auf denen keine dieser Funktionen installiert ist.

John
quelle
2

Ich würde Win32_ServerFeature verwenden, es ist eine viel kleinere Klasse und enthält nur die auf dem Server installierten Rollen. Abfragen mit der Funktion "Win32_Server" sollten viel schneller zurückgegeben werden.

Get-WmiObject -Query "Select * FROM Win32_ServerFeature WHERE Name = 'Server Graphical Shell'" 
Icolan
quelle
2

Es wurden einige Erläuterungen zu den Antworten für lokale und entfernte Szenarien im Hinblick auf die Leistung erörtert. Der Fragesteller fragte WMI, und sein Beispiel verwendete PowerShell, um WMI aufzurufen. Die Verwendung von WMI direkt aus nicht verwaltetem Code ist ebenfalls schneller.

Bitte beachten Sie, dass die Ansätze effektiv für Server 2012 und Server 2012 R2 gelten und möglicherweise nicht für zukünftige Versionen gelten.

Einige Kompromisse, abhängig von Ihrem Szenario ... In den meisten Fällen wird Win32_ServerFeature als allgemeine Lösung bevorzugt, oder die lokale Datei wird zur Not überprüft.

  • Lokale Dateiprüfung: schnell und schmutzig. Sehr wenige bewegliche Teile.
  • MSFT_ServerManagerDeploymentTasks: Der zugrunde liegende WMI-Anbieter, der von Win32_ServerFeature und Get-WindowsFeature verwendet wird. Es verwendet einen lokalen Registrierungscache und gibt normalerweise sehr schnell zurück, es sei denn, seit der letzten Abfrage wurden Konfigurationsänderungen vorgenommen. Im Falle eines Cache-Fehlschlags entspricht dies in etwa Win32_OptionalFeature. Dies ist eine sehr gute Benutzeroberfläche, wenn Sie eine Vielzahl von Maschinen in einem schnellen Netzwerk abfragen und zahlreiche Details zu den Beziehungen von Komponenten und deren Status benötigen. Bei normaler Verwendung ist dies jedoch ein Problem. Verwenden Sie stattdessen Win32_ServerFeature.
  • Win32_ServerFeature: Im Allgemeinen die beste Option für lokale oder Remote-Abfragen, jedoch nicht so schnell wie die lokale Dateiprüfung. Gibt nur installierte Funktionen zurück und belastet das Netzwerk nur wenig.
  • Get-WindowsFeature: Sehr einfach zu verwenden, vorausgesetzt, Sie verwenden PowerShell bereits als Teil Ihres Aufrufpfads. Wenn Sie gegen ein entferntes Ziel anrufen, werden über das Netzwerk mehr als 400 KB übertragen, was zu viel ist, wenn Sie nur wissen möchten, ob eine bestimmte Funktion installiert ist.
  • Win32_OptionalFeature / Get-WindowsOptionalFeature: fragt jedes Mal DISM auf dem Ziel ab, was ziemlich schwer sein kann.

Das deckt lokale und entfernte Online-Szenarien ab. Einige der oben genannten Optionen zielen auch auf ein Offline-Image ab.

Matthew Wetmore
quelle
1

Ich dachte nur, ich würde mich mit einem WMI-Filter für diese Lösung einverstanden erklären, damit Sie Gruppenrichtlinienobjekte auf Core 2012+ -Systeme anwenden können:

SELECT * FROM Win32_OptionalFeature WHERE Caption = "Microsoft-Windows-Server-Gui-Shell-Package-DisplayName" AND InstallState = "2"

So testen Sie dies in der Befehlszeile:

WMIC PATH Win32_OptionalFeature WHERE "Caption = 'Microsoft-Windows-Server-Gui-Shell-Package-DisplayName' AND InstallState = 2"

Ich bin auf diesen Thread gestoßen, als ich versucht habe, einen Weg zum Erstellen von WMI-Filtern für Core 2012-Server zu finden, und aus irgendeinem Grund habe ich WMI nicht veranlasst, Win32_OptionalFeature zu überprüfen (oder tatsächlich, dass ein solcher Pfad existiert). Hoffe das hilft jemand anderem.

Tohuw
quelle
0

Unter Windows Server 2012 R2 verwende ich Folgendes: Die Leistung ist gut und dennoch recht eindeutig.

$gui = (Get-WindowsFeature -Name 'Server-Gui-Shell').Installed
Jules Clements
quelle