!!! ACHTUNG - evtl. veraltet - ACHTUNG !!!
Diese Seite wurde zuletzt am 9. Juli 2014 um 10:35 Uhr geändert.
M$ Windoof 7 einfach so zu „imagen“ und auf mehr als einem Rechner „deployen“ ist nicht wirklich praktikabel (gleicher Hostname, gleiche SSID,…).
M$ Windoof 7 „einfach so“ vorher per sysprep „zurückzusetzen“ bringt einen, da man bei jedem Client das nervige Setup von Hand nochmal durchgehen muss, auch nicht viiieeel weiter voran.
Auch eine individuelle Antwortdatei (unattend.xml) bringt uns an dieser Stelle nicht einen Schritt näher ans Ziel, wir bewegen uns dabei lediglich auf einer Parallelstraße, da danach alle Rechner zwar unterschiedliche SSIDs aber gleiche Hostnamen, „product keys“,… haben. Wir müssen zwar nichts mehr eingaben, aber „falsche Antworten“… naja!
Mit Bordmitteln von M$ Windoof 7 wäre hier dann auch bereits schluss, weil das Betriebssystem zum letztmöglichen Zeitpunkt vor dem Deployment (z. B. eine Batchdatei, auf welche der Registry-Schlüssel „HKLM\SYSTEM\Setup\CmdLine“ verweist und welche ein kleines Wunder vollbringt, bevor windeploy.exe aufgerufen wird) noch keine Individualkennzeichen (Mac-Adresse oder Festplatten-ID) ermitteln kann. (Windows 7 steckt diesbezüglich halt immernoch in den Kinderschuhen!)
Wie gut nur, dass ich mit Clonezilla image und deploye! Das Netzwerk-Linux startet nach dem Zurückspielen und vor dem Starten des Systems einfach ein kleines aber feines Ruby-Skript (wie gut nur, dass ich es vorher nicht mit einem VB-Skript versucht habe!), welches die „gecachte“ unattend.xml ändert (was gemäß Micro$oft tunlichst vermieden werden soll, aber wunderbar funktioniert! → siehe "Search Order 3").
Okay, okay, nen bissl Shell-Skript und ne kleine SQLite-Datenbank sind auch noch mit von der Partie, aber das war es dann auch schon.
Warum ich das hier schreibe? Ganz einfach: Immer, wenn ich dachte, ich wäre fertig, hat mich Windoof eines besseren belehrt und wieder eine Unfähigkeit des Systems zwischen mich und mein Ziel geschissen (kein Schreibfehler!).
Nach der X-ten Neuinstallation und etlichen Runden „trail and error“ dachte ich mir, dass ich das Leid keinem anderen (außer meinen ärgsten Feinden wie Bill Gates, Steve Balmer,…) wünsche und das hier einfach mal niederschreibe.
So, genug Dampf abgelassen… hier die Fakten:
Auf dem virtuellen Server, auf dem Clonezilla läuft, habe ich
dc3dd if=/dev/zero of=/dev/sda progress=on
(dc3dd, weil es gegenüber dcfldd syntax-kompatibel zu dd ist, aber zusätzlich ein „progressing“ bietet.)
Danach einfach
net stop wmpnetworksvc
C:\Windows\System32\sysprep\sysprep.exe /generalize /shutdown /oobe
(passt beides übrigens wunderbar in eine Batch-Datei, die man dann mit Administratorrechten ausführt)
aptitude install sqlite3
cd /usr/local/lib/sysprep/ sqlite3 sysprep_7.sqlite 'CREATE TABLE "clients" ("mac_address" VARCHAR(18) PRIMARY KEY NOT NULL, "username" VARCHAR(20), "hostname" VARCHAR(15), "productkey" VARCHAR(29));' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999aaaaaa','user-0100','dozent','AAAAA-AAAAA-AAAAA-AAAAA-AAAAA');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999bbbbbb','user-0101','client-0101','BBBBB-BBBBB-BBBBB-BBBBB- BBBBB');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999cccccc','user-0102','client-0102','CCCCC-CCCCC-CCCCC-CCCCC-CCCCC');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999dddddd','user-0103','client-0103','DDDDD-DDDDD-DDDDD-DDDDD-DDDDD');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999eeeeee','user-0104','client-0104','EEEEE-EEEEE-EEEEE-EEEEE-EEEEE');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999ffffff','user-0105','client-0105','FFFFF-FFFFF-FFFFF-FFFFF-FFFFF');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999gggggg','user-0106','client-0106','GGGGG-GGGGG-GGGGG-GGGGG-GGGGG');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999hhhhhh','user-0107','client-0107','HHHHH-HHHHH-HHHHH-HHHHH-HHHHH');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999iiiiii','user-0108','client-0108','IIIII-IIIII-IIIII-IIIII-IIIII');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999jjjjjj','user-0109','client-0109','JJJJJ-JJJJJ-JJJJJ-JJJJJ-JJJJJ');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999kkkkkk','user-0110','client-0110','KKKKK-KKKKK-KKKKK-KKKKK-KKKKK');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999llllll','user-0111','client-0111','LLLLL-LLLLL-LLLLL-LLLLL-LLLLL');' sqlite3 sysprep_7.sqlite 'INSERT INTO "clients" VALUES('001999mmmmmm','user-0112','client-0112','MMMMM-MMMMM-MMMMM-MMMMM-MMMMM');'
(Okay, okay, diese Daten entsprechen nicht mal unseren… müsst Ihr also in jedem Fall anpassen. Man könnte das ganze auch in eine Datei schreiben und importieren oder mit ner GUI erledigen,… das überlass ich Euch!)
zurück auf den virtuellen Server, auf dem Clonezilla läuft:
aptitude install ruby libsylite3-ruby cd tmp wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz tar xvfz rubygems-1.3.7.tgz cd rubygems-1.3.7 ruby setup.rb cd tmp rm -rf /tmp/rubygems-1.3.7 ln -s /usr/bin/gem1.8 /usr/bin/gem gem install activerecord macaddr
Weil die POSTRUN-Skripte unter Clonezilla etwas umständlicher aktualisiert werden müssen, bedienen wir uns hier lediglich eines „Wrapper-Skripts“:
/tftpboot/node_root/opt/drbl/share/ocs/postrun/sysprep_wrapper:
#!/bin/bash /usr/local/sbin/config_sysprep exit 0
und PRE- & POSTRUN-Ordner "aktivieren"
Wollen wir nun das Skript im laufenden Betrieb (DRBL-Client läuft) ändern, können wir das auf dem DRBL-Server tun und es wirkt sich unverzüglich auch auf den Client aus (weil es in der NFS-Freigabe geändert wird).
/usr/local/sbin/config_sysprep:
#!/bin/bash mkdir /mnt/sda2 ntfs-3g /dev/sda2 /mnt/sda2 /usr/local/sbin/sysprep_7.rb rm /mnt/sda2/Windows/Panther/unattend.xml mv /mnt/sda2/Windows/Panther/merged.xml /mnt/sda2/Windows/Panther/unattend.xml sync umount /dev/sda2 exit 0
(Okay, okay, sauberer wäre es, alles auf eventluell auftretende Fehler zu überprüfen und abzufangen… aber so läuft es erstmal!)
/usr/local/sbin/sysprep_7.rb erstellen:
#!/usr/bin/ruby # needed gems: sqlite3-ruby, activerecord sowie macaddr require "rubygems" require "active_record" require "macaddr" require "rexml/document" include REXML ActiveRecord::Base.establish_connection( :adapter => "sqlite3", :database => '/usr/local/lib/sysprep/sysprep_7.sqlite' ) class Client < ActiveRecord::Base end client = Client.find_by_mac_address( Mac.address.delete( ":-" ).downcase ) input = File.open( '/mnt/sda2/Windows/Panther/unattend.xml', "r" ) doc = Document.new( input ) doc.root.elements[["settings[@pass='oobeSystem']]/component[[@name='Microsoft-Windows-Shell-Setup']]/UserAccounts/LocalAccounts/LocalAccount/Name"].text = client.username doc.root.elements[["settings[@pass='specialize']]/component[[@name='Microsoft-Windows-Shell-Setup']]/ComputerName"].text = client.hostname doc.root.elements[["settings[@pass='specialize']]/component[[@name='Microsoft-Windows-Shell-Setup']]/AutoLogon/Username"].text = client.username doc.root.elements[["settings[@pass='specialize']]/component[[@name='Microsoft-Windows-Shell-Setup']]/ProductKey"].text = client.productkey output = File.new( '/mnt/sda2/Windows/Panther/merged.xml', "w" ) output.puts doc output.close input.close exit 0
Wird nun das Image zurückgespielt, wird die Festplatte (in unserem Fall die erste, also /dev/sda)