プログラムがWindowsサーバーで実行されているかどうかを判断します

StackOverflow https://stackoverflow.com/questions/3138294

  •  01-10-2019
  •  | 
  •  

質問

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

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

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

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

役に立ちましたか?

解決

ニックの答えによって提供されたポインターのおかげで、私はついに自分が探していたものを見つけました。関数 ISOS(OS_AnyServer) 必要なことを正確に行います。任意のOSバージョンで機能するはずのサンプルコード(以前のVistaを含む、 IsOS からの関数から 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);
}

他のヒント

次のwin32関数をp/招集できます。

GetProductinfo Vista/Windows Server 2008+の場合
GetVersionEx Windows 2000+の場合

BJ Rollisonには 良い投稿サンプルコード 彼のブログでこれについて。

IsWindowsServer です 列をなして 機能します VersionHelpers.h.

コンピューターでそのヘッダーファイルを見つけて読むことができます。 API関数を使用します VerifyVersionInfoW.

機能はありません IswindowsServerkernel32.dll.

アセンブリ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();

これらの機能を使用したことがないので、どのように機能するか教えてください...

スクリプトではあるが、私は同じ問題を抱えていました。

私はこの価値を見つけました。私はWMIを使用してそれをクエリしています:

https://msdn.microsoft.com/en-us/library/aa394239(v=vs.85).aspx
Win32_OperatingSystem
ProductType
    Data type: uint32
    Access type: Read-only
    Additional system information.
    Work Station (1)
    Domain Controller (2)
    Server (3)

これを次のオペレーティングシステムバージョンでテストしました。

  • Windows XP Professional SP3
  • Windows 7エンタープライズ
  • Windows 8.1 Pro
  • Windows 8.1エンタープライズ
  • Windows 10 Pro 10.0.16299
  • Windows Server 2003 R2標準版
  • Windows Server 2003 R2 Standard Edition X64
  • Windows Server 2008 R2標準
  • Windows Server 2012データセンター
  • Windows Server 2012 R2データセンター

以下の私の例のバッチファイルを見つけてください。

ルーカス。

for /f "tokens=2 delims==" %%a in ( 'wmic.exe os get producttype /value' ) do (
    set PRODUCT_TYPE=%%a
)
if %PRODUCT_TYPE%==1 set PRODUCT_TYPE=Workstation
if %PRODUCT_TYPE%==2 set PRODUCT_TYPE=DomainController
if %PRODUCT_TYPE%==3 set PRODUCT_TYPE=Server
echo %COMPUTERNAME%: %PRODUCT_TYPE%

これをC#で簡単に実行できます。

using Microsoft.Management.Infrastructure;
...
string Namespace = @"root\cimv2";
string className = "Win32_OperatingSystem";

CimInstance operatingSystem = new CimInstance(className, Namespace);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top