using System; using System.Reflection; using System.Runtime.InteropServices; using Microsoft.Win32; namespace ConsoleApplication1 { class Class1 { // アプリケーションのエントリ・ポイント [STAThread] static void Main(string[] args) { // ※念のため構造体のサイズを確認 System.Diagnostics.Debug.Assert( Marshal.SizeOf(typeof(OSVERSIONINFOEX)) >= OSVERSIONINFOEX_SIZE, "OSVERSIONINFOEX構造体のサイズが156ではありません!"); // OSの情報を取得 OSVERSIONINFOEX osInfo = new OSVERSIONINFOEX(); osInfo.dwOSVersionInfoSize = OSVERSIONINFOEX_SIZE; int bVersionEx = GetVersionEx(ref osInfo); if (bVersionEx == 0) { osInfo.dwOSVersionInfoSize = OSVERSIONINFO_SIZE; GetVersionEx(ref osInfo); } string windowsName = "Unknown Windows"; // Windows名 switch (osInfo.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: // Windows 9x系 if (osInfo.dwMajorVersion == 4) { switch (osInfo.dwMinorVersion) { case 0: // Win95は、.NET FrameworkのサポートOSではない windowsName = "Windows 95"; break; case 10: ; if ((osInfo.szCSDVersion.Length <= 0) || (osInfo.szCSDVersion.Replace(" ", "") != "A")) { windowsName = "Windows 98"; } else { windowsName = "Windows 98 Second Edition"; } break; case 90: windowsName = "Windows Me"; break; } } break; case VER_PLATFORM_WIN32_NT: // Windows NT系 if (osInfo.dwMajorVersion == 4) { windowsName = "Windows NT 4.0"; if (bVersionEx != 0) // NT 4.0 SP6以降の処理 { if (osInfo.wProductType == VER_NT_WORKSTATION) { windowsName += " Workstation"; } else if ((osInfo.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE) { windowsName += " Server Enterprise Edition"; } else { windowsName += " Server"; } } else // NT 4.0 SP6より前のバージョンでの処理 { try { string rKeyName = @"SYSTEM\CurrentControlSet\Control\ProductOptions"; RegistryKey rKey = Registry.LocalMachine.OpenSubKey(rKeyName); string strProductType = (string)rKey.GetValue("ProductType"); string[] strProductSuite = (string[])rKey.GetValue("ProductSuite"); rKey.Close(); if (strProductType.ToUpper() == "WINNT") { windowsName += " Workstation"; } else { bool bEntrtrise = false; foreach (string strOneSuit in strProductSuite) { if (strOneSuit.ToUpper() == "ENTERPRISE") { bEntrtrise = true; break; } } if (bEntrtrise) { windowsName += " Server Enterprise Edition"; } else { windowsName += " Server"; } } } catch (NullReferenceException) { } } } else if (osInfo.dwMajorVersion == 5) { switch (osInfo.dwMinorVersion) { case 0: windowsName = "Windows 2000"; if ((osInfo.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER) { windowsName += " Datacenter Server"; } else if ((osInfo.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE) { windowsName += " Advanced Server"; } else { windowsName += " Server"; } break; case 1: windowsName = "Windows XP"; if ((osInfo.wSuiteMask & VER_SUITE_PERSONAL) == VER_SUITE_PERSONAL) { windowsName += " Home Edition"; } else { windowsName += " Professional"; } break; case 2: windowsName = "Windows Server 2003"; if ((osInfo.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER) { windowsName += " Datacenter Edition"; } else if ((osInfo.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE) { windowsName += " Enterprise Edition"; } else if (osInfo.wSuiteMask == VER_SUITE_BLADE) { windowsName += " Web Edition"; } else { windowsName += " Standard Edition"; } break; } } else if (osInfo.dwMajorVersion == 6) { windowsName = "Windows \"Longhorn\""; } break; } string strPlatform = "Unknown Windows"; if (osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { strPlatform = "Win32Windows"; } else if (osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { strPlatform = "Win32NT"; } // システム情報を出力 Console.WriteLine( "{0} (Platform {1} Version {2}.{3} Build {4}) {5}", windowsName, strPlatform, osInfo.dwMajorVersion, osInfo.dwMinorVersion, osInfo.dwBuildNumber, osInfo.szCSDVersion); } // GetVersionExを使うための定義 [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 byte wProductType; public byte wReserved; } [DllImport("kernel32.dll", EntryPoint="GetVersionExA")] public static extern int GetVersionEx(ref OSVERSIONINFOEX o); // OSVERSIONINFOEX構造体サイズ private const short OSVERSIONINFOEX_SIZE = 156; private const short OSVERSIONINFO_SIZE = 148; // dwPlatformId定義値 private const byte VER_PLATFORM_WIN32s = 0; private const byte VER_PLATFORM_WIN32_WINDOWS = 1; private const byte VER_PLATFORM_WIN32_NT = 2; // dwPlatformId定義値 private const short VER_NT_WORKSTATION = 1; private const short VER_NT_DOMAIN_CONTROLLER = 2; private const short VER_NT_SERVER = 3; // wSuiteMask定義値 private const short VER_SUITE_PERSONAL = 0x0200; // Windows XP Home Edition private const short VER_SUITE_DATACENTER = 0x0080; // Windows 2000 Datacenter Server、 // or Windows Server 2003, Datacenter Edition private const short VER_SUITE_ENTERPRISE = 0x0002; // Windows NT 4.0 Enterprise Edition、 // or Windows 2000 Advanced Server、 // or Windows Server 2003, Enterprise Edition private const short VER_SUITE_BLADE = 0x0400; // Windows Server 2003, Web Edition } }