WindowsSysVersion.pas 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. unit WindowsSysVersion;
  2. interface
  3. uses
  4. windows, SysUtils;
  5. {$IFDEF CONDITIONALEXPRESSIONS}
  6. {$IF Defined(TOSVersionInfoEx)}
  7. {$DEFINE TOSVERSIONINFOEX_DEFINED}
  8. {$IFEND}
  9. {$ENDIF}
  10. {$IFNDEF TOSVERSIONINFOEX_DEFINED}
  11. type
  12. POSVersionInfoEx = ^TOSVersionInfoEx;
  13. TOSVersionInfoEx = packed record
  14. dwOSVersionInfoSize: DWORD;
  15. dwMajorVersion: DWORD;
  16. dwMinorVersion: DWORD;
  17. dwBuildNumber: DWORD;
  18. dwPlatformId: DWORD;
  19. szCSDVersion: array[0..127] of AnsiChar;
  20. wServicePackMajor: Word;
  21. wServicePackMinor: Word;
  22. wSuiteMask: Word;
  23. wProductType: Byte;
  24. wReserved: Byte;
  25. end;
  26. type
  27. TWinVer = (WinNone, Win95, Win98, WinMe, Win2000, WinServer2000, WinXp, WinXp64, WinServer2003, WinHomeServer, WinServer2003R2, WinVista, WinServer2008, WinServer2008R2, Win7);
  28. const
  29. VER_SERVER_NT = $80000000;
  30. {$EXTERNALSYM VER_SERVER_NT}
  31. VER_WORKSTATION_NT = $40000000;
  32. {$EXTERNALSYM VER_WORKSTATION_NT}
  33. VER_SUITE_SMALLBUSINESS = $00000001;
  34. {$EXTERNALSYM VER_SUITE_SMALLBUSINESS}
  35. VER_SUITE_ENTERPRISE = $00000002;
  36. {$EXTERNALSYM VER_SUITE_ENTERPRISE}
  37. VER_SUITE_BACKOFFICE = $00000004;
  38. {$EXTERNALSYM VER_SUITE_BACKOFFICE}
  39. VER_SUITE_COMMUNICATIONS = $00000008;
  40. {$EXTERNALSYM VER_SUITE_COMMUNICATIONS}
  41. VER_SUITE_TERMINAL = $00000010;
  42. {$EXTERNALSYM VER_SUITE_TERMINAL}
  43. VER_SUITE_SMALLBUSINESS_RESTRICTED = $00000020;
  44. {$EXTERNALSYM VER_SUITE_SMALLBUSINESS_RESTRICTED}
  45. VER_SUITE_EMBEDDEDNT = $00000040;
  46. {$EXTERNALSYM VER_SUITE_EMBEDDEDNT}
  47. VER_SUITE_DATACENTER = $00000080;
  48. {$EXTERNALSYM VER_SUITE_DATACENTER}
  49. VER_SUITE_SINGLEUSERTS = $00000100;
  50. {$EXTERNALSYM VER_SUITE_SINGLEUSERTS}
  51. VER_SUITE_PERSONAL = $00000200;
  52. {$EXTERNALSYM VER_SUITE_PERSONAL}
  53. VER_SUITE_BLADE = $00000400;
  54. {$EXTERNALSYM VER_SUITE_BLADE}
  55. VER_SUITE_EMBEDDED_RESTRICTED = $00000800;
  56. {$EXTERNALSYM VER_SUITE_EMBEDDED_RESTRICTED}
  57. VER_SUITE_SECURITY_APPLIANCE = $00001000;
  58. {$EXTERNALSYM VER_SUITE_SECURITY_APPLIANCE}
  59. VER_SUITE_WH_SERVER = $00008000;
  60. {$EXTERNALSYM VER_SUITE_WH_SERVER}
  61. PROCESSOR_ARCHITECTURE_AMD64 = 9;
  62. {$EXTERNALSYM PROCESSOR_ARCHITECTURE_AMD64}
  63. SM_SERVERR2 = 89;
  64. {$EXTERNALSYM SM_SERVERR2}
  65. const
  66. VER_NT_WORKSTATION = $0000001;
  67. {$EXTERNALSYM VER_NT_WORKSTATION}
  68. VER_NT_DOMAIN_CONTROLLER = $0000002;
  69. {$EXTERNALSYM VER_NT_DOMAIN_CONTROLLER}
  70. VER_NT_SERVER = $0000003;
  71. {$EXTERNALSYM VER_NT_SERVER}
  72. {$ENDIF} // TOSVERSIONINFOEX_DEFINED
  73. //取操作系统信息填充到结构
  74. function GetOSVersionInfo(var Info: TOSVersionInfoEx): Boolean;
  75. //windows系统类型 0表示取不到 1表示非服务器 2表示服务器
  76. function GetWindowsSystemType: integer;
  77. //取windows系统版本信息,主函数
  78. function GetWindowsSystemVersion: Twinver;
  79. //获取操作系统名字
  80. function GetHostName:string;
  81. //获取本地ip
  82. function LocalIP: string;
  83. implementation
  84. uses
  85. WinSock;
  86. function GetHostName:string;
  87. var
  88. ComputerName: array[0..MAX_COMPUTERNAME_LENGTH+1] of char;
  89. Size: Cardinal;
  90. begin
  91. result:='';
  92. Size := MAX_COMPUTERNAME_LENGTH+1;
  93. GetComputerName(ComputerName, Size);
  94. Result:=StrPas(ComputerName);
  95. end;
  96. function LocalIP: string;
  97. type
  98. TaPInAddr = array [0..10] of PInAddr;
  99. PaPInAddr = ^TaPInAddr;
  100. var
  101. phe: PHostEnt;
  102. pptr: PaPInAddr;
  103. Buffer: array [0..MAX_COMPUTERNAME_LENGTH] of char;
  104. I: Integer;
  105. Size: Cardinal;
  106. GInitData: TWSADATA;
  107. begin
  108. try
  109. WSAStartup($101, GInitData);
  110. Result := '';
  111. Size := MAX_COMPUTERNAME_LENGTH+1;
  112. GetComputerName(Buffer, Size);
  113. phe := GetHostByName(buffer);
  114. if phe <> nil Then
  115. begin
  116. pptr := PaPInAddr(Phe^.h_addr_list);
  117. I := 0;
  118. while pptr^[I] <> nil do
  119. begin
  120. if i=0 then
  121. result := StrPas(inet_ntoa(pptr^[I]^))
  122. else
  123. result:=result+ ', '+ StrPas(inet_ntoa(pptr^[I]^));
  124. Inc(I);
  125. end;
  126. end;
  127. finally
  128. WSACleanup;
  129. end;
  130. end;
  131. {
  132. OSVersionInfoEx.wProductType 类型说明
  133. 代码 值 说明
  134. ---------------------------------------------------------------------------------------------------------------------------------------
  135. VER_NT_DOMAIN_CONTROLLER 0x0000002 装的是个域服务器系统(win2000server,2003server,2008server)
  136. VER_NT_SERVER 0x0000003 装的是服务器系统(win2000server,2003server,2008server)
  137. VER_NT_WORKSTATION 0x0000001 非服务器版本(Vista, XP Professional, XP Home Edition, 2000)
  138. }
  139. //取操作系统类型 0未取到或出错 1表示非服务器 2表示服务器
  140. function GetWindowsSystemType: integer;
  141. var
  142. info: TOSVersionInfoEx;
  143. begin
  144. result := 0;
  145. if (GetOSVersionInfo(info) = false) then exit;
  146. case info.wProductType of
  147. VER_NT_WORKSTATION:
  148. begin
  149. Result := 1; //非服务器
  150. end;
  151. VER_NT_SERVER:
  152. begin
  153. Result := 2; //服务器版
  154. end;
  155. VER_NT_DOMAIN_CONTROLLER:
  156. begin
  157. Result := 2; //域服务器
  158. end;
  159. end;
  160. end;
  161. //系统 版本号 其它条件
  162. //-------------------------------------------------------------------------------------------------------
  163. //Windows 7 6 1 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
  164. //Windows Server 2008 R2 6 1 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
  165. //Windows Server 2008 6 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
  166. //Windows Vista 6 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
  167. //Windows Server 2003 R2 5 2 GetSystemMetrics(SM_SERVERR2) != 0
  168. //Windows Home Server 5 2 OSVERSIONINFOEX.wSuiteMask == VER_SUITE_WH_SERVER
  169. //Windows Server 2003 5 2 GetSystemMetrics(SM_SERVERR2) == 0
  170. //Windows XP x64 Edition 5 2 (OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
  171. //Windows XP 5 1
  172. //Windows 2000 5 0
  173. //Windows Me 4.9
  174. //Windows 98 4.1
  175. //Windows 95 4.0
  176. //取windows系统版本信息
  177. function GetWindowsSystemVersion: TWinVer;
  178. var
  179. info: TOSVersionInfoEx;
  180. sysInfo: Tsysteminfo;
  181. begin
  182. Result := WinNone;
  183. windows.GetSystemInfo(sysInfo); //系统信息
  184. try
  185. if (GetOSVersionInfo(info) = false) then exit;
  186. case info.dwMajorVersion of //主版本
  187. 4:
  188. begin
  189. case info.dwMinorVersion of //次版本
  190. 0: Result := Win95;
  191. 1: Result := Win98;
  192. 9: Result := WinMe;
  193. end;
  194. end;
  195. 5:
  196. begin
  197. case info.dwMinorVersion of
  198. 0:
  199. begin
  200. if info.wProductType = VER_NT_WORKSTATION then
  201. Result := Win2000 else Result := WinServer2000;
  202. end;
  203. 1: Result := WinXp;
  204. 2:
  205. begin
  206. if ((info.wProductType = VER_NT_WORKSTATION) and (sysinfo.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64)) then //PROCESSOR_ARCHITECTURE_AMD64
  207. Result := WinXp64;
  208. //SM_SERVERR2
  209. if GetSystemMetrics(SM_SERVERR2) = 0 then
  210. Result := WinServer2003
  211. else
  212. Result := WinServer2003R2;
  213. if info.wSuiteMask = VER_SUITE_WH_SERVER then
  214. Result := WinHomeServer;
  215. end;
  216. end;
  217. end;
  218. 6: begin
  219. case info.dwMinorVersion of
  220. 0:
  221. begin
  222. if info.wProductType = VER_NT_WORKSTATION then
  223. Result := WinVista else Result := WinServer2008;
  224. end;
  225. 1:
  226. begin
  227. if info.wProductType = VER_NT_WORKSTATION then
  228. Result := Win7 else Result := WinServer2008R2;
  229. end;
  230. end;
  231. end;
  232. end;
  233. except
  234. exit;
  235. end;
  236. end;
  237. function GetOSVersionInfo(var Info: TOSVersionInfoEx): Boolean;
  238. begin
  239. FillChar(Info, SizeOf(TOSVersionInfoEx), 0);
  240. Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);
  241. Result := GetVersionEx(TOSVersionInfo(Addr(Info)^));
  242. if (not Result) then
  243. Info.dwOSVersionInfoSize := 0;
  244. end;
  245. end.