Windows のバージョン判定
開発環境: Visual Studio 2003
- 目次
- 目的
- 参考書
- Windows のバージョン判定、侮るべからず
- 「おやま」さまのバージョン判定コード
- 簡易バージョン判定コード
Windows のバージョンを判断する方法です。
意外と、面倒なので、OSバージョンに依存するコードの場合には、注意が必要です。
一見簡単そうなんですが、まじめに細かいところまで判定しようと思うと、奥が深いです。
この点に関して、C#プログラミング BBS No.242 のおやま様より詳しく教えていただきましたので、ご紹介します。
-
C#プログラミング BBS No.242
-
マイクロソフト
サポート技術情報 - 304283 [HOW TO] Visual C# .NET を使用して Windows のバージョンを判断する方法
-
マイクロソフト
サポート技術情報 - 304721 Visual C# .NET でオペレーティング システムの Service Pack レベルを判断する方法
-
MSDN OSVERSIONINFOEX
-
Microsoft Windows
Hardware and Driver Central (WHDC)
注意 |
C#プログラミング BBS No.242
のおやま様より、参考書(3)のMSDNのやり方では正常に判定できない。なぜかRevisionは必ず0を返すという報告がありました。
以下、おやま様の情報をもとにしています。
参考文献(4)、(5)では、OSVERSIONINFOEXやOSVERSIONINFOの詳しい説明が書かれています。 OSVERSIONINFOEXについてはWinNT4 SP6以降で使用可能です 使用不可なOSでは値として0を返してきます。 またSuiteMaskやProductTypeの使い方などが書かれています。 |
System.PlatformID の Enum は次のとおりです。
|
Enum の値 |
System.PlatformID.Win32S | 0 |
System.PlatformID.Win32Windows | 1 |
System.PlatformID.Win32NT | 2 |
System.PlatformID.WinCE | 3 |
|
Win 98 |
Win98 SE |
Windows Me |
Windows NT 4.0 |
Windows 2000 Pro |
Windows 2000 Server |
Windows XP Home |
Windows XP Pro |
Windows 2003 Server |
Windows CE |
Vista |
PlatformID | Win32 Windows | Win32 Windows | Win32 Windows | Win32NT | Win32NT | Win32NT | Win32NT | Win32NT | Win32NT | WinCE | 不明 |
メジャー バージョン | 4 | 4 | 4 | 4 | 5 | 5 | 5 | 5 | 5 | 不明 | たぶん 6 |
マイナ バージョン | 10 | 10 | 90 | 0 | 0 | 0 | 1 | 1 | 2 | 不明 | 不明 |
ビルド | 67766222 | 67766446 | 73010104 | 1381 | 2195 | 2195 | 2600 | 2600 | 3790 |
? | ? |
リビジョン | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
? | ? |
変更履歴 |
2003/12/1 C# プログラミング BBS
No.242の「おやま」さまのバージョン判定コードです。 |
「おやま」さまのバージョン判定コード |
// Copyright All rights reserved by おやま
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace x
{
class Class1
{
[StructLayout(LayoutKind.Sequential)]
public struct OSVERSIONINFOEX
{
public int dwOSVersionInfoSize;
public int dwMajorVersion;
public int dwMinorVersion;
public int dwBuildNumber;
public int dwPlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string szCSDVersion;
public short wServicePackMajor;
public short wServicePackMinor;
public short wSuiteMask;
public sbyte wProductType;
public sbyte wReserved;
}
public struct OSVERSIONINFO
{
public int dwOSVersionInfoSize;
public int dwMajorVersion;
public int dwMinorVersion;
public int dwBuildNumber;
public int dwPlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string szCSDVersion;
}
[DllImport("kernel32.Dll")] public static extern short GetVersionExA(ref OSVERSIONINFO o);
[DllImport("kernel32.Dll")] public static extern short GetVersionEx(ref OSVERSIONINFOEX o);
static void Main(string[] args)
{
OSVERSIONINFOEX os = new Class1.OSVERSIONINFOEX();
os.dwOSVersionInfoSize=Marshal.SizeOf(typeof(OSVERSIONINFOEX));
GetVersionEx(ref os);
if(os.dwBuildNumber == 0 )
{
OSVERSIONINFO os2 = new Class1.OSVERSIONINFO();
os2.dwOSVersionInfoSize=Marshal.SizeOf(typeof(OSVERSIONINFO));
GetVersionExA(ref os2);
Console.WriteLine(os2.dwMajorVersion);
Console.WriteLine(os2.dwMinorVersion);
Console.WriteLine(os2.dwBuildNumber & 0xFFFF);
Console.WriteLine(os2.dwPlatformId);
Console.WriteLine(os2.szCSDVersion);
}
else
{
Console.WriteLine(os.dwMajorVersion);
Console.WriteLine(os.dwMinorVersion);
Console.WriteLine(os.dwBuildNumber);
Console.WriteLine(os.dwPlatformId);
Console.WriteLine(os.szCSDVersion);
Console.WriteLine(os.wServicePackMajor);
Console.WriteLine(os.wServicePackMinor);
Console.WriteLine(os.wSuiteMask);
Console.WriteLine(os.wProductType);
Console.WriteLine(os.wReserved);
}
Console.ReadLine();
}
}
}
|
変更履歴 |
2003/10/25 初版作成 |
2003/11/23 98SE 判定を追加。 |
2003/12/1
BBSで「おやま」さまの情報より、簡易版(98、98 SEの判定ができない)に修正。 |
簡易判定バージョン.cs |
using System;
namespace WinVersion
{
/// <summary>
/// Class1 の概要の説明です。
/// </summary>
class Class1
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAtdread]
static void Main(string[] args)
{
System.PlatformID platID = System.Environment.OSVersion.Platform;
int major = System.Environment.OSVersion.Version.Major;
int minor = System.Environment.OSVersion.Version.Minor;
switch(platID)
{
case System.PlatformID.Win32Windows:
if (major == 4 && minor == 0)
Console.WriteLine("Windows 95");
else if (major == 4 && minor == 10)
Console.WriteLine("Windows 98か 98 SE");
else if (major == 4 && minor == 90)
Console.WriteLine("Windows Me");
else
tdrow new Exception("Invalid OS version");
break;
case System.PlatformID.Win32NT:
if (major == 4 && minor == 0)
Console.WriteLine("Windows NT 4.0");
else if (major == 5 && minor == 0)
Console.WriteLine("Windows 2000 Serverか 200 Pro");
else if (major == 5 && minor == 1)
Console.WriteLine("Windows XP Proか XP Home");
else if (major == 5 && minor == 2)
Console.WriteLine("Windows 2003 Server");
else
tdrow new Exception("Invalid OS version");
break;
case System.PlatformID.WinCE:
Console.WriteLine("Windows CE");
break;
default:
tdrow new Exception("Invalid OS version");
}
Console.ReadLine();
}
}
}
|