Anthonix.fr – High Tech/Informatique : Tutoriels & actualité, insolite, geek !
28Déc/1017

[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

Posted by antho