プログラムがWindowsサーバーで実行されているかどうかを判断します
-
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+の場合
IsWindowsServer
です 列をなして 機能します VersionHelpers.h
.
コンピューターでそのヘッダーファイルを見つけて読むことができます。 API関数を使用します VerifyVersionInfoW
.
機能はありません IswindowsServer
の kernel32.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);