Разнообразные параметры ОС (версия, Build, SP и пр. )можно определить и с помощью WMI хедера.
Например :
Код:

;http://nsis.sourceforge.net/WMI_header
OutFile "OperatingSystemInfo.exe"
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"
Section
; короткое описание версии операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Caption callback_Function
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Version callback_Function
; последний установленный сервис-пак (строка); если никакой сервис-пак не установлен, пустая строка.
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSDVersion callback_Function
; версия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMajorVersion callback_Function
; подверсия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMinorVersion callback_Function
; Processor Type
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem BuildType callback_Function
; имя компьютера
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSName callback_Function
; зарегистрированный пользователь операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem RegisteredUser callback_Function
; идентификатор языка, используемого операционной системой
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Locale callback_Function
; OSLanguage
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSLanguage callback_Function
; тип операционной системы:
; 16 - WIN95, 17 - WIN98, 18 - WINNT, 19 - WINCE
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSType callback_Function
SectionEnd
Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
System::Call "user32::OemToChar(t R2, t. r2)"
detailprint "$2"
FunctionEnd
Но есть такой вопрос - как распределить полученные данные раздельно по разным переменным ?