Zidentyfikuj rdzeń systemu Windows 2012 Server

18

Chcę wykryć, czy serwer 2012 został skonfigurowany jako instalacja podstawowa przy użyciu WMI. Wcześniejsze pytanie wydaje się wskazywać, że mogę uzyskać OperatingSystemSKU z Win32_OperatingSystem . Moje systemy Windows 2012 Core zgłaszają wartość OperatingSystemSKU wynoszącą 7. Artykuł z drugiego pytania wydaje się wskazywać na PRODUCT_STANDARD_SERVER, a jeśli miałbym instalację podstawową, powinienem spodziewać się wartości 0x0000000D zamiast PRODUCT_STANDARD_SERVER_CORE.

Czego tu brakuje. W końcu chcę utworzyć zasadę i użyć kierowania na poziomie elementu, aby zastosować tę zasadę tylko do instalacji systemu Windows 2012 Server Core.

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
źródło
Jako lekkie odchylenie od twojego pytania ... Jak zdefiniować rdzeń serwera? Przeczytałem, że rdzeń serwera jest taki sam z jedną lub dwiema mniej zainstalowanymi funkcjami (GUI). Czy nie możesz zamiast tego o to zapytać?
John
Jeśli możesz udzielić odpowiedzi na temat tego, jak wykryć, że ta funkcja jest zainstalowana za pośrednictwem WMI, to głosuję za nią i przetestuję ją. Każda odpowiedź, której można użyć do identyfikacji rdzenia serwera za pomocą WMI, byłaby moim zdaniem pomocna.
Zoredache,
Spróbuj użyć WMI na zdalnych komputerach. Get-WMIObject Win32_OptionalFeature | Select Name, InstallStatei filtruj, czy na serwerze są zainstalowane bity GUI serwera, czy nie.
Ryan Ries,

Odpowiedzi:

24

W PowerShell:

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

zwraca 1 na pełnym serwerze i 2 na podstawowej instalacji serwera.

Edytować:

Chociaż moja powyższa odpowiedź jest poprawna, istnieją z nią dwa problemy:

  1. Gdy używasz tego polecenia na stacji roboczej, nic nie zwraca, więc musisz dodać do tego dodatkową kontrolę.

  2. Jest powolny, kiedy go wypróbowałem, zajęło to od 600 do 3500 milisekund.

Bardziej pragmatycznym podejściem jest po prostu sprawdzenie istnienia określonego pliku:

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

Zwraca to $falsedla instalacji Server Core i $truedla wszystkich innych, a wykonanie zajmuje jedną milisekundę .

Peter Hahndorf
źródło
Świetna odpowiedź - szczególnie podoba mi się obejście, które oferujesz ze wszystkimi wyjaśnieniami;) Idealnie.
TomTom
6

Zabawne, że ten artykuł MSDN, który podłączyłeś, zawierał odpowiedź:

Wartości PRODUCT _ * _ SERVER_CORE nie są zwracane w systemie Windows Server 2012.

Jest tak, ponieważ Server 2012 można swobodnie konwertować między „Server Core” a „pełną” instalacją, po prostu dodając lub usuwając odpowiednie funkcje.

Będziesz chciał sprawdzić obecność lub brak tych funkcji (np. Server-Gui-Mgmt-Infra, Server-Gui-Shell, Desktop-Experience).

Michael Hampton
źródło
5

Ponieważ GUI to tylko funkcja, możesz przeszukać listę zainstalowanych funkcji

Właśnie testowanie tego w PowerShell na serwerze działało wystarczająco dobrze:

Zrzuć listę funkcji, aby zdobyć nazwę

Get-WmiObject Win32_OptionalFeature > features.txt

Przeszukanie tekstu features.txt mówi mi, że funkcja nazywa się „Server-Gui-Mgmt” (inne funkcje mogą być również instalowane, jak zauważa Michael w swojej odpowiedzi, więc możesz je przetestować), a my możemy wyszukać jeśli to jest obecne

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

wprowadź opis zdjęcia tutaj

Rob Moir
źródło
2

Podejrzewam, że ponieważ są one zasadniczo takie same w 2012 r. I mają tylko kilka opcjonalnych funkcji, aby je rozdzielić, możesz zamiast tego zapytać o funkcje.

ten artykuł jest odniesieniem do klasy Win32_OptionalFeature, która pozwoli ci zapytać o funkcje. Funkcje opcjonalne są zdefiniowane jako Server-Gui-Mgmt-Infra, Server-Gui-Shell i Desktop-Experience, jak opisano w tym artykule .

Możesz zapytać o 3 z nich i użyć logiki logicznej AND i NOT, aby wybrać serwery, na których nie zainstalowano żadnej z tych funkcji.

Jan
źródło
2

Chciałbym użyć Win32_ServerFeature, jest to znacznie mniejsza klasa i zawiera tylko role zainstalowane na serwerze. Zapytania korzystające z funkcji Win32_Server powinny zwracać się znacznie szybciej.

Get-WmiObject -Query "Select * FROM Win32_ServerFeature WHERE Name = 'Server Graphical Shell'" 
Icolan
źródło
2

Omówiono pewne wyjaśnienia dotyczące odpowiedzi dla scenariuszy lokalnych i zdalnych w związku z wydajnością. Pytający zapytał WMI, a jego przykład użył PowerShell do wywołania WMI. Korzystanie z WMI bezpośrednio z niezarządzanego kodu jest również szybsze.

Należy pamiętać, że podejścia te dotyczą skutecznie Server 2012 i Server 2012 R2 i mogą nie mieć zastosowania w przyszłych wersjach.

Niektóre kompromisy w zależności od scenariusza ... W większości przypadków Win32_ServerFeature jest preferowane jako rozwiązanie ogólne lub kontrola pliku lokalnego w mgnieniu oka.

  • Lokalne sprawdzanie plików: szybkie i brudne. Bardzo mało ruchomych części.
  • MSFT_ServerManagerDeploymentTasks: bazowy dostawca WMI używany przez Win32_ServerFeature i Get-WindowsFeature. Używa lokalnej pamięci podręcznej rejestru i zwykle zwraca bardzo szybko, chyba że nastąpiła zmiana konfiguracji od ostatniego zapytania. W przypadku braku pamięci podręcznej jest mniej więcej taki sam jak Win32_OptionalFeature. Jest to bardzo dobry interfejs, jeśli odpytujesz wiele maszyn w szybkiej sieci i potrzebujesz wielu szczegółowych informacji na temat relacji między komponentami i ich statusu - ale przy normalnym użytkowaniu jest to uciążliwe. Zamiast tego użyj Win32_ServerFeature.
  • Win32_ServerFeature: Ogólnie najlepszy wybór dla lokalnych lub zdalnych zapytań, ale nie tak szybki jak sprawdzanie plików lokalnych. Zwraca tylko zainstalowane funkcje i powoduje niewielki ruch w sieci.
  • Get-WindowsFeature: bardzo prosty w użyciu, zakładając, że używasz PowerShell jako części ścieżki wywoływania. W przypadku połączenia ze zdalnym celem powoduje to zwiększenie o ponad 400 KB w sieci, co jest przesadą, gdy chcesz tylko wiedzieć, czy konkretna funkcja jest zainstalowana.
  • Win32_OptionalFeature / Get-WindowsOptionalFeature: to zapytanie DISM na celu za każdym razem, co może być dość ciężkie.

Dotyczy to lokalnych i zdalnych scenariuszy online. Niektóre z powyższych będą również kierowane na obraz offline.

Matthew Wetmore
źródło
1

Pomyślałem, że włączę filtr WMI dla tego rozwiązania, abyś mógł zastosować obiekty GPO do systemów Core 2012+:

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

Aby przetestować to w wierszu polecenia:

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

Natknąłem się na ten wątek, próbując znaleźć sposób na utworzenie filtrów WMI dla serwerów Core 2012, iz jakiegoś powodu nie przyszło mi do głowy, aby WMI sprawdził Win32_OptionalFeature (a nawet, że taka ścieżka istnieje). Mam nadzieję, że to pomaga komuś innemu.

Tohuw
źródło
0

W systemie Windows Server 2012 R2 używam następującego, wydajność jest dobra, a jednocześnie całkiem wyraźna.

$gui = (Get-WindowsFeature -Name 'Server-Gui-Shell').Installed
Jules Clements
źródło