Quantcast
Viewing all articles
Browse latest Browse all 257

CustPE : Comment utiliser un bootstrap générique ?

I. Présentation

Cet exemple est issu d’un retour d’expérience qui m’a conduit à implémenter une petite adaptation particulière,  plutôt inédite. En effet, bien que probablement marginale, j’ai pensé que ce serait un bon cas d’étude et de réflexion, voire d’inspiration pour vos propres adaptations Image may be NSFW.
Clik here to view.
:-)
.

L’idée consiste à banaliser le fichier de configuration “bootstrap.ini” et le modifier “à la volée”. Cette approche n’est peut être pas la meilleure, mais cela répondait au cahier des charges… De plus, je pense que cette étude permet d’appréhender le MDT sous un angle différent, histoire d’explorer de nouveaux sentiers pédagogiques Image may be NSFW.
Clik here to view.
:-)

Pour rappel, la fabrication des clients, “Update Deployment Share“, est pilotée par un script Powershell qui effectue l’assemblage selon les réglages définis dans l’onglet “Windows PE” ainsi qu’aux directives contenues au sein des fichiers “LiteTouchPE_x64|x86.xml“.

En consultant ces derniers, vous constaterez que le fichier “Bootstrap.ini” est copié dans le ramdrive du noyau WinPE soit “X:\Deploy\Scripts\“. C’est principalement ce fichier qui détermine la relation du client LiteTouch avec la ressource partagée MDT.

Image may be NSFW.
Clik here to view.
WPE02-img03

Traitement du fichier “Bootstrap.ini”

Cette information peut s’avérer bien pratique à connaitre, dès lors que vous utilisez des points de déploiements multiples. En effet, imaginons que vous disposez de plusieurs sites, avec un serveur MDT sur chaque, vous devez admettre que les noms et adresse IP de la ressource partagée seront nécessairement différents. Le MDT propose bien une notion de “points de déploiement liés” (“Linked Deployment Shares“) mais cela implique une action de régénération et de mise à jour des clients LiteTouch sur chaque site.

Bien que cela soit prévu dans la console MDT, on peut aussi considérer un autre mécanisme de réplication et ne pas vouloir utiliser cette relation entre points de déploiement. On peut alors imaginer de réaliser un “client LiteTouch commun” en modifiant le fichier “bootstrap.ini” à la volée.

II. Mise en œuvre

On considère que le dernier octet de l’adresse IP des serveurs MDT est identique d’un site à l’autre, et que le nom de la ressource partagée est identique (ie . “\\w.x.y.201\DeploymentShare$“). Le script aura donc la charge d’identifier le réseau du client, et recomposer le chemin UNC du serveur MDT. (Pour simplifier, la classe d’adressage IP est /24 soit un masque 255.255.255.0)

Je précise qu’il s’agit d’un exemple arbitraire et je vous laisse le soin de l’adapter en fonction de votre plan d’adressage IP, du partage de déploiement et autres identifiants propres à votre environnement de test.

 

A. Montage du noyau WinPE

Montez l’image d’un noyau LiteTouchPE-x…wim en procédant comme suit :

mkdir c:\Mount
dism /Mount-Wim /WimFile:c:\DeploymentShare\Boot\LiteTouchPE_x86.wim /index:1 /MountDir:C:\Mount

 

B. Modification du fichier Bootstrap.ini

Modifiez le fichier “[MountWIM]\Deploy\Scripts\Bootstrap.ini” via le bloc-notes, afin de remplacer le chemin UNC de la ressource partagée MDT par une chaîne spécifique “DeployRoot=@DEPLOYSRV@

Notepad C:\Mount\Deploy\Scripts\bootstrap.ini

Exemple de contenu d’un bootstrap.ini générique

[Settings]
Priority=Default

[Default]
DeployRoot=@UNC@
SkipBDDWelcome=YES
UserID=MDT-Depl
UserDomain=@SRV@
UserPassword=Pa$$w0rd
KeyboardLocalePE=040c:0000040c

 

Note : Si vous disposez d’un compte de domaine Active Directory, entrez le nom Netbios du domaine au niveau de la variable “UserDomain“.

Renseignez vos propres informations, puis enregistrez le fichier modifié et fermez le bloc-notes.

Image may be NSFW.
Clik here to view.
WPE02-img04

Mise à jour du fichier bootstrap.ini

 

 

C.  Ajouter un script personnalisé

Créez un nouveau script “UpdBootStrap.vbs” dans le dossier “[MountWIM]\Deploy\Scripts

Notepad C:\Mount\Deploy\Scripts\UpdBootStrap.vbs

Image may be NSFW.
Clik here to view.
WPE02-img05

Création du nouveau script “updBootstrap.vbs”

Recopiez le contenu ci-après dans ce nouveau fichier

Contenu du UpdBootStrap.vbs

Function UpdateFile (sFile,sBefore,sAfter)

Const ForReading = 1
Const ForWriting = 2

Set oFSO = CreateObject("Scripting.FileSystemObject")
' Get-content
Set oFile = oFSO.OpenTextFile(sFile, ForReading)
sText = oFile.ReadAll
oFile.Close
     
sNewText = Replace(sText, sBefore, sAfter)

' Set-content
Set oFile = oFSO.OpenTextFile(sFile, ForWriting)
oFile.WriteLine sNewText
oFile.Close

End Function

Function CutIP (sIP,iOct)
  iFirstDot = InStr(1,sIP,".")
  iSecondDot = Instr(iFirstDot+1,sIP,".")
  iThirdDot = Instr(iSecondDot+1,sIP,".")

  iFirstOctet = Left(sIP, iFirstDot-1)
  iSecondOctet = Mid(sIP, iFirstDot+1, iSecondDot-iFirstDot-1)
  iThirdOctet = Mid(sIP, iSecondDot+1, iThirdDot-iSecondDot-1)
  iFourthOctet = Mid(sIP,iThirdDot+1, Len(sIP)-iThirdDot)

  Select Case iOct 
    Case 1 : CutIP = iFirstOctet
    Case 2 : CutIP = iSecondOctet
    Case 3 : CutIP = iThirdOctet
    Case 4 : CutIP = iFourthOctet
    Case Else : CutIP = "Indiquez un chiffre entre 1 et 4"
  End Select
End Function

'--------------------------
' Main script
'--------------------------
Const sFileName = "X:\Deploy\Scripts\Bootstrap.ini"
Const sOctSrv =  ".201"         ' dernier octet de l'adresse IP du serveur 
Const sDeployShare="\DeploymentShare$"  ' nom du partage MDT

' identification du réseau IP
Set oWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set IPConfigSet = oWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
For Each IPConfig in IPConfigSet
    If Not IsNull(IPConfig.IPAddress) Then 
        sCurrentIP = IPConfig.IPAddress(0)         
         ' Recomposition du chemin UNC vers la ressource MDT ...
        sSrvName = CutIP(sCurrentIP,1) & "." & CutIP(sCurrentIP,2) & _
                    "." & CutIP(sCurrentIP,3) & sOctSrv 
        sDeplUNC =  "\\" & sSrvName & sDeployShare
    Else
        sDeplUNC = "\\?.?.?.?" & sDeployShare  
    End If
Next

Confirm = InputBox ("Veuillez confirmer l'emplacement du point de déploiement" & _
 vbCrLf & "ou cliquez sur annuler pour redémarrer.","Confirmation",sDeplUNC) 
If Confirm <> "" Then
  sKeyword = "@UNC@"    ' le chemin UNC (chaine à remplacer)
  UpdateFile sFileName,sKeyword,sDeplUNC
  sKeyword = "@SRV@"    ' le nom du serveur (chaine à remplacer)
  UpdateFile sFileName,sKeyword,sSrvName

  WScript.Echo "Mise à jour " & sFileName & " " & sKeyword & " " & sSrvName
Else
  Set oShell = CreateObject("Wscript.Shell")
  oShell.Run "wpeutil reboot"
End If

Enregistrez ce contenu et fermez le bloc-notes.

Image may be NSFW.
Clik here to view.
WPE02-img06

Enregistrement du script “updBootstrap.vbs”

D. Modification du fichier winpeshl.ini

Modifiez le fichier “[MountWIM]\Windows\System32\winpeshl.ini

Notepad C:\Mount\Windows\System32\winpeshl.ini

Contenu du fichier “winpeshl.ini” :

[LaunchApps]
%SYSTEMROOT%\System32\wpeutil.exe,InitializeNetwork
%SYSTEMROOT%\System32\wpeutil.exe,SetKeyboardLayout 040C:0000040C
%SYSTEMROOT%\System32\wscript.exe,X:\Deploy\Scripts\UpdBootStrap.vbs
%SYSTEMROOT%\System32\bddrun.exe,/bootstrap

Enregistrez le contenu modifié et fermez le bloc-notes.

Image may be NSFW.
Clik here to view.
WPE02-img07

Modification du fichier “winpeshl.ini”

 

Compléments d’information :

Pour votre gouverne, voici quelques éléments qui m’ont cette modification particulière de ce fichier d’initialisation “winpeshl.ini” .

En fait, ce fichier existe déjà sur un client LiteTouch et a pour charge d’initialiser l’environnement WinPE via le programme spécifique “BDDRun.exe“. L’enchaînement de l’initialisation des couches réseaux est une difficulté majeure de cette démonstration, du fait que nous effectuons une modification du fichier “bootstrap.ini” en même temps. L’idée est donc d’ajouter l’exécution du script “UpdBootStrap.vbs“, avant le lancement de “BDDRun.exe,/Bootstrap“.

Si le script a besoin du réseau, il ne faut pas lancer wpeinit, car il va interpréter le fichier “unattend.xml” dans la foulée et lancer les commandes qu’il contient.

Dans ce cas, je pense que la modification la plus logique est de :

  • soit ajouter la commande “wpeutil InitializeNetwork” au début du fichier “\Windows\System32\winpeshl.ini
  • soit supprimer toutes les directives “RunSynchronous” du fichier “\unattend.xml” et les transposer intégralement dans le fichier winpeshl.ini

Je me permets d’ajouter quelques précisions sur l’outil “BDDRun.exe”, dont le fonctionnement, je l’avoue, reste à mon avis encore bien obscur. Issues de mon expérience, je vous demanderait donc de ne pas prendre ces informations comme des affirmations et de les considérer avec précaution  :

  • Modifié depuis MDT2010
  • Pas ou très peu documenté. BDDRun.exe est un lanceur de commandes, qui ne semble supporter que 2 options
    • /Bootstrap
    • /BootstrapNoSF8
  • Exécute implicitement “wpeinit” lorsque l’un de ces commutateurs précité est stipulé.
  • Reste chargé en mémoire, typiquement pour l’exploitation des variables MDT et la surveillance de l’appui sur [F8]
  • Sollicité par les scripts MDT (pour exécuter des programmes avec un minimum d’affichage visible, sauf .bat et .cmd.), comme par exemple :
    • Bddrun startnet.cmd
    • Bddrun wscript.exe, X:\deploy\scripts\LiteTouch.wsf
  • Dans un contexte Windows (hors WinPE), les programmes sont exécutés avec le niveau de privilèges élevés (hors UAC).
  • BDDRun garantit également que le dossier de travail est correctement positionné pour les processus lancés. Par exemple, il agit ainsi sur le contexte d’exécution des scripts utilisant des objets WScript.Shell ou les installations de packages .MSI, afin de minimiser les risques d’erreurs.

 

Pour cette démonstration, j’ai ajouté 2 lignes préliminaires , faisant appel à l’outil spécifique WinPE “wpeutil.exe”  afin de :

  • Initialiser la couche réseau sans passer par BBDRUN, ni WPEINIT
  • Passer le clavier en AZERTY du fait que le fichier “bootstrap.ini” n’est pas encore traité lors de l’ouverture de la boite de dialogue, sinon le clavier reste en QWERTY par défaut.

 

E. Démontage du noyau WinPE

Démontez l’image du noyau WinPE modifié en enregistrant les modifications, via la commande suivante :

dism /Unmount-Wim /MountDir:C:\Mount /commit

Voilà, la modification est terminée et il ne vous reste plus qu’a injecter ce noyau  au sein d’un structure amorçable telle qu’une clé USB, un CDROM ou bien encore un serveur WDS.

Voici un exemple de ce que vous pourriez obtenir lors du démarrage de ce client LTI.

Boite de dialogue du script “UpdBootStrap.vbs” permettant de saisir et/ou valider le chemin d’accès au partage MDT.

Image may be NSFW.
Clik here to view.
WPE02-img07b

Boite de dialogue du script “UpdBootStrap.vbs”

Message du script indiquant la modification effectuée :

Image may be NSFW.
Clik here to view.
WPE02-img07c

Message du script indiquant la modification effectuée

 

La suite du scénario, lancement de l’assistant “wizard.hta” dépend bien sur de la configuration de votre MDT … Image may be NSFW.
Clik here to view.
😉

Bonne continuation

Christophe M.


Viewing all articles
Browse latest Browse all 257