15

プログラムが Windows Server のバージョンで実行されているかどうかを確認したいと考えています。明らかに、System.EnvironmentWindows がサーバー バージョンであるという事実に関する情報は含まれていません ( OS バージョン オブジェクトにはそのような情報はありません)。

SystemInformation.TerminalServerSessionプログラムがリモート デスクトップで実行されているかどうかを確認するために使用できることはわかっていますが (この質問も参照してください)、ユーザーが単純なクライアント Windows マシンにリモートでアクセスしている場合にも当てはまります。

コードがサーバー上で実行されているかクライアント マシン上で実行されているかを判断するサポートされている方法はありますか? 必要に応じて P/Invoke を使用してもかまいません。

注: 製品名の文字列を検索したくありません"Server"。これは、ローカリゼーションのために一部のシステムでは機能しない可能性があるためです。

4

5 に答える 5

27

ニックの答えによって提供されたポインタのおかげで、私はついに私が探していたものを見つけました。関数IsOS(OS_ANYSERVER)は、私が必要としていることを正確に実行します。これは、すべてのOSバージョンで機能するサンプルコードです(IsOS関数を序数でインポートするため、Vista以前を含むshlwapi.dll)。

class OS
{
    public static bool IsWindowsServer()
    {
        return OS.IsOS (OS.OS_ANYSERVER);
    }

    const int OS_ANYSERVER = 29;

    [DllImport("shlwapi.dll", SetLastError=true, EntryPoint="#437")]
    private static extern bool IsOS(int os);
}
于 2010-06-29T07:47:16.187 に答える
6

次のWin32関数をp/invokeできます。

GetProductInfo for Vista / Windows Server 2008+
GetVersionEx for Windows 2000+

BJ Rollisonのブログには、これに関する優れた投稿サンプルコードがあります。

于 2010-06-29T07:27:48.520 に答える
-2

アセンブリ Kernel32.DLL の WinAPI の VersionHelpers.h ヘッダー ファイルで定義された一連の「バージョン ヘルパー関数」があるはずです。ドキュメントによると、あなたのケースでうまくいくはずのものは IsWindowsServer(void) です。説明はここにあります:

http://msdn.microsoft.com/en-us/library/windows/desktop/dn424963%28v=vs.85%29.aspx

C# では、コードは次のようになります (未テスト):

using System.Runtime.InteropServices;

public static class MyClass
{
    [DllImport("Kernel32.dll")]
    public static extern Boolean IsWindowsServer();
}

そして、消費コードは単純に次のようになります。

bool is_it_a_server = MyClass.IsWindowsServer();

私はこれらの機能を使用したことがないので、その仕組みを教えてください...

于 2014-12-16T21:09:54.233 に答える