2012サーバーがWMIを使用してコアインストールとしてセットアップされているかどうかを検出したいと思います。以前の質問は、 OperatingSystemSKU from Win32_OperatingSystem を取得できることを示しているようです。私のWindows 2012コアシステムは、7のOperatingSystemSKUを報告しています。他の質問の article は、PRODUCT_STANDARD_SERVERであることを示しているようです。コアインストールがある場合、代わりに0x0000000Dの値が表示されるはずですPRODUCT_STANDARD_SERVER_CORE。
ここで何が欠けていますか。最終的にポリシーを作成し、アイテムレベルのターゲティングを使用して、そのポリシーを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
PowerShellの場合:
Get-WMIObject Win32_OptionalFeature | where Name -eq 'Server-Gui-Shell' | Select InstallState
フルサーバーでは1を返し、サーバーコアインストールでは2を返します。
編集:
上記の私の答えは正しいですが、それには2つの問題があります。
ワークステーションでこのコマンドを使用すると、何も返されないため、これについて追加のチェックを追加する必要があります。
遅いので、試してみると600〜3500ミリ秒かかりました。
したがって、より実用的なアプローチは、特定のファイルの存在を確認することです。
(Test-Path "$env:windir\Explorer.exe")
Server Coreインストールの場合は$false
を返し、その他の場合は$true
を返します。実行には1ミリ秒かかります。
おかしい、あなたがリンクしたMSDNの記事には答えが含まれていました:
PRODUCT _ * _ SERVER_COREの値は、Windows Server 2012では返されません。
これは、適切な機能を追加または削除するだけで、Server 2012を「Server Core」インストールと「フル」インストールの間で自由に変換できるためです。
これらの機能の有無を確認する必要があります(例:Server-Gui-Mgmt-Infra、Server-Gui-Shell、Desktop-Experience)。
GUIは単なる機能なので、インストールされている機能のリストを照会できます
ここのサーバーのPowerShellでこれをテストするだけで十分に機能しました。
名前を取得する機能のリストをダンプします
Get-WmiObject Win32_OptionalFeature > features.txt
Features.txtのテキストを検索すると、その機能の名前が「Server-Gui-Mgmt」であることがわかります(他の機能もMichaelの回答に記載されているようにインストールされている可能性があるため、テストすることもできます)。それが存在する場合
Get-WmiObject -query "select * from Win32_OptionalFeature where name = 'Server-Gui'"
パフォーマンスが議論されたときのローカルおよびリモートのシナリオの回答に関するいくつかの明確化。質問者はWMIに尋ね、彼の例ではPowerShellを使用してWMIを呼び出しました。アンマネージコードから直接WMIを使用するのも高速です。
このアプローチはServer 2012およびServer 2012 R2に効果的に適用され、将来のリリースには適用されない可能性があることに注意してください。
シナリオによっては、いくつかのトレードオフがあります...ほとんどの場合、Win32_ServerFeatureが一般的なソリューションとして、またはローカルファイルのチェックでピンチされます。
これは、オンラインのローカルおよびリモートのシナリオをカバーしています。上記の一部は、オフラインイメージもターゲットにします。
私はWin32_ServerFeatureを使用します。これははるかに小さいクラスであり、サーバーにインストールされているロールのみが含まれています。 Win32_Server機能を使用するクエリは、はるかに速く戻るはずです。
Get-WmiObject -Query "Select * FROM Win32_ServerFeature WHERE Name = 'Server Graphical Shell'"
このソリューションにWMIフィルターを使用すると、Core 2012+システムにGPOを適用できます。
SELECT * FROM Win32_OptionalFeature WHERE Caption = "Microsoft-Windows-Server-Gui-Shell-Package-DisplayName" AND InstallState = "2"
コマンドラインでこれをテストするには:
WMIC PATH Win32_OptionalFeature WHERE "Caption = 'Microsoft-Windows-Server-Gui-Shell-Package-DisplayName' AND InstallState = 2"
Core 2012サーバー用のWMIフィルターを作成する方法を見つけようとしたときにこのスレッドに遭遇しましたが、何らかの理由で、WMIにWin32_OptionalFeatureをチェックさせることはできませんでした(または、そのようなパスが存在することを確認しました)。これが他の誰かを助けることを願っています。
Windows Server 2012 R2では、以下を使用していますが、かなり明示的でありながらパフォーマンスは良好です。
$gui = (Get-WindowsFeature -Name 'Server-Gui-Shell').Installed