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</marshalas(unmanagedtype.byvaltstr,></structlayout(layoutkind.sequential)>
同様に、「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) &lt;&gt; 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 &lt;&gt; VER_NT_WORKSTATION Then windowsName = "Windows Server 2008" End If Case 1 If osInfo.wProductType &lt;&gt; 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 &lt;&gt; 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 &lt;&gt; 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」の情報も判定できるらしいが、めんどくさいんで諦めました。
参考サイト
Environment.OSVersion プロパティ (System)
@IT:.NET TIPS Windows OSの種類やバージョンを判別するには? – C# VB.NET
OSVERSIONINFOEX structure (Windows)
コメント