.NET TIPS

Windows OSのバージョンを判別するには?【Vista対応】[2.0のみ、C#、VB]

デジタルアドバンテージ 一色 政彦
2007/02/09

本稿はWindows Vistaおよび.NET Framework 2.0を対象に、「TIPS:Windows OSの種類やバージョンを判別するには?」を改訂したものです。

 ある特定バージョンの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 6
Version.Minorプロパティ 0 10 90 0 0 1 2 0
Windows OS 95*1 98 Me NT 4.0*2 2000 XP 2003 Vista
Windows OSの判別表
*1 すべての.NET Frameworkは、Windows 95上では動作しないので実際にはこの組み合わせはあり得ない。
*2 .NET Framework 2.0は、Windows NT 4.0上では動作しないので実際にはこの組み合わせはあり得ない。

 .NET Framework 2.0のOperatingSystemクラスでは、これらのプロパティに加えてServicePackプロパティが追加されている。このプロパティからはWindows OSに提供されたサービス・パック名(例えば「Service Pack 2」など)を得られる。

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

using System;

class Program
{
  [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:  // .NET Frameworkのサポートなし
              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)
        {
          // .NET Framework 2.0以降のサポートなし
          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;
          }
        }
        else if (osInfo.Version.Major == 6)
        {
          switch (osInfo.Version.Minor)
          {
            case 0:
              windowsName = "Windows Vista";
              break;
          }
        }
        break;
    }

    // システム情報を出力
    Console.WriteLine(
      "{0} (Platform {1} Version {2}.{3} Build {4}) {5}",
      windowsName,
      osInfo.Platform,
      osInfo.Version.Major,
      osInfo.Version.Minor,
      osInfo.Version.Build,
      osInfo.ServicePack);  // サービス・パック名
  }
}
Module Module1

    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  ' .NET Frameworkのサポートなし
                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
            ' .NET Framework 2.0以降のサポートなし
            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
        ElseIf osInfo.Version.Major = 6 Then
            Select Case osInfo.Version.Minor
            Case 0
                windowsName = "Windows Vista"
            End Select
        End If
    End Select

    ' システム情報を出力
    Console.WriteLine( _
        "{0} (Platform {1} Version {2}.{3} Build {4}) {5}", _
        windowsName, _
        osInfo.Platform, _
        osInfo.Version.Major, _
        osInfo.Version.Minor, _
        osInfo.Version.Build, _
        osInfo.ServicePack)  ' サービス・パック名

    End Sub

End Module
Windows OSのバージョンを取得するサンプル・プログラム(上:C#、下:VB)

 Windows Vista Ultimate環境でこれをコマンド・プロンプトから実行すると、

Windows Vista (Platform Win32NT Version 6.0 Build 6000)

と出力された。

 なお、OSのバージョンによってアプリケーションの起動をブロックするようなコードを実装する場合、将来のバージョンのOSでもプログラムがそのまま動作するように、「6.0(=Vista)以降」というロジックもあらかじめ実装しておいた方がよいだろう。

 たいていの場合、本稿のバージョンの判別方法で事足りるだろうが、アプリケーションによってはさらに細かなエディションの判定、例えばWindows Vistaの「Ultimate」と「Home Basic」の違いなども判別しなければならないケースもあるだろう。この方法については「TIPS:Windows OSのエディションまで細かく判別するには?【Vista対応】」で紹介している。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:Windows環境
使用ライブラリ:OperatingSystemクラス(System名前空間)
使用ライブラリ:Environmentクラス(System名前空間)
使用ライブラリ:PlatformID列挙体(System名前空間)
関連TIPS:Windows OSの種類やバージョンを判別するには?
関連TIPS:Windows OSのエディションまで細かく判別するには?【Vista対応】

この記事と関連性の高い別の.NET TIPS
Windows OSの種類やバージョンを判別するには?
Windows OSのエディションまで細かく判別するには?【Vista対応】
バージョン情報ダイアログを作成するには?
Windowsフォルダのパスやドライブ名を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間