1
// ------------------------------------------------------------------
2 // Copyright (C) 2011-2016 Maruko Toolbox Project
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 // express or implied.
14 // See the License for the specific language governing permissions
15 // and limitations under the License.
16 // -------------------------------------------------------------------
20 using System
.Collections
;
21 using System
.Diagnostics
;
22 using System
.Management
;
23 using System
.Runtime
.InteropServices
;
24 using System
.Windows
.Forms
;
30 [StructLayout(LayoutKind
.Sequential
)]
31 private struct OSVERSIONINFOEX
33 public int dwOSVersionInfoSize
;
34 public int dwMajorVersion
;
35 public int dwMinorVersion
;
36 public int dwBuildNumber
;
37 public int dwPlatformId
;
38 [MarshalAs(UnmanagedType
.ByValTStr
, SizeConst
= 128)]
39 public string szCSDVersion
;
40 public short wServicePackMajor
;
41 public short wServicePackMinor
;
42 public short wSuiteMask
;
43 public byte wProductType
;
44 public byte wReserved
;
47 [DllImport("kernel32.dll")]
48 private static extern bool GetVersionEx(ref OSVERSIONINFOEX osVersionInfo
);
50 [DllImport("kernel32.dll")]
51 private static extern bool GetProductInfo(int dwOSMajorVersion
, int dwOSMinorVersion
, int dwSpMajorVersion
, int dwSpMinorVersion
, out uint pdwReturnedProductType
);
53 [DllImport("kernel32.dll", SetLastError
= true, CallingConvention
= CallingConvention
.Winapi
)]
54 [return: MarshalAs(UnmanagedType
.Bool
)]
55 public static extern bool IsWow64Process([In
] IntPtr hProcess
, [Out
] out bool lpSystemInfo
);
57 #region Private Constants
58 private const int VER_NT_WORKSTATION
= 1;
59 private const int VER_NT_DOMAIN_CONTROLLER
= 2;
60 private const int VER_NT_SERVER
= 3;
61 private const int VER_SUITE_SMALLBUSINESS
= 1;
62 private const int VER_SUITE_ENTERPRISE
= 2;
63 private const int VER_SUITE_TERMINAL
= 16;
64 private const int VER_SUITE_DATACENTER
= 128;
65 private const int VER_SUITE_SINGLEUSERTS
= 256;
66 private const int VER_SUITE_PERSONAL
= 512;
67 private const int VER_SUITE_BLADE
= 1024;
68 private const int PRODUCT_UNDEFINED
= 0x00000000;
69 private const int PRODUCT_ULTIMATE
= 0x00000001;
70 private const int PRODUCT_HOME_BASIC
= 0x00000002;
71 private const int PRODUCT_HOME_PREMIUM
= 0x00000003;
72 private const int PRODUCT_ENTERPRISE
= 0x00000004;
73 private const int PRODUCT_ENTERPRISE_N
= 0x0000001B;
74 private const int PRODUCT_HOME_BASIC_N
= 0x00000005;
75 private const int PRODUCT_BUSINESS
= 0x00000006;
76 private const int PRODUCT_BUSINESS_N
= 0x00000010;
77 private const int PRODUCT_STARTER
= 0x0000000B;
78 private const int PRODUCT_PROFESSIONAL
= 0x00000030;
79 private const int PRODUCT_PROFESSIONAL_N
= 0x00000031;
80 private const int PRODUCT_PROFESSIONAL_WMC
= 0x00000067;
81 private const int PRODUCT_CORE
= 0x00000065;
82 private const int PRODUCT_CORE_N
= 0x00000062;
83 private const int PRODUCT_CORE_COUNTRYSPECIFIC
= 0x00000063;
84 private const int PRODUCT_MOBILE_CORE
= 0x00000068;
85 private const int PRODUCT_MOBILE_ENTERPRISE
= 0x00000085;
86 private const int PRODUCT_EDUCATION
= 0x00000079;
87 private const int PRODUCT_EDUCATION_N
= 0x0000007A;
90 #region Public Methods
92 /// Determines whether the specified process is running under WOW64.
94 /// <returns>a boolean</returns>
95 public static bool isWow64()
97 if (Environment
.OSVersion
.Version
.Major
== 5 && Environment
.OSVersion
.Version
.Minor
== 0)
98 return false; // windows 2000
100 Process p
= Process
.GetCurrentProcess();
101 IntPtr handle
= p
.Handle
;
103 bool success
= IsWow64Process(handle
, out isWow64
);
104 if ((!success
) && (IntPtr
.Size
!= 8))
105 throw new Exception();
111 /// Returns the service pack information of the operating system running on this computer.
113 /// <returns>A string containing the operating system service pack information.</returns>
114 public static string GetOSServicePack()
116 OSVERSIONINFOEX osVersionInfo
= new OSVERSIONINFOEX();
118 osVersionInfo
.dwOSVersionInfoSize
= Marshal
.SizeOf(typeof(OSVERSIONINFOEX
));
120 if (!GetVersionEx(ref osVersionInfo
))
126 if (osVersionInfo
.szCSDVersion
!= "")
128 return " SP" + osVersionInfo
.szCSDVersion
.Substring(13, 1);
138 /// Returns the name of the operating system running on this computer.
140 /// <returns>A string containing the the operating system name.</returns>
141 public static string GetOSName()
143 OperatingSystem osInfo
= Environment
.OSVersion
;
144 OSVERSIONINFOEX osVersionInfo
= new OSVERSIONINFOEX();
145 osVersionInfo
.dwOSVersionInfoSize
= Marshal
.SizeOf(typeof(OSVERSIONINFOEX
));
146 string osName
= "UNKNOWN";
147 bool x64Detection
= true;
149 if (!GetVersionEx(ref osVersionInfo
))
152 switch (osInfo
.Platform
)
154 case PlatformID
.Win32Windows
:
156 x64Detection
= false;
157 switch (osInfo
.Version
.Minor
)
159 case 0: osName
= "Windows 95"; break;
162 if (osInfo
.Version
.Revision
.ToString() == "2222A")
163 osName
= "Windows 98 第二版";
165 osName
= "Windows 98";
168 case 90: osName
= "Windows Me"; break;
172 case PlatformID
.Win32NT
:
174 switch (osInfo
.Version
.Major
)
177 x64Detection
= false;
178 osName
= "Windows NT 3.51";
182 x64Detection
= false;
183 switch (osVersionInfo
.wProductType
)
185 case 1: osName
= "Windows NT 4.0 工作站"; break;
186 case 3: osName
= "Windows NT 4.0 服务器"; break;
192 switch (osInfo
.Version
.Minor
)
196 x64Detection
= false;
197 if ((osVersionInfo
.wSuiteMask
& VER_SUITE_DATACENTER
) == VER_SUITE_DATACENTER
)
198 osName
= "Windows 2000 数据中心服务器";
199 else if ((osVersionInfo
.wSuiteMask
& VER_SUITE_ENTERPRISE
) == VER_SUITE_ENTERPRISE
)
200 osName
= "Windows 2000 高级服务器";
202 osName
= "Windows 2000";
207 if ((osVersionInfo
.wSuiteMask
& VER_SUITE_PERSONAL
) == VER_SUITE_PERSONAL
)
208 osName
= "Windows XP 家庭版";
210 osName
= "Windows XP 专业版";
213 case 2: // winserver 2003
215 if ((osVersionInfo
.wSuiteMask
& VER_SUITE_DATACENTER
) == VER_SUITE_DATACENTER
)
216 osName
= "Windows Server 2003 数据中心版";
217 else if ((osVersionInfo
.wSuiteMask
& VER_SUITE_ENTERPRISE
) == VER_SUITE_ENTERPRISE
)
218 osName
= "Windows Server 2003 企业版";
219 else if ((osVersionInfo
.wSuiteMask
& VER_SUITE_BLADE
) == VER_SUITE_BLADE
)
220 osName
= "Windows Server 2003 网络版";
222 osName
= "Windows Server 2003 标准版";
230 switch (osInfo
.Version
.Minor
)
234 switch (osVersionInfo
.wProductType
)
238 uint edition
= PRODUCT_UNDEFINED
;
239 if (GetProductInfo(osVersionInfo
.dwMajorVersion
,
240 osVersionInfo
.dwMinorVersion
,
241 osVersionInfo
.wServicePackMajor
,
242 osVersionInfo
.wServicePackMinor
,
247 case PRODUCT_ULTIMATE
: osName
= "Windows Vista 旗舰版"; break;
248 case PRODUCT_HOME_BASIC
:
249 case PRODUCT_HOME_BASIC_N
: osName
= "Windows Vista 家庭普通版"; break;
250 case PRODUCT_HOME_PREMIUM
: osName
= "Windows Vista 家庭高级版"; break;
251 case PRODUCT_ENTERPRISE
: osName
= "Windows Vista 企业版"; break;
252 case PRODUCT_BUSINESS
:
253 case PRODUCT_BUSINESS_N
: osName
= "Windows Vista 商用版"; break;
254 case PRODUCT_STARTER
: osName
= "Windows Vista 简易版"; break;
255 default: osName
= "Windows Vista"; break;
260 case 3: // Server 2008
262 if ((osVersionInfo
.wSuiteMask
& VER_SUITE_DATACENTER
) == VER_SUITE_DATACENTER
)
263 osName
= "Windows Server 2008 数据中心服务器";
264 else if ((osVersionInfo
.wSuiteMask
& VER_SUITE_ENTERPRISE
) == VER_SUITE_ENTERPRISE
)
265 osName
= "Windows Server 2008 高级服务器";
267 osName
= "Windows Server 2008";
275 uint edition
= PRODUCT_UNDEFINED
;
276 if (GetProductInfo(osVersionInfo
.dwMajorVersion
,
277 osVersionInfo
.dwMinorVersion
,
278 osVersionInfo
.wServicePackMajor
,
279 osVersionInfo
.wServicePackMinor
,
284 case PRODUCT_ULTIMATE
: osName
= "Windows 7 旗舰版"; break;
285 case PRODUCT_HOME_BASIC
:
286 case PRODUCT_HOME_BASIC_N
: osName
= "Windows 7 家庭普通版"; break;
287 case PRODUCT_HOME_PREMIUM
: osName
= "Windows 7 家庭高级版"; break;
288 case PRODUCT_ENTERPRISE
: osName
= "Windows 7 企业版"; break;
289 case PRODUCT_BUSINESS
:
290 case PRODUCT_BUSINESS_N
: osName
= "Windows 7 专业版"; break;
291 case PRODUCT_STARTER
: osName
= "Windows 7 入门版"; break;
292 default: osName
= "Windows 7"; break;
299 uint edition
= PRODUCT_UNDEFINED
;
300 if (GetProductInfo(osVersionInfo
.dwMajorVersion
,
301 osVersionInfo
.dwMinorVersion
,
302 osVersionInfo
.wServicePackMajor
,
303 osVersionInfo
.wServicePackMinor
,
309 case PRODUCT_CORE_COUNTRYSPECIFIC
:
310 case PRODUCT_CORE_N
: osName
= "Windows 8 核心版"; break;
311 case PRODUCT_ENTERPRISE
:
312 case PRODUCT_ENTERPRISE_N
: osName
= "Windows 8 企业版"; break;
313 case PRODUCT_PROFESSIONAL
:
314 case PRODUCT_PROFESSIONAL_N
: osName
= "Windows 8 专业版"; break;
315 case PRODUCT_PROFESSIONAL_WMC
: osName
= "Windows 8 专业版(含Media Center)"; break;
316 default: osName
= "Windows 8"; break;
321 case 3: // Windows 8.1
323 uint edition
= PRODUCT_UNDEFINED
;
324 if (GetProductInfo(osVersionInfo
.dwMajorVersion
,
325 osVersionInfo
.dwMinorVersion
,
326 osVersionInfo
.wServicePackMajor
,
327 osVersionInfo
.wServicePackMinor
,
333 case PRODUCT_CORE_COUNTRYSPECIFIC
:
334 case PRODUCT_CORE_N
: osName
= "Windows 8.1 核心版"; break;
335 case PRODUCT_ENTERPRISE
:
336 case PRODUCT_ENTERPRISE_N
: osName
= "Windows 8.1 企业版"; break;
337 case PRODUCT_PROFESSIONAL
:
338 case PRODUCT_PROFESSIONAL_N
: osName
= "Windows 8.1 专业版"; break;
339 case PRODUCT_PROFESSIONAL_WMC
: osName
= "Windows 8.1 专业版(含Media Center)"; break;
340 default: osName
= "Windows 8.1"; break;
350 switch (osInfo
.Version
.Minor
)
354 switch (osVersionInfo
.wProductType
)
358 uint edition
= PRODUCT_UNDEFINED
;
359 if (GetProductInfo(osVersionInfo
.dwMajorVersion
,
360 osVersionInfo
.dwMinorVersion
,
361 osVersionInfo
.wServicePackMajor
,
362 osVersionInfo
.wServicePackMinor
,
368 case PRODUCT_CORE_COUNTRYSPECIFIC
:
369 case PRODUCT_CORE_N
: osName
= "Windows 10 家庭版"; break;
370 case PRODUCT_ENTERPRISE
:
371 case PRODUCT_ENTERPRISE_N
: osName
= "Windows 10 企业版"; break;
372 case PRODUCT_PROFESSIONAL
:
373 case PRODUCT_PROFESSIONAL_N
: osName
= "Windows 10 专业版"; break;
374 case PRODUCT_EDUCATION
:
375 case PRODUCT_EDUCATION_N
: osName
= "Windows 10 教育版"; break;
376 case PRODUCT_MOBILE_CORE
:
377 case PRODUCT_MOBILE_ENTERPRISE
: osName
= "Windows 10 移动版"; break;
378 default: osName
= "Windows 10"; break;
393 if (IntPtr
.Size
== 8)
395 if (IntPtr
.Size
== 4)
409 /// Returns the name of the highest .NET Framework running on this computer.
411 /// <returns>A string containing the Name of the Framework Version.</returns>
413 public static string GetDotNetVersion()
415 return GetDotNetVersion("");
419 /// Returns the version of the .NET framework running on this computer.
421 /// <param name="getSpecificVersion">if not empty only the specified version and if empty the highest version will be returned</param>
422 /// <returns>A string containing the version of the framework version.</returns>
423 public static string GetDotNetVersion(string getSpecificVersion
)
425 string fv
= "unknown";
426 string componentsKeyName
= "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\";
427 using (Microsoft
.Win32
.RegistryKey componentsKey
= Microsoft
.Win32
.Registry
.LocalMachine
.OpenSubKey(componentsKeyName
))
431 string[] instComps
= componentsKey
.GetSubKeyNames();
432 ArrayList versions
= new ArrayList();
434 foreach (string instComp
in instComps
)
436 if (!instComp
.StartsWith("v"))
440 Microsoft
.Win32
.RegistryKey key
= componentsKey
.OpenSubKey(instComp
);
441 string version
= (string)key
.GetValue("Version", "");
443 if (!String
.IsNullOrEmpty(version
))
445 versions
.Add(version
);
450 foreach (string strRegKey
in key
.GetSubKeyNames())
452 Microsoft
.Win32
.RegistryKey strKey
= key
.OpenSubKey(strRegKey
);
453 version
= (string)strKey
.GetValue("Version", "");
454 if (!String
.IsNullOrEmpty(version
))
457 versions
.Add(version
);
463 string install
= key
.GetValue("Install", "").ToString();
464 version
= instComp
.Substring(1);
465 if (!version
.Equals("4") && install
.Equals("1"))
466 versions
.Add(version
);
471 foreach (string version
in versions
)
473 if (!String
.IsNullOrEmpty(getSpecificVersion
) && (version
.StartsWith(getSpecificVersion
) || DotNetVersionFormated(version
).StartsWith(getSpecificVersion
)))
474 return DotNetVersionFormated(version
);
478 if (!String
.IsNullOrEmpty(getSpecificVersion
))
486 return DotNetVersionFormated(fv
);
490 /// Returns the name of the dotNet Framework formated
492 /// <returns>A string containing the dotNet Framework</returns>
494 public static string DotNetVersionFormated(string dotNetVersion
)
496 string dnvf
= "unknown";
497 string major
= string.Empty
;
498 string minor
= string.Empty
;
499 string build
= string.Empty
;
500 string revision
= string.Empty
;
504 if (dotNetVersion
!= "unknown")
506 string[] versions
= dotNetVersion
.Split('.');
508 if (versions
.Length
>= 1)
509 major
= versions
[0].ToString();
510 if (versions
.Length
> 1)
511 minor
= versions
[1].ToString();
512 if (versions
.Length
> 2)
513 build
= versions
[2].ToString();
514 if (versions
.Length
> 3)
515 revision
= versions
[3].ToString();
527 case "209": dnvf
= "1.0 SP1"; break;
528 case "288": dnvf
= "1.0 SP2"; break;
529 case "6018": dnvf
= "1.0 SP3"; break;
530 default: dnvf
= "1.0"; break;
539 case "2300": dnvf
= "1.1 SP1"; break;
540 default: dnvf
= "1.1"; break;
544 default: dnvf
= "1.x"; break;
553 case "1434": dnvf
= "2.0 SP1"; break;
558 case "4927": dnvf
= "2.0 SP2"; break;
559 default: dnvf
= "2.0"; break;
571 case "648": dnvf
= "3.0 SP1"; break;
576 case "4902": // Se7en
577 case "4926": // Se7en
578 dnvf
= "3.0 SP2"; break;
579 default: dnvf
= "3.0"; break;
587 case "4926": // Se7en
588 case "1": dnvf
= "3.5 SP1"; break;
589 default: dnvf
= "3.5"; break;
593 default: dnvf
= "3.x"; break;
601 case "0": dnvf
= "4.0"; break;
606 case "50709": dnvf
= "4.5"; break;
607 case "51641": dnvf
= "4.5.1"; break;
608 case "51650": dnvf
= "4.5.2"; break;
609 default: dnvf
= "4.5.x"; break;
617 case "00079": dnvf
= "4.6"; break;
618 default: dnvf
= "4.6.x"; break;
622 default: dnvf
= "4." + minor
; break;
626 default: dnvf
= major
+ ".x"; break;
629 if (string.IsNullOrEmpty(revision
))
630 dnvf
+= " (" + major
+ "." + minor
+ "." + build
+ ")";
632 dnvf
+= " (" + major
+ "." + minor
+ "." + build
+ "." + revision
+ ")";
637 dnvf
= "unknown: " + dotNetVersion
;
643 /// Get some stuff from the Management Object Queries
645 /// <returns>A string containing the result of the MO query.</returns>
647 public static string GetMOStuff(string queryObject
)
649 ManagementObjectSearcher searcher
= null;
653 searcher
= new ManagementObjectSearcher("SELECT * FROM " + queryObject
);
654 foreach (ManagementObject mo
in searcher
.Get())
656 if (queryObject
== "Win32_OperatingSystem")
658 res
= mo
["Caption"].ToString();
660 else if (queryObject
== "Win32_Processor")
662 res
= mo
["Name"].ToString();
664 else if (queryObject
== "Win32_LogicalDisk")
666 if (mo
["DriveType"].ToString() == "3") // HDD
668 long freespace
= long.Parse(mo
["FreeSpace"].ToString()) / 1073741824;
669 long totalsize
= long.Parse(mo
["Size"].ToString()) / 1073741824;
671 if (mo
["VolumeName"].ToString() == "")
672 mo
["VolumeName"] = "Local Disk";
674 res
+= mo
["VolumeName"].ToString() + " (" + mo
["Name"].ToString() + ") - " + Convert
.ToString(freespace
) + " Go free of " + Convert
.ToString(totalsize
) + " Go\n";
681 MessageBox
.Show(ex
.ToString());
687 #region Public Properties
689 /// Gets the full version of the operating system running on this computer.
691 public static string OSVersion
695 return Environment
.OSVersion
.Version
.ToString();
700 /// Gets the major version of the operating system running on this computer.
702 public static int OSMajorVersion
706 return Environment
.OSVersion
.Version
.Major
;
711 /// Gets the minor version of the operating system running on this computer.
713 public static int OSMinorVersion
717 return Environment
.OSVersion
.Version
.Minor
;
722 /// Gets the build version of the operating system running on this computer.
724 public static int OSBuildVersion
728 return Environment
.OSVersion
.Version
.Build
;
733 /// Gets the revision version of the operating system running on this computer.
735 public static int OSRevisionVersion
739 return Environment
.OSVersion
.Version
.Revision
;