Anbei ein OPSI-Skript, mit dem man Windows 7 aktivieren kann, inkl. Test auf eine erfolgreiche Aktivierung. Hier getestet mit Windows 7 Professional und Enterprise mit MAK.
Voraussetzungen:
Für Enterprise und Professional muss sich die unattended.xml ein wenig unterscheiden, vor allem in den
WindowsPE-Settings. Für Windows Enterprise darf hier
kein Key angegeben werden, sonst startet die Installation gar nicht erst.
Für
Professional sieht der betreffende Codeteil unter "Microsoft-Windows-Deployment" wie folgt aus:
Code: Alles auswählen
<UserData>
<ProductKey>
<WillShowUI>OnError</WillShowUI>
<Key>#@productkey*#</Key>
</ProductKey>
<AcceptEula>true</AcceptEula>
<FullName>#@fullname*#</FullName>
<Organization>#@orgname*#</Organization>
</UserData>
Für
Enterprise hingegen:
Code: Alles auswählen
<UserData>
<ProductKey>
<WillShowUI>OnError</WillShowUI>
<Key> </Key>
</ProductKey>
<AcceptEula>true</AcceptEula>
<FullName>#@fullname*#</FullName>
<Organization>#@orgname*#</Organization>
</UserData>
Also mit
leerem String bei "Key". Danke an Herrn Oertel für diesen entscheidenden Hinweis.
Weiter unten folgen dann die
Specialize-Settings. Hier ist unter "Microsoft-Windows-Shell-Setup" entgegen der OPSI-Vorgabe die Zeile mit dem "ProductKey" zu aktivieren. Damit wird der Windows-Key ins System geschrieben, so dass die spätere Aktivierung ohne erneute Eingabe des Keys stattfinden kann.
Code: Alles auswählen
<component name="Microsoft-Windows-Shell-Setup" [...] >
<BluetoothTaskbarIconEnabled>false</BluetoothTaskbarIconEnabled>
<ComputerName>#@pcname*#</ComputerName>
<ProductKey>#@productkey*#</ProductKey>
[...]
</component>
Damit vermeide ich, dass ich an mehreren Stellen die Windows-Keys verwalten muss, insbesondere reicht es so aus, dass im Lizenzmanagement der Windows-Key nur einem Produkt (dem Windows-Netboot-Produkt) zugewiesen sein muss.
Später wird dann ein localboot-Produkt "win7-activate" gestartet, dessen
setup.ins so aussieht:
Code: Alles auswählen
; Copyright (c) uib gmbh (www.uib.de)
; This sourcecode is owned by uib
; and published under the Terms of the General Public License.
; credits: http://www.opsi.org/credits/
[Initial]
requiredWinstVersion >= "4.8.6"
setLogLevel=3
; Log Errors in Logfile but don't abort:
ExitOnError=false
; Show syntax errors in the script:
ScriptErrorMessages=on
; Dont trace step by step through the script:
TraceMode=off
; let started programs run in front of the winst window
StayOnTop=false
[Aktionen]
DefVar $TEMP$
DefVar $ProductId$
DefVar $ProductPicture$
DefVar $outputTempFile$
DefVar $activated$
set $activated$ = "false"
DefStringList $output$
DefStringList $split$
Set $TEMP$ = EnvVar("TEMP")
; This should be edited
set $ProductId$ = "Windows-Aktivierung"
set $ProductPicture$ = "%scriptpath%\windows.png"
set $outputTempFile$ = $TEMP$ + "\out-ato.txt"
ShowBitmap /3 $ProductPicture$ $ProductID$
Message "Teste "+$ProductId$+"..."
DOSInAnIcon_ActivationStatus
sub_check_output
if ($activated$="false")
Message $ProductId$+"..."
DOSInAnIcon_ActivateWin7
DOSInAnIcon_ActivationStatus
sub_check_output
if ($activated$ = "false")
isFatalError
endif
endif
Files_cleanup
[DOSInAnIcon_ActivationStatus]
%System%\cscript.exe %System%\Slmgr.vbs /dli >$outputTempFile$
[DOSInAnIcon_ActivateWin7]
%System%\cscript.exe %System%\Slmgr.vbs /ato
[Files_cleanup]
delete -f $outputTempFile$
[sub_check_output]
set $output$ = loadTextFile ($outputTempFile$)
set $output$ = getSubList (0:-2, $output$)
for %s% in $output$ do comment "%s%"
for %line% in $output$ do sub_find_license
[sub_find_license]
set $split$ = splitStringOnWhiteSpace("%line%")
for %s% in $split$ do sub_compare
[sub_compare]
if ("%s%" = "Lizenziert")
set $activated$ = "true"
endif
Das Skript testet, ob Windows bereits aktiviert wurde. Wenn nein, versucht es eine Aktivierung und testet erneut. Ist Windows danach immer noch nicht aktiviert -> FatalError.
Für anderssprachige Windows-Installationen muss der Suchstring unter
[sub_compare] angepasst werden oder es findet jemand eine sprachunabhängige Möglichkeit, die Aktivierung zu testen.
Den Test auf die erfolgte Aktivierung mache ich mit einigen ziemlich seltsamen Stringzerlegungen, in der ich nach dem Aufruf von "Slmgr.vbs /dli" einfach nach dem String "Lizenziert" suche. Falls Winst inzwischen oder irgendwann mal reguläre Ausdrücke kann, kann man auf die ganzen Zerlegungen verzichten. Oder gibt es in Winst heute schon eine bessere Methode, einen Teilstring zu finden?