web-dev-qa-db-ja.com

Windows 2012 Serverコアを特定する

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
18
Zoredache

PowerShellの場合:

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

フルサーバーでは1を返し、サーバーコアインストールでは2を返します。

編集:

上記の私の答えは正しいですが、それには2つの問題があります。

  1. ワークステーションでこのコマンドを使用すると、何も返されないため、これについて追加のチェックを追加する必要があります。

  2. 遅いので、試してみると600〜3500ミリ秒かかりました。

したがって、より実用的なアプローチは、特定のファイルの存在を確認することです。

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

Server Coreインストールの場合は$falseを返し、その他の場合は$trueを返します。実行には1ミリ秒かかります。

24
Peter Hahndorf

おかしい、あなたがリンクしたMSDNの記事には答えが含まれていました:

PRODUCT _ * _ SERVER_COREの値は、Windows Server 2012では返されません。

これは、適切な機能を追加または削除するだけで、Server 2012を「Server Core」インストールと「フル」インストールの間で自由に変換できるためです。

これらの機能の有無を確認する必要があります(例:Server-Gui-Mgmt-Infra、Server-Gui-Shell、Desktop-Experience)。

6
Michael Hampton

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'"

enter image description here

5
Rob Moir

パフォーマンスが議論されたときのローカルおよびリモートのシナリオの回答に関するいくつかの明確化。質問者はWMIに尋ね、彼の例ではPowerShellを使用してWMIを呼び出しました。アンマネージコードから直接WMIを使用するのも高速です。

このアプローチはServer 2012およびServer 2012 R2に効果的に適用され、将来のリリースには適用されない可能性があることに注意してください。

シナリオによっては、いくつかのトレードオフがあります...ほとんどの場合、Win32_ServerFeatureが一般的なソリューションとして、またはローカルファイルのチェックでピンチされます。

  • ローカルファイルチェック:すばやくダーティ。可動部品はほとんどありません。
  • MSFT_ServerManagerDeploymentTasks:Win32_ServerFeatureおよびGet-WindowsFeatureによって使用される基になるWMIプロバイダー。これはローカルレジストリキャッシュを使用し、最後のクエリ以降に構成の変更がない限り、通常は非常に迅速に戻ります。キャッシュミスが発生した場合は、Win32_OptionalFeatureとほぼ同じです。これは、高速ネットワーク上の多数のマシンにクエリを実行していて、コンポーネントの関係とそのステータスに関する多くの詳細が必要な場合に非常に優れたインターフェースですが、通常の使用では面倒です。代わりにWin32_ServerFeatureを使用してください。
  • Win32_ServerFeature:一般に、ローカルまたはリモートのクエリに最適なオールラウンドの選択肢ですが、ローカルファイルのチェックほど高速ではありません。インストールされている機能のみを返し、ネットワークへのトラフィックはほとんどありません。
  • Get-WindowsFeature:呼び出しパスの一部として既にPowerShellを使用していると仮定すると、使用方法は非常に簡単です。リモートターゲットに対して呼び出すと、ネットワーク全体で400K以上になり、特定の機能がインストールされているかどうかを知りたいだけの場合はやりすぎです。
  • Win32_OptionalFeature/Get-WindowsOptionalFeature:これは毎回ターゲットのDISMにクエリを実行しますが、かなり重い可能性があります。

これは、オンラインのローカルおよびリモートのシナリオをカバーしています。上記の一部は、オフラインイメージもターゲットにします。

2
Matthew Wetmore

私はWin32_ServerFeatureを使用します。これははるかに小さいクラスであり、サーバーにインストールされているロールのみが含まれています。 Win32_Server機能を使用するクエリは、はるかに速く戻るはずです。

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

2012年も基本的には同じですが、それらを区別するためのオプション機能がいくつかあるだけなので、代わりに機能をクエリできます。

この記事 は、Win32_OptionalFeatureクラスの参照であり、機能のクエリを実行できます。オプションの機能は、Server-Gui-Mgmt-Infra、Server-Gui-Shell、およびDesktop-Experienceとして定義されており、 この記事 で概説されています。

これらの3つを照会し、ブールANDおよびNOTロジックを使用して、これらの機能がインストールされていないサーバーを選択できます。

2
john

このソリューションに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をチェックさせることはできませんでした(または、そのようなパスが存在することを確認しました)。これが他の誰かを助けることを願っています。

1
Tohuw

Windows Server 2012 R2では、以下を使用していますが、かなり明示的でありながらパフォーマンスは良好です。

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