VB.NETでWindowsのOSバージョン情報を取得する(Windows 2000~8)

VB.NET プログラミング
この記事は約11分で読めます。

VB.NETで、Windows 2000以降、Windows 8、Windows Server 2012までのWindowsのOSバージョン情報を取得してみる。

なお、Visual Studioのバージョンは以下です。

  • Visual Studio Professional 2012
スポンサーリンク

プラットフォームのバージョン取得

まずは、VBの「Environment」クラスの「OSVersion」プロパティで取得してみる。

'OSバージョン取得関数
Function GetOsVersion() As String

    'OSバージョン返却
    Return Environment.OSVersion.ToString
End Function

そうすると、「Microsoft Windows NT 6.1.7601 Service Pack 1」(Windows 7 Professional Service Pack 1の場合)といったように、取得できるのはプラットフォームのバージョンみたい。

そもそもこのプラットフォームとは、Windows OSのもう一層下のアーキテクチャを指しているようで、Windowsのプラットフォームは「MS-DOS系」「Windows 9x系」「Windows NT系」と変遷している。

現在は、「Windows NT系」であり、Windows NT以降、Windows 8、Windows Server 2012まで、「Windows NT系」をベースに製作されているようだ。

まあ、1つ1つOSのバージョンが変わるごとにゼロから開発するのは大変ですからねぇ。

では、「Windows 8」などのバージョンを取得したい場合はどうすればいいのか。

上記のプラットフォームのバージョンだけでは、判定できない無理みたいなので頑張って取得し、判定してやる必要があるようでう。

OSバージョン取得

OSの「GetVersionEx」関数を使用すれば、OSのバージョンに関する情報を取得することができる。

また、結果を保持する「OSVERSIONINFOEX」構造体を定義してやる。

定義は以下のよう。

'GetVersionExを使うための定義
<StructLayout(LayoutKind.Sequential)> _
Private Structure OSVERSIONINFOEX
    Dim dwOSVersionInfoSize As Integer
    Dim dwMajorVersion As Integer
    Dim dwMinorVersion As Integer
    Dim dwBuildNumber As Integer
    Dim dwPlatformId As Integer
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String
    Dim wServicePackMajor As Short
    Dim wServicePackMinor As Short
    Dim wSuiteMask As Short
    Dim wProductType As Byte
    Dim wReserved As Byte
End Structure
Private Declare Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" (ByRef o As OSVERSIONINFOEX) As Integer

同様に、「GetSystemInfo」関数を使用し、プロセッサなどのコンピュータシステムに関する情報を取得する。

また、結果を保持する「SYSTEM_INFO」構造体を定義してやる。

定義は以下のよう。

'GetSystemInfoを使うための定義
Private Structure SYSTEM_INFO
    Dim wProcessorArchitecture As Long
    Dim wReserved As Long
    Dim dwPageSize As Long
    Dim lpMinimumApplicationAddress As Long
    Dim lpMaximumApplicationAddress As Long
    Dim dwActiveProcessorMask As Long
    Dim dwNumberOrfProcessors As Long
    Dim dwProcessorType As Long
    Dim dwAllocationGranularity As Long
    Dim dwReserved As Long
End Structure
Private Declare Function GetSystemInfo Lib "kernel32.dll" (ByRef o As SYSTEM_INFO) As Integer

同様に、「GetSystemMetrics」関数を使用し、システムの現在の構成に関する情報を取得する。

定義は以下のよう。

'GetSystemMetricsを使うための定義
Private Declare Function GetSystemMetrics% Lib "user32.dll" (ByVal nIndex%)

で、これらを使用し、以下のように関数を書いてみた。

'OS詳細バージョン取得関数
Function GetOsDetailVersion() As String
    'GetVersionExでOS情報取得
    Dim osInfo As New OSVERSIONINFOEX
    osInfo.dwOSVersionInfoSize = OSVERSIONINFOEX_SIZE
    Dim bVersionEx As Integer = GetVersionEx(osInfo)
    If bVersionEx = 0 Then
        osInfo.dwOSVersionInfoSize = OSVERSIONINFO_SIZE
        GetVersionEx(osInfo)
    End If

    'GetSystemInfoでシステム情報取得
    Dim sysinfo As SYSTEM_INFO
    GetSystemInfo(sysinfo)

    'OS名初期化
    Dim windowsName As String = "Unknown Windows"

    'OSバージョン判定
    Select Case osInfo.dwPlatformId
        Case VER_PLATFORM_WIN32_NT 'Windows NT系
            If osInfo.dwMajorVersion = 5 Then
                Select Case osInfo.dwMinorVersion
                    Case 0
                        windowsName = "Windows 2000"

                    Case 1
                        windowsName = "Windows XP"

                    Case 2
                        If osInfo.wProductType = VER_NT_WORKSTATION And
                            sysinfo.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64 Then

                            windowsName = "Windows XP Professional x64 Edition"

                        ElseIf GetSystemMetrics(SM_SERVERR2) = 0 Then

                            windowsName = "Windows Server 2003"

                        ElseIf (osInfo.wSuiteMask And VER_SUITE_WH_SERVER) = VER_SUITE_WH_SERVER Then

                            windowsName = "Windows Home Server"

                        ElseIf GetSystemMetrics(SM_SERVERR2) <> 0 Then

                            windowsName = "Windows Server 2003 R2"

                        End If

                End Select

            ElseIf osInfo.dwMajorVersion = 6 Then
                Select Case osInfo.dwMinorVersion
                    Case 0
                        If osInfo.wProductType = VER_NT_WORKSTATION Then

                            windowsName = "Windows Vista"

                        ElseIf osInfo.wProductType <> VER_NT_WORKSTATION Then

                            windowsName = "Windows Server 2008"

                        End If

                    Case 1
                        If osInfo.wProductType <> VER_NT_WORKSTATION Then

                            windowsName = "Windows Server 2008 R2"

                        ElseIf osInfo.wProductType = VER_NT_WORKSTATION Then

                            windowsName = "Windows 7"

                        End If

                    Case 2
                        If osInfo.wProductType <> VER_NT_WORKSTATION Then

                            windowsName = "Windows Server 2012"

                        ElseIf osInfo.wProductType = VER_NT_WORKSTATION Then

                            windowsName = "Windows 8"

                        End If

                    Case 3
                        If osInfo.wProductType <> VER_NT_WORKSTATION Then

                            windowsName = "Windows Server 2012 R2 Preview"

                        ElseIf osInfo.wProductType = VER_NT_WORKSTATION Then

                            windowsName = "Windows 8.1 Preview"

                        End If

                End Select
            End If
    End Select

    'OSバージョン返却
    Return windowsName

End Function

残念ながら、すべてのOSの結果を確認することは出来ないが、とりあえず俺のPC「Windows 7」は無事に判定できています。

もっと詳細の「Standard」「Professional」などのエディション情報や「Service Pack」の情報も判定できるらしいが、めんどくさいんで諦めました。

GitHub(ソースはコチラで公開中)

OSバージョン取得モジュール

参考サイト

Environment.OSVersion プロパティ (System)

@IT:.NET TIPS Windows OSの種類やバージョンを判別するには? – C# VB.NET

OSVERSIONINFOEX structure (Windows)

システム情報

VB Windows API 呼び出しでの状態情報を取得できますどのようにする方法

GetSystemMetrics VB Windows API 関数を呼び出すには、方法

スポンサーリンク
スポンサーリンク
プログラミング
えふめん

業務系SE・社内SEの仕事を通じて学んだことや調べたことを書いています。

えふめんをフォローする
\よかったらシェアしてね/
この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
俺の開発研究所

コメント

タイトルとURLをコピーしました