DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

OSのバージョンを取得する、OSの種類を判別する

OSのバージョン情報はEnvironmentクラスのOSVersionプロパティにより取得できます。OSVersionプロパティで取得できるOperatingSystemオブジェクトのPlatformプロパティにより、OSのプラットフォーム(Windows 95系かNT系かなど)が分かります。さらに、OperatingSystemのVersionプロパティにより、OSのバージョンが分かります。

これらの情報により、OSの種類を判別する例を示します。すべての環境でテストしているわけではありませんので、正しく動作するか、ご報告をいただけると助かります。

VB.NET
コードを隠すコードを選択
'一部OSバージョンはそもそも.NET非対応のため、全くのナンセンスです

'プラットフォームの取得
Dim os As System.OperatingSystem = System.Environment.OSVersion
Select Case os.Platform
    Case System.PlatformID.Win32Windows
        Console.WriteLine("OSは Windows 95 以降です。")
        If os.Version.Major >= 4 Then
            Select Case os.Version.Minor
                Case 0
                    Console.WriteLine("OSは Windows 95 です。")
                    Exit Select
                Case 10
                    Console.WriteLine("OSは Windows 98 です。")
                    Exit Select
                Case 90
                    Console.WriteLine("OSは Windows Me です。")
                    Exit Select
            End Select
        End If
        Exit Select
    Case System.PlatformID.Win32NT
        Console.WriteLine("OSは Windows NT 以降です。")
        Select Case os.Version.Major
            Case 3
                Select Case os.Version.Minor
                    Case 0
                        Console.WriteLine("OSは Windows NT 3 です。")
                        Exit Select
                    Case 1
                        Console.WriteLine("OSは Windows NT 3.1 です。")
                        Exit Select
                    Case 5
                        Console.WriteLine("OSは Windows NT 3.5 です。")
                        Exit Select
                    Case 51
                        Console.WriteLine("OSは Windows NT 3.51 です。")
                        Exit Select
                End Select
                Exit Select
            Case 4
                If os.Version.Minor = 0 Then
                    Console.WriteLine("OSは Windows NT 4.0 です。")
                End If
                Exit Select
            Case 5
                Select Case os.Version.Minor
                    Case 0
                        Console.WriteLine("OSは Windows 2000 です。")
                        Exit Select
                    Case 1
                        Console.WriteLine("OSは Windows XP です。")
                        Exit Select
                    Case 2
                        Console.WriteLine("OSは Windows Server 2003 です。")
                        Exit Select
                End Select
                Exit Select
            Case 6
                Select Case os.Version.Minor
                    Case 0
                        Console.WriteLine("OSは Windows Vista")
                        Console.WriteLine(" または Windows Server 2008 です。")
                        Exit Select
                    Case 1
                        Console.WriteLine("OSは Windows 7")
                        Console.WriteLine(" または Windows Server 2008 R2 です。")
                        Exit Select
                End Select
                Exit Select
        End Select
        Exit Select
    Case System.PlatformID.Win32S
        Console.WriteLine("OSは Win32s です。")
        Exit Select
    Case System.PlatformID.WinCE
        Console.WriteLine("OSは Windows CE です。")
        Exit Select
    Case System.PlatformID.Unix
        '.NET Framework 2.0以降
        Console.WriteLine("OSは Unix です。")
        Exit Select
    Case System.PlatformID.Xbox
        '.NET Framework 3.5以降
        Console.WriteLine("開発プラットフォームは Xbox 360 です。")
        Exit Select
    Case System.PlatformID.MacOSX
        '.NET Framework 3.5以降
        Console.WriteLine("OSは Macintosh です。")
        Exit Select
    Case Else
        Console.WriteLine("(不明)")
        Exit Select
End Select
C#
コードを隠すコードを選択
//一部OSバージョンはそもそも.NET非対応のため、全くのナンセンスです

//プラットフォームの取得
System.OperatingSystem os = System.Environment.OSVersion;
switch (os.Platform)
{
    case System.PlatformID.Win32Windows:
        Console.WriteLine("OSは Windows 95 以降です。");
        if (os.Version.Major >= 4)
        {
            switch (os.Version.Minor)
            {
                case 0:
                    Console.WriteLine("OSは Windows 95 です。");
                    break;
                case 10:
                    Console.WriteLine("OSは Windows 98 です。");
                    break;
                case 90:
                    Console.WriteLine("OSは Windows Me です。");
                    break;
            }
        }
        break;
    case System.PlatformID.Win32NT:
        Console.WriteLine("OSは Windows NT 以降です。");
        switch (os.Version.Major)
        {
            case 3:
                switch (os.Version.Minor)
                {
                    case 0:
                        Console.WriteLine("OSは Windows NT 3 です。");
                        break;
                    case 1:
                        Console.WriteLine("OSは Windows NT 3.1 です。");
                        break;
                    case 5:
                        Console.WriteLine("OSは Windows NT 3.5 です。");
                        break;
                    case 51:
                        Console.WriteLine("OSは Windows NT 3.51 です。");
                        break;
                }
                break;
            case 4:
                if (os.Version.Minor == 0)
                {
                    Console.WriteLine("OSは Windows NT 4.0 です。");
                }
                break;
            case 5:
                switch (os.Version.Minor)
                {
                    case 0:
                        Console.WriteLine("OSは Windows 2000 です。");
                        break;
                    case 1:
                        Console.WriteLine("OSは Windows XP です。");
                        break;
                    case 2:
                        Console.WriteLine("OSは Windows Server 2003 です。");
                        break;
                }
                break;
            case 6:
                switch (os.Version.Minor)
                {
                    case 0:
                        Console.WriteLine("OSは Windows Vista");
                        Console.WriteLine(" または Windows Server 2008 です。");
                        break;
                    case 1:
                        Console.WriteLine("OSは Windows 7");
                        Console.WriteLine(" または Windows Server 2008 R2 です。");
                        break;
                }
                break;
        }
        break;
    case System.PlatformID.Win32S:
        Console.WriteLine("OSは Win32s です。");
        break;
    case System.PlatformID.WinCE:
        Console.WriteLine("OSは Windows CE です。");
        break;
    case System.PlatformID.Unix:
        //.NET Framework 2.0以降
        Console.WriteLine("OSは Unix です。");
        break;
    case System.PlatformID.Xbox:
        //.NET Framework 3.5以降
        Console.WriteLine("開発プラットフォームは Xbox 360 です。");
        break;
    case System.PlatformID.MacOSX:
        //.NET Framework 3.5以降
        Console.WriteLine("OSは Macintosh です。");
        break;
    default:
        Console.WriteLine("(不明)");
        break;
}

なおWindowsのバージョン一覧は、Wikipediaが参考になります。

補足:Windows XP互換モードでは、Environment.OSVersionと、後述するGetVersionExが別の値を返すことがあるという不具合が「互換モードでのSystem.Environment.クラスとWin32 APIの動作違い | Microsoft Connect」で報告されています。

サービスパックのバージョンを取得する

.NET Framework 2.0以降で、OperatingSystem.ServicePackプロパティを使用する方法

.NET Framework 2.0からは、OperatingSystem.ServicePackプロパティでサービスパックのバージョンを取得できます。OperatingSystem.VersionStringプロパティでもサービスパック情報の付いた文字列を取得できます。

VB.NET
コードを隠すコードを選択
'サービスパックの表示
Console.WriteLine(System.Environment.OSVersion.ServicePack)
'例えば、"Service Pack 2"のように表示される

Console.WriteLine(System.Environment.OSVersion.VersionString)
'Windows XP SP2では、次のように表示される
'"Microsoft Windows NT 5.1.2600 Service Pack 2"
C#
コードを隠すコードを選択
//サービスパックの表示
Console.WriteLine(System.Environment.OSVersion.ServicePack);
//例えば、"Service Pack 2"のように表示される

Console.WriteLine(System.Environment.OSVersion.VersionString);
//Windows XP SP2では、次のように表示される
//"Microsoft Windows NT 5.1.2600 Service Pack 2"

WMIを使用した方法

WMIを使用してOSのバージョンやSPの情報を取得することができます。こちらでバージョンの取得法を簡単に説明しています。SPの情報は、Win32_OperatingSystemクラスのCSDVersionプロパティから取得できます。

下の例ではSystem.Management.dllを参照設定に追加する必要があります。

VB.NET
コードを隠すコードを選択
Dim mc As New System.Management.ManagementClass("Win32_OperatingSystem")
Dim moc As System.Management.ManagementObjectCollection = mc.GetInstances()
Dim mo As System.Management.ManagementObject
For Each mo In moc
    Console.WriteLine("SP:{0}", mo("CSDVersion"))
    mo.Dispose()
Next
moc.Dispose()
mc.Dispose()
'"SP:Service Pack 2"のように表示される
C#
コードを隠すコードを選択
System.Management.ManagementClass mc =
    new System.Management.ManagementClass("Win32_OperatingSystem");
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{
    Console.WriteLine("SP:{0}", mo["CSDVersion"]);
    mo.Dispose();
}
moc.Dispose();
mc.Dispose();
//"SP:Service Pack 2"のように表示される

Win32 APIを使用した方法

Win32 APIのGetVersionEx関数を使うことにより、SPの情報を取得することができます。これに関しては、マイクロソフトのサポート技術情報で紹介されています。

以下にその例を示します。

VB.NET
コードを隠すコードを選択
<System.Runtime.InteropServices.StructLayout( _
    System.Runtime.InteropServices.LayoutKind.Sequential)> _
Public Structure OSVERSIONINFO
    Public dwOSVersionInfoSize As Integer
    Public dwMajorVersion As Integer
    Public dwMinorVersion As Integer
    Public dwBuildNumber As Integer
    Public dwPlatformId As Integer
    <System.Runtime.InteropServices.MarshalAs( _
        System.Runtime.InteropServices.UnmanagedType.ByValTStr, _
        SizeConst:=128)> _
    Public szCSDVersion As String
End Structure

<System.Runtime.InteropServices.DllImport("kernel32")> _
Public Shared Function GetVersionEx(ByRef osvi As OSVERSIONINFO) As Boolean
End Function

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles Button1.Click

    Dim osvi As New OSVERSIONINFO()
    osvi.dwOSVersionInfoSize = _
        System.Runtime.InteropServices.Marshal.SizeOf(osvi)
    GetVersionEx(osvi)

    'サービスパックの表示
    '"SP:Service Pack 2"のように表示される
    Console.WriteLine(("SP:" + osvi.szCSDVersion))
End Sub
C#
コードを隠すコードを選択
[System.Runtime.InteropServices.StructLayout(
    System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct OSVERSIONINFO
{
    public int dwOSVersionInfoSize;
    public int dwMajorVersion;
    public int dwMinorVersion;
    public int dwBuildNumber;
    public int dwPlatformId;
    [System.Runtime.InteropServices.MarshalAs(
        System.Runtime.InteropServices.UnmanagedType.ByValTStr,
        SizeConst = 128)]
    public string szCSDVersion;
}

[System.Runtime.InteropServices.DllImport("kernel32")]
public static extern bool GetVersionEx(ref OSVERSIONINFO osvi);

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    OSVERSIONINFO osvi = new OSVERSIONINFO();
    osvi.dwOSVersionInfoSize =
        System.Runtime.InteropServices.Marshal.SizeOf(osvi);
    GetVersionEx(ref osvi);

    //サービスパックの表示
    //"SP:Service Pack 2"のように表示される
    Console.WriteLine("SP:" + osvi.szCSDVersion);
}
  • 履歴:
  • 2005/1/5 Service Packの取得方法を追加。
  • 2007/2/20 OperatingSystem.ServicePackプロパティを使用した方法を追加。
  • 2007/5/17 OSの判別にWindows Vistaを追加。
  • 2010/3/30 OSの判別にWindows 7等を追加。説明の補足など。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。