.NET TIPS

Windows OSの種類やバージョンを判別するには?

デジタルアドバンテージ
2004/04/16

 ある特定バージョンのWindowsに特有な機能(例えばWindows XPのCD書き込み機能など)をアプリケーションから利用したい場合、プログラムではまずWindows OSのバージョンを取得し、そのバージョンごとに処理を分岐させる必要がある。そのようなときは、OperatingSystemクラス(System名前空間)を使うとWindows OSのバージョンを簡単に判別できる。

Windows OSの種類を判別するには?

 OperatingSystemクラスを使ってWindows OSを判別するには、まずEnvironmentクラス(System名前空間)のOSVersionプロパティからOperatingSystemオブジェクトを取得する。このオブジェクトのPlatformプロパティ、Version.Majorプロパティ、Version.Minorプロパティの値の組み合わせからOSを特定することができる。なお、PlatformプロパティはPlatformID列挙体(System名前空間)で定義された値で、Version.MajorプロパティとVersion.Minorプロパティは整数値である。

 この3つのプロパティの値の組み合わせとWindows OSの対応関係を次の表にまとめた。

Platformプロパティ
PlatformID.Win32Windows
PlatformID.Win32NT
Version.Majorプロパティ
4
4
5
Version.Minorプロパティ
0
10
90
0
0
1
2
Windows
95
98
Me
NT 4.0
2000
XP
2003
Windows OSの判別表
ここに挙げているものが、すべての組み合わせではない。より詳しくはリファレンス・マニュアルを参照していただきたい。
.NET Framework は、Windows 95上では動作しないので実際にはこの組み合わせはあり得ない。

 これらの組み合わせを使ってWindows OSの種類を判別するサンプル・プログラムを次に示す。

// アプリケーションのエントリ・ポイント
[STAThread]
static void Main(string[] args)
{
  // OSの情報を取得
  OperatingSystem osInfo = Environment.OSVersion;

  string windowsName = "不明";  // Windows名

  switch (osInfo.Platform)
  {
    case PlatformID.Win32Windows:  // Windows 9x系
      if (osInfo.Version.Major == 4)
      {
        switch (osInfo.Version.Minor)
        {
          case 0:  // Win95は、.NET FrameworkのサポートOSではない
            windowsName = "Windows 95";
            break;
          case 10:
            windowsName = "Windows 98";
            break;
          case 90:
            windowsName = "Windows Me";
            break;
        }
      }
      break;

    case PlatformID.Win32NT:  // Windows NT系

      if (osInfo.Version.Major == 4)
      {
        windowsName = "Windows NT 4.0";
      }
      else if (osInfo.Version.Major == 5)
      {
        switch (osInfo.Version.Minor)
        {
          case 0:
            windowsName = "Windows 2000";
            break;

          case 1:
            windowsName = "Windows XP";
            break;

          case 2:
            windowsName = "Windows Server 2003";
            break;
        }
      }
      break;
  }

  // システム情報を出力
  Console.WriteLine(
    "{0} (Platform {1} Version {2}.{3} Build {4})",
    windowsName,
    osInfo.Platform,
    osInfo.Version.Major,
    osInfo.Version.Minor,
    osInfo.Version.Build);
}
Windows OSの種類を取得するサンプル・コード(C#)
サンプル・プログラム(C#:winver1.cs)のダウンロード
 
Sub Main()

  ' OSの情報を取得
  Dim osInfo As OperatingSystem = Environment.OSVersion

  Dim windowsName As String = "不明"   ' Windows名

  Select Case osInfo.Platform
    Case PlatformID.Win32Windows  ' Windows 9x系
      If osInfo.Version.Major = 4 Then
        Select Case osInfo.Version.Minor
          Case 0  ' Win95は、.NET FrameworkのサポートOSではない
            windowsName = "Windows 95"
          Case 10
            windowsName = "Windows 98"
          Case 90
            windowsName = "Windows Me"
        End Select
      End If


    Case PlatformID.Win32NT  ' Windows NT系

      If osInfo.Version.Major = 4 Then
        windowsName = "Windows NT 4.0"
      ElseIf osInfo.Version.Major = 5 Then
        Select Case osInfo.Version.Minor
          Case 0
            windowsName = "Windows 2000"
          Case 1
            windowsName = "Windows XP"
          Case 2
            windowsName = "Windows Server 2003"
        End Select
      End If
  End Select

  ' システム情報を出力
  Console.WriteLine( _
    "{0} (Platform {1} Version {2}.{3} Build {4})", _
    windowsName, _
    osInfo.Platform, _
    osInfo.Version.Major, _
    osInfo.Version.Minor, _
    osInfo.Version.Build)

End Sub
Windows OSの種類を取得するサンプル・コード(VB.NET)
サンプル・プログラム(VB.NET:winver1.vb)のダウンロード

 筆者の環境(Windows XP SP1)でこれをコマンド・プロンプトから実行すると、

Windows XP (Platform Win32NT Version 5.1 Build 2600)

と出力された。

より詳しくWindows OSのバージョンを調べるには?

 以上の方法を使えば、おおよそのWindows OSの種類を取得できるので、多くの場合はこれで事足りるだろう。しかし、これよりもっと詳しいバージョン情報を取得したい場合もあるだろう。例えば、Windows XP Home EditionとWindows XP Professionalでアプリケーションの動作を切り替えたい場合では、Windows XPであることを判別するだけでは不十分だ。

 より詳しいWindows OSのバージョンを取得するには、Win32 APIのGetVersionEx関数を使う必要がある。GetVersionEx関数を使えば、Windows XP Home EditionとProfessionalの違いだけでなく、Windows NT 4.0 Professional/Serverの違い、Windows 2000 Professional/Server/Advanced Serverの違い、Windows Server 2003, Standard Edition/Enterprise Edition/Web Editionの違い、Windows 98/Windows 98 Second Editionの違い*1、適用されているサービスパックの種類などを判別できるようになる。

*1 マイクロソフトのサポート技術情報では、OperatingSystemオブジェクトのVersion.Revisionプロパティの値を文字列に変換して“2222A”と比較し、これを判別しているが、Version.Revisionプロパティは整数型であり、この方法は明らかに間違いである。

 そのサンプル・プログラムのダウンロードは以下のとおりだ。

■詳細なWindows OSのバージョンを取得するサンプル・プログラム

  • サンプル・プログラム(C#:winver2.cs)のダウンロード
  • サンプル・プログラム(VB.NET:winver2.vb)のダウンロード

 なお、Windows NT 4.0のService Pack 6(SP6)より前のバージョンでは、GetVersionEx関数では取得できない情報があるので、それについてはレジストリから直接、取得している。

 筆者の環境でコマンド・プロンプからこのサンプル・プログラムを実行すると、

Windows XP Professional (Platform Win32NT Version 5.1 Build 2600) Service Pack 1

と出力された。End of Article

カテゴリ:クラス・ライブラリ 処理対象:Windows環境
使用ライブラリ:OperatingSystemクラス(System名前空間)
使用ライブラリ:Environmentクラス(System名前空間)
使用ライブラリ:PlatformID列挙体(System名前空間)
 
この記事と関連性の高い別の.NET TIPS
Windows OSのエディションまで細かく判別するには?【Vista対応】
Windows OSのバージョンを判別するには?【Vista対応】
Windowsフォルダのパスやドライブ名を取得するには?
バージョン情報ダイアログを作成するには?
WindowsアプリケーションをWindows XPスタイルの外観にするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間