4

プログラムで Windows 2012 のエディションを検出する必要があります。
以前の OS では GetProductInfo の pdwReturnedProductType を使用していましたが、msdn によると:

PRODUCT_*_SERVER_CORE 値は、Windows Server 2012 では返されません。たとえば、ベース サーバーエディションの Server Datacenter は、「フル サーバー」 と「コア サーバー」
という 2 つの異なるインストール オプションを構築するために使用されます。
Windows Server 2012 では、製品のインストール時に使用されたオプションに関係なく、GetProductInfo は PRODUCT_DATACENTER を返します。

コアエディションを検出する他の可能性はありますか?
ありがとう。

4

3 に答える 3

2
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels\
    ServerCore = 1
    Server-Gui-Mgmt = 1
    Server-Gui-Shell = 1

MSDNによると、これらのレジストリ値を使用するのが 1 つの方法です。もう 1 つの方法は、dism の出力を解析して/online /get-features /format:table、機能 ServerCore-FullServer が有効か無効かを確認することです。無効になっている場合は、サーバーコア GUI レス モードになっています。

于 2013-03-13T15:49:50.497 に答える
0

実際、Windows Core Edition を検出する正しい方法は見つかりませんでした。
したがって、解決策は、Win 2012 の場合、dwm.exe プロセスが実行されていることを検出することでした (デスクトップ ウィンドウ マネージャー)。常に実行されており、ユーザーが強制終了することはできず、Windows Core エディションには存在しません。

于 2012-10-26T14:55:45.020 に答える
0

.NET の Core エディションにはない機能/ライブラリをテストするプログラム/関数を作成できます。例えば:

using System;

public class CoreChecker
{
    public static void Main(string args[])
    {
        try
        {
            ImportNonCoreComponent();

            Console.WriteLine("NonCoreAssembly found... this is full server.");
        }
        catch (Exception e)
        {
            Console.WriteLine("NonCoreAssembly not found... this is core server.");
        }
    }

    public static void ImportNonCoreComponent()
    {
        using NonCoreAssembly;
    }
}

これが機能しない場合は、using をクラス スコープに移動し、ImportNonCoreComponent で NonCoreAssembly からクラスを作成する必要があります (これがどのように機能するかの正確なセマンティクスを思い出せません)。

注: using ステートメントは、テスト関数に分離する必要があります。JIT コンパイラがそれを処理すると、例外がスローされます。その例外はテスト関数によって処理されないため、try...catch ステートメントはそれを呼び出すメソッドにある必要があります。

この手法を使用して、MSI にカスタム アクションを実装してインストール中に失敗させたり、C# アプリケーションの一部として使用して、「フル サーバーを使用する必要があります」というメッセージを表示したりできます。(これは、アプリをインストールしてからコアにダウングレードすると機能します)。

違いが動作にある場合は、テスト関数でその動作を確認できます。

テスト関数がさまざまなシナリオおよびさまざまな .NET バージョンで機能することを確認してください。

于 2012-10-25T10:45:02.980 に答える