[HowTo] Utilisation de la solution SYSPREP sous Windows Seven
Cette documentation a été rédigée par mes soins lors de mon stage au sein de l'IUT de Metz. Cette solution est actuellement utilisée dans un parc de 850 machines. À noter qu'elle est en complément de mon HowTo de déploiement d'images via Clonezilla.
Liminaire
Objectifs
Les objectifs au terme de ce projet sont de pouvoir :
- Générer un nouveau sid aléatoire au poste ainsi que faire un refresh matériel de ce dernier.
- Paramétrer le premier démarrage de façon transparente (aucune demande pour entrer les utilisateurs, etc....)
- Récupérer le nom de la machine via reverse dns
- Intégrer automatiquement le domaine
- Configurer l’horloge via ntp
Outils indispensables
- WAIK (pour seven) afin de générer un fichier de réponse fonctionnel.
- Le fichier .clg correspondant au fichier .wim dans le DVD d’installation de windows seven (dans \source)
Mise en place de SYSPREP
Pour ceci, il faut récupérer le fichier (du style windows seven entreprisen.clg) dans le DVD et le copier dans C:\ (Dans C:\%user%\Bureau\scripts\deploy\dans notre cas).
Configuration de SYSPREP
Une fois que ceci est fait, il faut installer WAIK (récupérable sur le site de Microsoft), le lancer et ensuite choisir créer un fichier de réponse (à droite), l’utilitaire va vous demander une image afin d’avoir l’arbre XML, il faudra donc choisir le clg correspondant à l’image Wim. Ensuite il n’y a plus qu’à choisir le composant et les paramètres et cliquer droit (en bas à gauche) => ajouter et choisir le pass de destination approprié dans le fichier de réponse. Une fois fait, il faut se rendre à droite choisir les paramètres et entrer les valeurs. Tout ce qui est inutile peut être supprimé.
Lancement de SYSPREP
Le XML est maintenant préparé, il faut maintenant l’ajouter dans le dossier C:\Windows\System32\sysprep\unattend.xml et lancer sysprep après s’être redirigé dans son dossier. Cd \Windows\System32\sysprep Sysprep /generalize /oobe L’option generalize permet de faire une découverte matérielle et changer le Sid (comme une installation windows). L’option oobe permet de faire un premier démarrage comme si l’ordinateur était neuf et que l’on devait choisir la langue, créer les utilisateurs... etc... Le fichier XML n’a pas besoin d’être spécifier vu que sysprep recherche automatiquement lors de son lancement un fichier nommé unattend.xml dans le dossier %windir%\system32\sysprep et %windir%\system32\sysprep\panther. Mais l'on peut aussi le faire en ajoutant /unattend : unattend.xml
unattend.xml : commentaires
<-- Spécifie que c’est un fichier xml -->
<?XML version="1.0" encoding="utf-8"?>
<-- Spécifie quel schéma doit être utilisé (dtd ?) pour la lecture de ce fichier -->
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<-- Cette passe est utilisé pour configurer Windows PE, ainsi que certains aspects de l'installation de Windows -->
<settings pass="windowsPE">
<-- Architecture du composant à changer en fonction de la version de l’OS (32 bits : x86 | 64 bits : amd64) -->
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="x86" publicKeyToken="31bf38XXXXXXXXXX" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<-- spécifie la langue par défaut, locale, et d'autres paramètres internationaux à utiliser pendant l'installation de Windows -->
<SetupUILanguage>
<UILanguage>fr-FR</UILanguage>
</SetupUILanguage>
<InputLocale>040c:0000040c</InputLocale>
<SystemLocale>fr-FR</SystemLocale>
<UILanguage>fr-FR</UILanguage>
<UserLocale>fr-FR</UserLocale>
</component>
<-- contient les paramètres qui permettent de configurez le disque où l’on installe Windows et configurer le système d'exploitation Windows PE -->
<component name="Microsoft-Windows-Setup" processorArchitecture="x86" publicKeyToken="31bf38XXXXXXXXXX" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<-- Spécifie les paramètres d'affichage à appliquer à Windows PE. -->
<Display>
<ColorDepth>32</ColorDepth>
<RefreshRate>75</RefreshRate>
<HorizontalResolution>1280</HorizontalResolution>
<VerticalResolution>1024</VerticalResolution>
</Display>
<-- Indique les données utilisateur, telles que le nom d'utilisateur et la clé de produit à appliquer à l'installation de Windows -->
<UserData>
<ProductKey>
<WillShowUI>OnError</WillShowUI>
<Key>######*Clé d’activation*######</Key>
</ProductKey>
<AcceptEula>true</AcceptEula>
<FullName>Département Info</FullName>
<Organization>IUT de Metz</Organization>
</UserData>
<-- Indique si une connexion réseau est activée -->
<EnableNetwork>true</EnableNetwork>
<-- Indique si vous souhaitez activer le Pare-feu Windows pour Windows PE -->
<EnableFirewall>false</EnableFirewall>
</component>
</settings>
<-- également connu sous le nom d'accueil de Windows. Ce pass peut être utilisé pour pré-configurer les pages d'interface utilisateur pour un utilisateur final -->
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf38XXXXXXXXXX" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<InputLocale>040c:0000040c</InputLocale>
<SystemLocale>fr-FR</SystemLocale>
<UILanguage>fr-FR</UILanguage>
<UserLocale>fr-FR</UserLocale>
</component>
<-- contient des paramètres qui contrôlent la façon dont le shell du système d'exploitation Windows est installé sur un ordinateur de destination -->
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf38XXXXXXXXXX" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<-- auto identification 2 fois avec nom d’utilisateur et mot de passe -->
<AutoLogon>
<Enabled>true</Enabled>
<LogonCount>2</LogonCount>
<Username>administrator</Username>
<Password>
<Value>Placer le HASH du mot de passe (en date de février 2010, le mdp en clair ne fonctionnait pas)</Value>
<PlainText>false</PlainText>
</Password>
</AutoLogon>
<-- exécution d’un script au premier démarrage du système à l’ouverture de session (dans ce cas, script permettant de changer le nom du post via reverse dns) -->
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<Order>1</Order>
<CommandLine>Chemin absolue contenant votre script.</CommandLine>
<Description>changement hostname</Description>
</SynchronousCommand>
</FirstLogonCommands>
<-- spécifie de passer l’installation du wifi, met le réseau en « Domestique », protection du firewall sur « notifier mise à jour » -->
<OOBE>
<HideEULAPage>true</HideEULAPage>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<NetworkLocation>Home</NetworkLocation>
<ProtectYourPC>2</ProtectYourPC>
</OOBE>
<UserAccounts>
<LocalAccounts>
<-- création d’un compte administrateur -->
<LocalAccount wcm:action="add">
<Password>
<Value>Idem que pour autologon, placer le hash du mdp</Value>
<PlainText>false</PlainText>
</Password>
<Description>test</Description>
<DisplayName>test</DisplayName>
<Name>test</Name>
<Group>Users</Group>
</LocalAccount>
</LocalAccounts>
<-- utile à l’activation du compte administrateur -->
<AdministratorPassword>
<Value>Idem que précédent....</Value>
<PlainText>false</PlainText>
</AdministratorPassword>
</UserAccounts>
<RegisteredOrganization>IUT de Metz</RegisteredOrganization>
<RegisteredOwner>Service Info</RegisteredOwner> </component>
</settings>
<-- Ce pass personnalise une installation spécifique de Windows pour un ordinateur spécifique -->
<settings pass="specialize">
<-- permet à un ordinateur de joindre un domaine ou groupe de travail -->
<component name="Microsoft-Windows-UnattendedJoin" processorArchitecture="x86" publicKeyToken="31bf38XXXXXXXXXX" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<-- jonction au groupe de travail -->
<Identification>
<JoinWorkgroup>work</JoinWorkgroup>
</Identification>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf38XXXXXXXXXX" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<-- nom de l’ordinateur : aléatoire -->
<ComputerName>*</ComputerName>
<-- fuseau horaire -->
<TimeZone>W. Europe Standard Time</TimeZone>
</component>
</settings>
<-- chemin où est situé l’image wim -->
<cpi:offlineImage cpi:source="wim:c:/deploy/install.wim#Windows 7 ENTERPRISE" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>
Erreurs pouvant survenir lors de l'exécution de Sysprep
SYSPRP RUNEXTERNALDLLS:NOT RUNNING DLLS; EITHER THE MACHINE IS IN AN INVALID STATE OR WE COULDN'T UPDATE THE RECORDED STATE, DWRET = 31
Cause
Ce message d'erreur est conçu pour empêcher le déploiement d'une image corrompue.
Résolutions
Réinstaller Windows ou recréer une image.
SYSPRP LAUNCHDLL: FAILURE OCCURRED WHILE EXECUTING 'C:\WINDOWS\SYSTEM32\SLC.DLL, SLREARMWINDOWS'
Cause
La remise à zéro du gestionnaire de licences a été exécuté plus de trois fois dans une image Windows Seven unique.
Résolutions
2 solutions (choix) :
- Récréer l’image windows/ réinstaller windows
- Ajouter dans le XML dans la passe « generalize » ce composant :
<settings pass="generalize"> <component name="Microsoft-Windows-Security-Licensing-SLC" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SkipRearm>1</SkipRearm> </component> </settings>
SYSPRP LAUNCHDLL:FAILURE OCCURRED WHILE EXECUTING 'DRMV2CLT.DLL,SYSPREP'
Cause
Le service de partage multimédia de windows media player est lancé.
Résolution
Arrêter le service de partage windows media player : « net stop wmpnetworksvc »
WINDOWS N'A PAS PU TERMINER LA CONFIGURATION DU SYSTEME. POUR TENTER DE REPRENDRE LA CONFIGURATION, REDEMARREZ L'ORDINATEUR.
Symptomes
Après exécution du sysprep, la machine redémarre, et lorsque la phase « le programme d'installation démarre les services » se lance, ce message apparaît.
Cause
Indeterminée
Résolutions
- Ne pas installer de drivers SPTD (alcohol, daemons Tools) sinon :
- HKLM\SYSTEM\CurrentControlSet\services\sptd\Start to 0x00
- Ne pas joindre de domaine
- Restaurer les 2 partitions (100 Mo SYS/part windows)
- Ne pas installer WAIK
- Mettre à jour windows
- Méthode pas très fiable qui empêche les prochains sysprep :
- Quand le message d’erreur apparait, presser SHIFT + F10
- lancer REGEDIT
- hklm\system\setup
- Laisser vide CmdLine
- Mettre CreateNewQueueOnFirstBoot à 0
- Mettre OOBEInProgress à 0
- Mettre SetupPhase à 0
- Mettre SetupShutdownRequired à 0
- Mettre SetupType à 0
- Mettre SystemSetupInProgress à 0
Scripts d'automatisation (par ordre de lancement)
Organigramme
Exécution lancer_sysprep.bat : lancement du processus de redéploiement sysprep, recuperation hostname, intégration domaine
#masque le prompt @echo off #création du dossier contenant les scripts Mkdir C:\deploy #copie des scripts dans le répertoire approprié xcopy /S scripts\* C:\deploy\ #copie le fichier de réponse dans le répertoire sysprep copy unattend.xml C:\Windows\System32\sysprep\ #copie le script de lancement sysprep dans la racine copy lancer_sysprep.bat C:\ #se redirige dans sysprep cd "c:\windows\system32\sysprep" #execution de sysprep sysprep /generalize /oobe /unattend:unattend.xml
Exécution wsname.bat : lancement du script de récupération l'hostname via reverse dns et amorce prochaine exécution au prochain reboot
#attendre 5 secondes C:\deploy\scripts\sleep.exe 5 #lancement du programme wsname.exe permettant de faire le reverse DNS. Possibilité d’ajouter $DNS :IP_DNS si l’on veut utiliser une IP DNS perso C:\deploy\scripts\wsname.exe /N:$DNS:IP #ajout dans la base de registre des chemins à executer au prochain logon regedit /s "C:\deploy\scripts\execution_ps_jointure_domaine.reg # rédemarre le poste au bout de 10 secondes shutdown /r /t 10
Intégration execution_ps_jointure_domaine.reg
Windows Registry Editor Version 5.00 #RunOnce : action à faire dans l’ordre des lignes au prochain démarrage de l’ordinateur [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce] #première action : lancement domain_join.bat "1JoindreDomaine"="C:\\deploy\\scripts\\domain_join.bat" #seconde action : lancement param_finaux.reg "2ParamNtpUserReg"="regedit /s C:\\deploy\\scripts\\param_finaux.reg" #dernière action : lancement vider_dossier.bat "3joindredomaine"="C:\\deploy\\scripts\\vider_dossier.bat"
Exécution domain_join.bat
@echo off #commande permettant l’exécution de script powershell powershell -command Set-ExecutionPolicy Unrestricted #Mise à jour base de registre permettant l’intégration du poste dans un domaine samba regedit /s "C:\deploy\scripts\seven_int_samba.reg" C:\deploy\scripts\sleep.exe 2 #Execution du script d’intégration au domaine powershell C:\deploy\scripts\joindre_domaine.ps1 shutdown -r -t 15
Intégration seven_int_samba.reg
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters] #Mode de compatibilité du domaine "DomainCompatibilityMode"=dword:00000001 #Aucune résolution DNS requise "DNSNameResolutionRequired"=dword:00000000 #A conserver [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters] "RequireStrongKey"=dword:00000001 "RequireSignOrSeal"=dword:00000001
Exécution joindre_domaine.ps1
#Domaine\administrateur permettant de s’intégrer au domaine $credential = New-Object System.Management.Automation.PsCredential("domaine\admin", (ConvertTo-SecureString "admin" -AsPlainText -Force)) #Nom du domaine dans lequel on souhaite s’intégrer Add-Computer -DomainName "DOMAINE.COM" -Credential $credential #Interdiction de lancer des scripts powershell Set-ExecutionPolicy Restricted
Intégration param_finaux.reg
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system] #Vider la case utilisateur à l’écran d’accueil "dontdisplaylastusername"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W32Time\Parameters] #Spécifier serveur ntp pour la synchronisation de l’horloge windows "NtpServer"="ntp,0x1"
Exécution vider_dossier.bat
#Crée le dossier allant contenir les scripts pour un futur sysprep sur le compte administrateur mkdir "C:\Users\Administrateur\Desktop\scripts\" #Copie les scripts nécessaire à un futur sysprep xcopy /S "C:\deploy\*" "C:\Users\Administrateur\Desktop\scripts\" copy "C:\Windows\System32\sysprep\unattend.xml" "C:\Users\Administrateur\Desktop\" copy "C:\lancer_sysprep.bat" "C:\Users\Administrateur\Desktop\" #Suppression du dossier contenant les scripts qui ont été ajoutés et le fichier de réponse del /Q "C:\Windows\System32\sysprep\unattend.xml" del /Q "C:\lancer_sysprep.bat" rd /S /Q C:\deploy\ #Extinction de la machine 10 secondes après shutdown -s -t 10
31bf38XXXXXXXXXX
14 mars 2013
L’intérêt d’utiliser « joindre_domaine.ps1 » pour intégrer la machine est qu’il fallait que le poste soit paramétré, ou du moins, le nom de la machine. Chose qui n’était pas faite après déploiement de l’image et qui est faite via wsname.bat.
22 mai 2013
Merci pour ce poste, il y a plein d’informations utiles, je ferais un retour plus détaillé une fois testé 🙂
14 avril 2014
Il faut plutôt utiliser « Microsoft-Windows-Security-SPP » au lieu de « Microsoft-Windows-Security-Licensing-SLC » pour la remise à zéro du gestionnaire de licence. Cette dernière étant obsolète
Ce qui donne par exemple :
1
Bon article 😉