Identifikasi Windows 2012 Server core

18

Saya ingin mendeteksi apakah server 2012 telah diatur sebagai instalasi Inti menggunakan WMI. Pertanyaan sebelumnya, sepertinya menunjukkan bahwa saya bisa mendapatkan OperatingSystemSKU dari Win32_OperatingSystem . Sistem Core Windows 2012 saya melaporkan OperatingSystemSKU dari 7. Artikel dari pertanyaan lain akan menunjukkan adalah PRODUCT_STANDARD_SERVER, dan jika memiliki instalasi inti saya harus mengharapkan untuk melihat nilai 0x0000000D sebagai gantinya untuk PRODUCT_STANDARD_SERVER_CORE.

Apa yang kulewatkan di sini. Saya akhirnya ingin membuat kebijakan dan menggunakan penargetan tingkat item untuk hanya menerapkan kebijakan itu untuk Windows 2012 Server Core menginstal.

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
Sakit kepala
sumber
Sebagai sedikit defleksi ke pertanyaan Anda ... Bagaimana cara mendefinisikan inti server? Saya membaca bahwa inti server sama dengan satu atau dua lebih sedikit fitur yang diinstal (GUI). Tidak bisakah Anda meminta itu?
john
Jika Anda dapat memberikan jawaban tentang cara mendeteksi fitur yang diinstal melalui WMI, maka saya akan melakukan upvote, dan mengujinya. Setiap jawaban yang dapat digunakan untuk mengidentifikasi inti Server dengan WMI akan sangat membantu menurut saya.
Zoredache
Coba gunakan WMI pada mesin jarak jauh. Get-WMIObject Win32_OptionalFeature | Select Name, InstallStatedan memfilter apakah server memiliki bit GUI server yang diinstal atau tidak.
Ryan Ries

Jawaban:

24

Di PowerShell:

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

mengembalikan 1 pada server penuh dan 2 pada instalasi inti server.

Edit:

Meskipun jawaban saya di atas benar, ada dua masalah dengan itu:

  1. Saat menggunakan perintah ini di workstation, itu tidak menghasilkan apa-apa, jadi Anda harus menambahkan cek tambahan untuk ini.

  2. Itu lambat, ketika saya mencobanya, butuh antara 600 dan 3.500 milidetik.

Jadi pendekatan yang lebih pragmatis adalah dengan hanya memeriksa keberadaan file tertentu:

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

Ini mengembalikan $falseuntuk instalasi Server Core dan $trueuntuk semua yang lain dan dibutuhkan satu milidetik untuk mengeksekusi.

Peter Hahndorf
sumber
Jawaban yang bagus - Saya sangat suka solusi yang Anda tawarkan dengan semua penjelasan;) Sempurna.
TomTom
6

Lucu, artikel MSDN yang Anda tautkan berisi jawabannya:

Nilai PRODUCT _ * _ SERVER_CORE tidak dikembalikan di Windows Server 2012.

Ini karena Server 2012 dapat dikonversi secara bebas antara instalasi "Server Core" dan "penuh" hanya dengan menambahkan atau menghapus fitur yang sesuai.

Anda perlu memeriksa ada tidaknya fitur-fitur tersebut (mis. Server-Gui-Mgmt-Infra, Server-Gui-Shell, Desktop-Experience).

Michael Hampton
sumber
5

Karena GUI hanyalah sebuah fitur, Anda dapat menanyakan daftar fitur yang diinstal

Hanya menguji ini di PowerShell pada server di sini bekerja dengan cukup baik:

Buang daftar fitur untuk mengambil nama

Get-WmiObject Win32_OptionalFeature > features.txt

Mencari teks fitur.txt memberi tahu saya bahwa fitur tersebut bernama 'Server-Gui-Mgmt' (fitur lain mungkin diinstal juga seperti yang dicatat Michael dalam jawabannya, sehingga Anda dapat menguji untuk itu juga), dan kita dapat mencari untuk melihat jika itu ada

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

masukkan deskripsi gambar di sini

Rob Moir
sumber
2

Saya menduga bahwa karena keduanya pada dasarnya sama pada tahun 2012 dengan hanya beberapa fitur opsional untuk membedakannya, Anda dapat meminta fitur-fiturnya.

artikel ini adalah referensi untuk kelas Win32_OptionalFeature, yang akan memungkinkan Anda untuk menanyakan fitur. Fitur opsional didefinisikan sebagai Server-Gui-Mgmt-Infra, Server-Gui-Shell dan Desktop-Experience, sebagaimana diuraikan dalam artikel ini .

Anda dapat meminta 3 dari mereka dan menggunakan logika Boolean AND dan NOT untuk memilih server yang tidak memiliki fitur-fitur ini diinstal.

john
sumber
2

Saya akan menggunakan Win32_ServerFeature, ini adalah kelas yang jauh lebih kecil dan hanya berisi peran yang diinstal pada server. Kueri yang menggunakan fitur Win32_Server akan kembali lebih cepat.

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

Beberapa klarifikasi tentang jawaban untuk skenario lokal dan jarak jauh ketika kinerja dibahas. Penanya bertanya pada WMI, dan contohnya menggunakan PowerShell untuk memanggil WMI. Menggunakan WMI langsung dari kode yang tidak dikelola juga lebih cepat.

Harap dicatat bahwa pendekatan tersebut berlaku secara efektif untuk Server 2012 dan Server 2012 R2, dan mungkin tidak berlaku untuk rilis mendatang.

Beberapa pertukaran tergantung pada skenario Anda ... Untuk sebagian besar kasus, Win32_ServerFeature lebih disukai sebagai solusi umum, atau file lokal memeriksa dalam keadaan darurat.

  • Pemeriksaan file lokal: cepat dan kotor. Sangat sedikit bagian yang bergerak.
  • MSFT_ServerManagerDeploymentTasks: penyedia WMI yang mendasarinya digunakan oleh Win32_ServerFeature dan Get-WindowsFeature. Itu menggunakan cache registri lokal dan biasanya kembali sangat cepat kecuali ada perubahan konfigurasi sejak permintaan terakhir. Jika ada cache miss, ini hampir sama dengan Win32_OptionalFeature. Ini adalah antarmuka yang sangat baik jika Anda menanyakan banyak dan banyak mesin pada jaringan yang cepat dan membutuhkan banyak detail tentang hubungan komponen dan statusnya - tetapi untuk penggunaan normal itu menyusahkan. Gunakan Win32_ServerFeature sebagai gantinya.
  • Win32_ServerFeature: Umumnya pilihan terbaik untuk kueri lokal atau jarak jauh, tetapi tidak secepat pemeriksaan file lokal. Hanya mengembalikan fitur yang diinstal, dan sedikit lalu lintas di jaringan.
  • Get-WindowsFeature: Sangat mudah digunakan, dengan asumsi Anda sudah menggunakan PowerShell sebagai bagian dari jalur panggilan Anda. Ketika memanggil target yang jauh, ini menempatkan 400K ke atas di jaringan yang berlebihan ketika Anda hanya ingin tahu apakah fitur tertentu diinstal.
  • Win32_OptionalFeature / Get-WindowsOptionalFeature: ini permintaan DISM pada target setiap kali yang bisa sangat berat.

Itu mencakup skenario lokal dan jarak jauh online. Beberapa di atas juga akan menargetkan gambar offline.

Matthew Wetmore
sumber
1

Saya hanya berpikir saya akan berpadu dengan WMI Filter untuk solusi ini, sehingga Anda dapat menerapkan GPO ke sistem Core 2012+:

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

Untuk menguji ini di baris perintah:

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

Saya tersandung pada utas ini ketika mencoba menemukan cara untuk membuat WMI Filter untuk server Core 2012, dan untuk beberapa alasan tidak terpikir oleh saya untuk meminta WMI memeriksa Win32_OptionalFeature (atau memang, jalur seperti itu ada). Semoga ini bisa membantu orang lain.

Tohuw
sumber
0

Pada Windows Server 2012 R2, saya menggunakan yang berikut ini, kinerja baik sementara masih cukup eksplisit.

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