NSIS: GetWindowsVersion corretto per individuare ogni versione di Windows 10

| |

Vorrei tanto parlarti di NSIS? Assolutamente sì. Ne ho il tempo e modo? Forse no. Se però vuoi farti un’idea di cosa si tratta, il “Nullsoft Scriptable Install System” viene descritto su Wikipedia come:

un sistema di installazione (installer) guidato da script con minimo overhead e open source, supportato dalla Nullsoft, creatrice di Winamp.

NSIS 1 è per molte vie simile al classico installer di Microsoft Windows, ma rimane di più facile configurazione attraverso script e offre il supporto ad un maggior numero di formati di compressione. NSIS 2 offre un’interfaccia grafica più accattivante, supporta la compressione LZMA, più lingue e un semplice sistema di plug-in. Il compilatore di script NSIS compila su piattaforme POSIX.

it.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System

Io ci scrivo buona parte dei pacchetti di installazione dei software personalizzati che usiamo in azienda e mi ritengo parecchio soddisfatto per il suo funzionamento. È tutto sommato facile da imparare, si entra abbastanza rapidamente nel suo modo di ragionare e approcciarsi ai client. Oggi in realtà questo articolo lo dedico a un file di script NSH che contiene il necessario per il riconoscimento del Sistema Operativo in uso sul PC. Si tratta dell’originale di Yazno, aggiornato poi da altri autori che hanno contribuito al miglioramento affinché lo script sia in grado di riconoscere quanti più sistemi di Redmond possibili. Io ho apportato una piccola correzione che permette il corretto riconoscimento di Windows 10 a partire dalle versioni 19x in poi.

Codice disponibile su Gist:

; GetWindowsVersion 4.1.2 (2022-01-24) - alternate script with server versions
;
; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
; Update by Joost Verburg, Giovanni 'Gioxx' Solone
; Update (Macro, Define, Windows 7 detection) - John T. Haller of PortableApps.com - 2008-01-07
; Update (Windows 8 detection) - Marek Mizanin (Zanir) - 2013-02-07
; Update (Windows 8.1 detection) - John T. Haller of PortableApps.com - 2014-04-04
; Update (Windows 2008, 2008R2, 2012 and 2012R2 detection) - Francisco Simoões Filho franksimoes@gmail.com - 2014-08-25
; Update (Windows 10 TP detection) - John T. Haller of PortableApps.com - 2014-10-01
; Update (Windows 10 TP4 and 2016 detection, and added include guards) - Kairu - 2015-06-22
; Update (Windows 10 detection with CurrentVersion 6.3) - Gioxx - 2022-01-24
;
; Usage: ${GetWindowsVersion} $R0
;
; $R0 contains: 95, 98, ME, NT x.x, 2000, XP, 2003, Vista, 2008, 7, 2008R2,
; 8, 2012, 8.1, 2012R2, 10.0, 10, 2016 or '' (for unknown)
!ifndef __GET_WINDOWS_VERSION_NSH
!define __GET_WINDOWS_VERSION_NSH
Function GetWindowsVersion
Push $R0
Push $R1
Push $R2
; check if Windows 10 family (CurrentMajorVersionNumber is new introduced in Windows 10)
ReadRegStr $R0 HKLM \
"SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentMajorVersionNumber
StrCmp $R0 '' 0 lbl_winnt
ClearErrors
; check if Windows NT family
ReadRegStr $R0 HKLM \
"SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
IfErrors 0 lbl_winnt
; we are not NT
ReadRegStr $R0 HKLM \
"SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber
StrCpy $R1 $R0 1
StrCmp $R1 '4' 0 lbl_error
StrCpy $R1 $R0 3
StrCmp $R1 '4.0' lbl_win32_95
StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98
lbl_win32_95:
StrCpy $R0 '95'
Goto lbl_done
lbl_win32_98:
StrCpy $R0 '98'
Goto lbl_done
lbl_win32_ME:
StrCpy $R0 'ME'
Goto lbl_done
lbl_winnt:
; check if Windows is Client or Server.
ReadRegStr $R2 HKLM \
"SOFTWARE\Microsoft\Windows NT\CurrentVersion" InstallationType
StrCpy $R1 $R0 1
StrCmp $R1 '3' lbl_winnt_x
StrCmp $R1 '4' lbl_winnt_x
StrCpy $R1 $R0 3
StrCmp $R1 '5.0' lbl_winnt_2000
StrCmp $R1 '5.1' lbl_winnt_XP
StrCmp $R1 '5.2' lbl_winnt_2003
StrCmp $R1 '6.0' lbl_winnt_vista_2008
StrCmp $R1 '6.1' lbl_winnt_7_2008R2
StrCmp $R1 '6.2' lbl_winnt_8_2012
StrCmp $R1 '6.3' lbl_winnt_81_2012R2
StrCmp $R1 '6.4' lbl_winnt_10_2016 ; the early Windows 10 tech previews used version 6.4
StrCpy $R1 $R0 4
StrCmp $R1 '10.0' lbl_winnt_10_2016 ; This is wrong? 10 is still reports as 6.3?
StrCmp $R1 '10' lbl_winnt_10_2016 ; This is wrong? 10 is still reports as 6.3?
Goto lbl_error
lbl_winnt_x:
StrCpy $R0 "NT $R0" 6
Goto lbl_done
lbl_winnt_2000:
Strcpy $R0 '2000'
Goto lbl_done
lbl_winnt_XP:
Strcpy $R0 'XP'
Goto lbl_done
lbl_winnt_2003:
Strcpy $R0 '2003'
Goto lbl_done
;----------------- Family - Vista / 2008 -------------
lbl_winnt_vista_2008:
StrCmp $R2 'Client' go_vista
StrCmp $R2 'Server' go_2008
go_vista:
Strcpy $R0 'Vista'
Goto lbl_done
go_2008:
Strcpy $R0 '2008'
Goto lbl_done
;-----------------------------------------------------
;----------------- Family - 7 / 2008R2 -------------
lbl_winnt_7_2008R2:
StrCmp $R2 'Client' go_7
StrCmp $R2 'Server' go_2008R2
go_7:
Strcpy $R0 '7'
Goto lbl_done
go_2008R2:
Strcpy $R0 '2008R2'
Goto lbl_done
;-----------------------------------------------------
;----------------- Family - 8 / 2012 -------------
lbl_winnt_8_2012:
StrCmp $R2 'Client' go_8
StrCmp $R2 'Server' go_2012
go_8:
Strcpy $R0 '8'
Goto lbl_done
go_2012:
Strcpy $R0 '2012'
Goto lbl_done
;-----------------------------------------------------
;----------------- Family - 8.1 / 2012R2 -------------
lbl_winnt_81_2012R2:
StrCmp $R2 'Client' go_81
StrCmp $R2 'Server' go_2012R2
go_81:
Strcpy $R0 '8.1'
Goto lbl_done
go_2012R2:
Strcpy $R0 '2012R2'
Goto lbl_done
;-----------------------------------------------------
;----------------- Family - 10 / 2016 -------------
lbl_winnt_10_2016:
StrCmp $R2 'Client' go_10
StrCmp $R2 'Server' go_2016
go_10:
Strcpy $R0 '10.0'
Strcpy $R0 '10'
Goto lbl_done
go_2016:
Strcpy $R0 '2016'
Goto lbl_done
;-----------------------------------------------------
lbl_error:
Strcpy $R0 ''
lbl_done:
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
!macro GetWindowsVersion OUTPUT_VALUE
Call GetWindowsVersion
Pop `${OUTPUT_VALUE}`
!macroend
!define GetWindowsVersion '!insertmacro "GetWindowsVersion"'
!endif
view raw WinVerNew.nsh hosted with ❤ by GitHub

Se fai uso del file WinVer.nsh o WinVerNew.nsh, puoi tranquillamente sostituirlo con quello da me aggiornato, rileverà Windows 10 a prescindere dalla sua versione e soprattutto non lo confonderà con Windows Server 2016. Per dubbi, perplessità, opere o omissioni, l’area commenti è poco più sotto.

#StaySafe

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Pillole

Le pillole sono articoli di veloce lettura dedicati a notizie, script o qualsiasi altra cosa possa essere "divorata e messa in pratica" con poco. Uno spazio del blog riservato agli articoli "a bruciapelo"!
Se vuoi leggere le altre pillole fai clic qui.

Condividi l'articolo con i tuoi contatti:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Commenti
Oldest
Newest Most Voted
Inline Feedbacks
View all comments