Seite 1 von 1

Windows 7 Aktivierung

Verfasst: 02 Sep 2011, 14:54
von d.oertel
Hallo allerseits,

hat jemand hier schon ein opsi Produkt zur Aktivierung von Windows 7 geschrieben
und stellt dies auch der Community zur Verfügung ?

danke

gruss
d.oertel

Re: Windows 7 Aktivierung

Verfasst: 05 Sep 2011, 15:48
von matth46
Sowas?

http://theitbros.com/sysprep-a-windows- ... -to-finish

Schritt 6, Nr. 7:
FirstLogonCommands

CommandLine: cscript //b c:\windows\system32\slmgr.vbs /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX (windows 7 license key)
Order 1
RequiresUserInput: false
CommandLine: cscript //b c:\windows\system32\slmgr.vbs /ato
Order 2
RequiresUserInput: false

SynchronousCommand[Order="1"]

SynchronousCommand[Order="2"]

OOBE

HideEULAPage: true
NetworkLocation: Home
ProtectYourPC: 1

cscript c:\windows\system32\slmgr.vbs

Code: Alles auswählen

Windows-Software-Lizenzverwaltungstool
Syntax: slmgr.vbs [Computername [Benutzerkennwort]] [<Option>]
           Computername: Name des Remotecomputers (Standard: lokaler Computer)
           Benutzer:     Konto mit erforderlichen Rechten für Remotecomputer
           Kennwort:     Kennwort für das vorherige Konto

Globale Optionen:
/ipk <Product Key>
    Product Key installieren (ersetzt den vorhandenen Key)
/ato [Aktivierungs-ID]
    Windows aktivieren

Re: Windows 7 Aktivierung

Verfasst: 06 Sep 2011, 10:00
von tbremer
Prinzipiell geht dass schon in die richtige Richtung. Wenn ich das Kommando "FirstLogonCommands" aber richtig verstehe, wird das bei dem allerersten Login eines beliebigen Users einmalig aufgerufen. Wenn dieser User ein Admin ist, ist alles gut, aber genau darauf kann man sich nicht unbedingt verlassen (je nach Umgebung wird z.B. ein PC komplett aus der Ferne neu aufgesetzt).

Ich hatte bislang zwei Möglichkeiten probiert, einmal über die unattended.xml als "RunSynchronous" und einmal als eigene postinstall-Datei.

In der unattended.xml:

Code: Alles auswählen

				<RunSynchronousCommand wcm:action="add">
					<Description>Activate Windows</Description>
					<Order>3</Order>
					<Path>cmd.exe /c C:\Windows\System32\cscript.exe C:\Windows\System32\Slmgr.vbs /ato</Path>
				</RunSynchronousCommand>
Leider ohne Auswirkungen, Windows ist danach immer noch nicht aktiviert. Gleiches, wenn ich eine eigene Batchdatei in "custom/postinst.d" anlege. Ich merke zwar, dass die Datei ausgeführt wird (ein "pause" in der Batch stoppt das ganze erfolgreich), bekomme jedoch in dem Fenster keinen Output angezeigt und kann also auch nicht sehen, warum die Aktivierung auch an dieser Stelle scheitert. Hat das Windows an dieser Stelle aus irgendeinem Grund noch kein Netz?

Was letzten Endes klappt, ist die Aktivierung als lokales Produkt. Nicht so schön, weil man zwangsweise noch ein Paket mehr hat, aber es geht damit wenigstens.

Re: Windows 7 Aktivierung

Verfasst: 06 Sep 2011, 13:02
von tbremer
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?