MDT / WDS - Déploiement de Windows
- WDS
- Extraire les pilotes de VMware Tools
- Convertir un fichier ESD en WIM
- MDT : Microsoft Deployment Toolkit
- Créer une image de référence 21H2
- Impossible de trouver le fichier script "C:\LTIbootstrap.vbs".
- Déployer une image de référence avec MDT et WDS
- MDT / WDS avec base de données SQL
- Modifier le registre d'une image Windows
- Exemple : MDT avec SQL
- Erreur "Verify BCDBootEx" avec MDT
WDS
Installation du rôle WDS
On commence par ajouter le rôle WDS.
Configuration du rôle WDS
On ouvre la console "Services de déploiement Windows".
On clique droit sur le nom du serveur et sélectionne Configurer le serveur.
On clique sur Suivant.
On sélectionne le mode Intégré à Active Directory.
On choisit un répertoire sur une autre partition.
On autorise tous les ordinateurs. La meilleure pratique serait d'accepter les ordinateurs connus uniquement (les ordinateurs auront été ajoutés au préalable dans l'Active Directory, via un CSV contenant les informations des ordinateurs/adresses MAC).
On récupère ensuite le fichier boot.wim dans le dossier "sources" d'une image Windows.
On l'ajoute dans "Images de démarrage".
On laisse tout par défaut.
Si on démarrage un ordinateur sur le réseau :
Aucune image n'est disponible.
Déploiement simple d'une image
On clique droit sur "Images d'installation" puis "Ajouter un groupe d'images". On le nomme "Windows 10".
On ajoute une image.
Si le fichier install.wim n'est pas présent mais install.wsd l'est, on peut extraire le fichier wim spécifique à la version que l'on souhaite installer. Voir Convertir un fichier ESD en WIM
Dans mon cas, le temps est long pour télécharger l'image de boot. Il faut changer l'interface réseau pour vmxnet 3.
Cependant, cela engendre l'impossibilité d'obtenir une adresse IP via DHCP. On va donc ajouter le pilote pour la nouvelle carte réseau.
Ajout d'un pilote pour le déploiement
On ajoute un filtre. Ici, le fabricant est VMware (machine virtuelle VMware).
On peut ensuite ajouter un filtre selon l'image. Ensuite :
On clique droit sur "Pilotes" et on ajoute un package de pilotes.
Au préalable, j'ai extrait les pilotes de VMware. Voir : https://docs.khroners.fr/books/windows-server-2019/page/extraire-les-pilotes-de-vmware-tools
On choisit le chemin suivant dans mon cas : C:\VMwareDrivers\VMware\VMware Tools\VMware\Drivers\vmxnet3\Win8\vmxnet3.inf
On l'ajoute au groupe de pilotes précédemment créé.
Dans notre cas, il faut l'ajouter dès l'étape de Windows PE.
Mise à disposition de pilotes pour le démarrage
On clique sur "Rechercher des packages".
Le pilote est ajouté.
Le PC démarre bien, avec le bon pilote. Cependant, WDS reste limité pour la customisation de l'image. On verra MDT dans un prochain chapitre.
Extraire les pilotes de VMware Tools
On crée un dossier pour les pilotes, dans mon cas C:\VMwareDrivers.
On télécharge l'iso sur https://packages.vmware.com/tools/esx/index.html
On le monte, puis dans un invité de commandes :
E:
setup.exe /A /P C:\VMWareDrivers
On choisit le chemin du dossier précédemment créé.
Les pilotes sont maintenant dans C:\VMWareDrivers\VMware\VMware Tools\VMware\Drivers.
Convertir un fichier ESD en WIM
On récupère les informations du fichier ESD, via un invité de commandes en Powershell. (E est le lecteur où l'ISO se trouve)
dism /Get-WimInfo /WimFile:E:/sources/install.esd
On souhaite récupérer la version professionnelle de Windows 10, donc la 6ème.
On se rend dans le dossier /sources/ où install.esd est.
cd E:\sources\
dism /export-image /SourceImageFile:install.esd /SourceIndex:6 /DestinationImageFile:C:\Users\Administrateur.LAB\Desktop\install.wim /Compress:max /CheckIntegrity
MDT : Microsoft Deployment Toolkit
Présentation
MDT pour Microsoft Deployment Toolkit est un outil pour préparer le déploiement de machines Windows. Il permet d'installer des logiciels, des pilotes, gérer les paramètres de l'ordinateur... le tout durant ou après l'installation par le réseau via le service WDS.
Installation
Prérequis
On télécharge et installe ADK et WinPE.
https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install
On exécute le setup en Admin, en laissant tout par défaut.
Installation de MDT
On va ensuite pouvoir télécharger et installer MDT.
https://www.microsoft.com/en-us/download/details.aspx?id=54259
Une fois installé, on télécharge la mise à jour.
On exécute le .exe, et on copie les fichiers extraits dans %ProgramFiles%\Microsoft Deployment Toolkit\Templates\Distribution\Tools.
Création du partage de déploiement
On crée un nouveau dossier sur la partition du WDS, nommé DeploymentShare.
On ouvre ensuite la console Deployment Workbench et on crée notre partage.
On laisse tout par défaut, on peut modifier les options plus tard.
Ajout du système d'exploitation
On crée un nouveau dossier nommé "Windows 10 Pro 20H2".
On monte le fichier .wim extrait auparavant.
On le renomme.
Création d'un dossier de packages
On crée un dossier dans "Packages" pour les mises à jour.
On crée ensuite un profil de sélection.
Création de la séquence de tâches
On crée ensuite une tâche.
On entre un mot de passe administrateur local.
Ajouter des applications
On clique droit sur Applications puis on ajoute.
On choisit la première option, on choisit le chemin du dossier contenant le setup, la ligne de commande
msiexec /I googlechromestandaloneenterprise64.msi /qn
Edition de la séquence de tâches
On a donc mis ici le profil de sélection pour les packages.
On active ces deux tâches.
On clique sur "Install Applications" et on coche la deuxième option, en renseignant l'application.
On peut ensuite copier coller pour ajouter autant d'applications que l'on veut (on les renomme).
En laissant par défaut, le choix des applications se fait durant l'installation (cases à cocher).
Sécurisation du partage pour le déploiement
Créer un compte de service pour MDT dans l'Active Directory
On lui attribue un mot de passe fort.
Permissions et partage
On lui donne la permission d'ajouter un ordinateur au domaine.
Sur le partage, on désactive l'héritage en convertissant les autorisations héritées.
Ajouter un pilote dès le démarrage PXE
On créer les dossiers.
Ici, VMware, Inc. correspond au manufacturer (requête WMI, %Make%) et VMware7,1 au modèle (requête WMI, %Model%).
On clique droit sur "Network" (nom défini selon le pilote, ici on ajoute un pilote réseau) et on importe.
On crée un profil de sélection. (nommé WinPE x64)
Ensuite, clic droit sur le partage de déploiement, propriétés, puis on vérifie :
Ajouter les pilotes VMware Tools
Il suffit de créer une application comme pour 7zip ou Chrome. Il faut créer un dossier VMware Tools, y copier le contenu de l'iso à l'intérieur, puis créer l'application et choisir le dossier en source.
Pour la ligne de commandes :
setup64.exe /S /v /qn REBOOT=R
On rajoute une tâche après l'installation de VMware Tools : Restart Computer.
Ajouter d'autres pilotes
Pour installer d'autres pilotes, il est recommandé de créer des sous dossiers dans Windows 10 x64.
On crée d'abord un dossier pour la marque, et ensuite le modèle.
On ajoute ensuite un tâche qui va affecter une valeur à une variable. Cette valeur est "DriverGroup001".
%Make% correspond au manufacturer (marque, comme Dell, HP, VMware, Lenovo, etc...
%Model% correspond au modèle.
On définit le profil de sélection pour "Nothing" dans Inject Drivers.
Exemple pour chaque fichier .ini
Bootstrap.ini :
[Settings]
Priority=Default
[Default]
DeployRoot=\\SRV-WDS01\DeploymentShare$
UserDomain=lab.khroners.fr
UserID=mdt_admin
UserPassword=mdt_admin-password
SkipBDDWelcome=YES
Customsettings.ini :
[Settings]
Priority=Init, Model, Default, SetOSD
Properties=OSDPrefix, ComputerSerialNumber, TargetGroup
[Init]
ComputerSerialNumber=#Right(Replace(Replace(oEnvironment.Item("SerialNumber")," ",""),"-",""),6)#
[Default]
OSInstall=Y
;Computer Details
SkipComputerName=YES
SkipDomainMembership=YES
JoinDomain=lab.khroners.fr
DomainAdmin=mdt_admin
DomainAdminDomain=lab.khroners.fr
DomainAdminPassword=mdt_admin-password
MachineObjectOU=OU=Workstations,OU=Computers,OU=LAB,DC=lab,DC=khroners,DC=fr
;Skip Task Sequence
SkipTaskSequence=YES
TaskSequenceID=W10-20H2-X64
;User Data
SkipUserData=YES
;Computer Backup
SkipComputerBackup=YES
;Product Key
SkipProductKey=YES
;Language Packs
SkipPackageDisplay=YES
;Locale and Time
SkipLocaleSelection=YES
SkipTimeZone=YES
KeyboardLocale=040c:0000040c
KeyboardLocalePE=040c:0000040c
UserLocale=fr-FR
UILanguage=fr-FR
TimeZoneName=Romance Standard Time
;Roles and Features
SkipRoles=YES
;Applications
SkipApplications=NO
;Administrator Password
SkipAdminPassword=YES
AdminPassword=local-admin-password
;Local Administrators
SkipAdminAccounts=YES
;Capture Image
SkipCapture=YES
;Bitlocker
SkipBitLocker=YES
;Ready to begin
SkipSummary=YES
;Operating system deployment completed successfully
SkipFinalSummary=YES
FinishAction=SHUTDOWN
WSUSServer=https://srv-wsus01.lab.khroners.fr:8531
SLShare=\\SRV-WDS01\DeploymentShare$\Logs
EventService=http://SRV-WDS01:9800
OSDComputerName=%OSDPrefix%-%ComputerSerialNumber%
[VMware7,1]
OSDPrefix=VM
Déploiement MDT avec WSUS SSL
Suite à mon guide pour le WSUS en SSL, il faut avoir le certificat sur le poste pour rechercher des mises à jour. Pour cela, on le fait habituellement en GPO. Cependant, ces stratégies ne sont pas appliquées durant le déploiement. On va donc les importer.
Pour cela, il faut créer un dossier sur le serveur MDT (pas dans le partage), avec le certificat (en .cer) et un fichier de commandes .cmd. Je vais créer ce dossier dans W:\Logiciels\.
Le contenu du fichier Import-Certificates :
certutil -addstore -f "Root" "cert.cer"
certutil -addstore -f "TrustedPublisher" "cert.cer"
On ajoute ensuite ce dossier en créant une application comme pour Google Chrome & 7Zip. En source, on choisit le dossier.
Pour la commande, on rentre le nom du fichier, c'est à dire : Import-Certificates.cmd
On ajoute ensuite une tâche dans la Task Sequence. (Pour cela, je copie colle "Chrome" par exemple, et on modifie le nom et l'application à installer)
Faites en sorte de l'installer avant la tâche Windows Update. Dans mon cas, après VMware Tools.
On modifie également la ligne dans le fichier customsettings.ini pour ajouter le https et le port.
Attention : Il faut mettre le FQDN.
Ciblage côté client pour WSUS
Pour activer le ciblage pour le WSUS, on rajoute une tâche.
Activation du monitoring (supervision)
Dans les propriétés du partage du déploiement, on active le monitoring dans l'onglet "monitoring".
En se rendant sur cette URL, on devrait arriver sur la page.
http//localhost:9800/MDTMonitorEvent/
On ajoute ensuite dans le fichier customsettings.ini la ligne :
EventService=http://SRV-WDS01:9800
Génération de l'image
On clique droit sur le partage de déploiement et "Update..."
Ajout de l'image dans WDS
On ajoute l'image LiteTouchPE_x64.wim situé sur le partage dans le dossier boot dans Images de démarrage.
Dans les propriétés, on rajoute l'image.
On clique droit sur le serveur, toutes les tâches puis redémarrer.
Tests
On pourra automatiser le choix de la séquence de tâches en ajoutant SkipTaskSequence=YES et TaskSequenceId=l'ID_de_notre_sequence_de_taches (dans mon cas, W10-20H2-X64).
Une fois l'installation faite :
Les applications rajoutées précédemment s'installent.
Déploiement inter-sites
Il est possible de répliquer un MDT sur différents sites.
Pour cela, il sera nécessaire de procéder à une réplication DFS ainsi que de modifier le fichier ini (customsettings).
Créer une image de référence 21H2
Création du déploiement
- Ouvrez la console DeploymentWorkbench dans le menu Démarrer.
- Cliquez avec le bouton droit de la souris sur "Deployment Shares".
- Sélectionnez "New Deployment Share".
- Saisissez le chemin d'accès au partage de déploiement : M:\DeploymentShare
- Entrez le nom du partage : DeploymentShare$.
- Donnez une description au partage.
- Dans l'écran "Options", acceptez les valeurs par défaut car vous pourrez les modifier ultérieurement.
- Complétez l'assistant pour créer le partage.
- Par défaut, les autorisations de partage sont définies sur le groupe des administrateurs locaux. Nous reviendrons sur ce point plus tard.
Ajout d'un système d'exploitation
- Montez l'ISO Windows 10 21H2 dans l'Explorateur de fichiers.
- Allez dans "Deployment Workbench" > "Operating Systems".
- Faites un clic droit et sélectionnez "New Folder".
- Entrez le nom "Windows 10 21H2" et créez le dossier.
- Cliquez à nouveau avec le bouton droit de la souris et sélectionnez Importation du système d'exploitation.
- Dans l'assistant, sélectionnez Ensemble complet de fichiers source, puis entrez la racine de l'ISO monté comme répertoire source.
- Pour le nom du répertoire de destination, entrez Windows 10 21H2 et terminez l'assistant.
- Allez dans le nœud Systèmes d'exploitation/Windows 10 21H2 et renommez les nouvelles entrées ajoutées à Windows 10 21H2 Edition pour faciliter l'utilisation.
Création d'un dossier de paquets pour les futures mises à jour
- Allez dans "Deployment Workbench" > "Packages".
- Créez un dossier nommé "Windows 10 21H2".
- Nous allons maintenant créer un profil de sélection afin que la séquence de tâches tente uniquement d'installer les mises à jour de Windows 10 21H2 que nous rendons disponibles via MDT.
Création d'un profil de sélection
- Développez le nœud "Advanced Configuration".
- Cliquez avec le bouton droit sur "Selection Profile" et sélectionnez "New Selection Profile".
- Nommez-le "Windows 10 21H2".
- Sur la page "Folders", cochez le dossier "Windows 10 21H2" sous "Packages" et terminez l'assistant.
Importation d'applications
Si vous souhaitez ajouter des applications à votre image de référence, je vais expliquer comment ajouter VLC comme exemple d'application.
- Allez dans "Deployment Workbench" > "Deployment Share" > "Applications".
- Cliquez avec le bouton droit sur "Applications" et sélectionnez "New Application".
- Dans l'assistant, choisissez "Application with source files".
- Donnez à l'application le nom de : VLC.
- Entrez le répertoire source des fichiers d'installation.
- Saisissez le répertoire de destination : VLC.
- Pour la ligne de commande, entrez n'importe quoi, nous y reviendrons plus tard.
- Sur la page de résumé, cliquez sur Next et après la copie des fichiers, cliquez sur Finish pour terminer l'assistant.
Configuration des applications
- Cliquez avec le bouton droit sur "VLC", puis "Détails".
- Saisissez la commande d'installation silencieuse suivante : vlc-setup.exe /S
VLC est maintenant configuré pour être installé silencieusement par la séquence de tâches.
Pour ajouter d'autres logiciels, vous devrez répéter les étapes ci-dessus, avec la ligne de commande appropriée pour les installer silencieusement. Vous trouverez ci-dessous quelques lignes de commande pour certains logiciels :
Google Chrome - Enterprise Installer
msiexec /I googlechromestandaloneenterprise64.msi /qn
Adobe Reader - Enterprise Installer
AdobeReaderDC.exe /sAll
Nous devons maintenant créer une nouvelle séquence de tâches pour créer une image de référence.
Création d'une séquence de tâches
- Dans "Deployment Workbench", allez dans "Task Sequences".
- Cliquez avec le bouton droit et sélectionnez "New Task Sequence".
- Pour l'ID, entrez : "W10-21H2".
- Nommez-la "Build Windows 10 21H2".
- Sélectionnez "Standard Client Task Sequence".
- Sélectionnez le système d'exploitation "Windows 10 21H2".
- Sélectionnez "Do not specify a product key at this time".
- Entrez un nom d'organisation.
- Sélectionnez "Do not specify an Administrator password at this time".
- Terminez l'assistant.
Nous allons maintenant configurer la séquence de tâches.
Configuration de la séquence de tâches
- Cliquez avec le bouton droit sur la séquence de tâches qui vient d'être créée et sélectionnez "Properties".
- Allez dans l'onglet "Task Sequence".
- Développez le dossier "Preinstall" et sélectionnez l'élément "Apply Patches".
- Changez le profil de sélection pour "Windows 10 21H2".
- Allez dans le dossier "State Restore" et sélectionnez "Windows Update (Pre-Application Installation)".
- Dans la partie droite de la fenêtre, allez dans l'onglet "Options".
- Décochez la case "Disable this step" et faites de même avec "Windows Update (Post-Application Installation)".
- Si vous avez sauté la section "Importer des applications", désactivez l'élément "Install Applications" et passez à l'étape suivante.
- Allez à l'élément "Install Applications".
- Dans la partie droite, sélectionnez l'option "Install a single application" et cliquez sur le bouton "Browse...".
- Sélectionnez "Google Chrome" et changez le nom "Install Applications" en "Google Chrome".
- Pour installer d'autres applications, copiez et collez l'élément "Install Applications" et répétez les étapes 10 et 11 pour les applications de votre choix.
- Cliquez sur "Apply" et fermez la séquence de tâches.
Ensuite, nous allons créer un compte d'utilisateur de domaine pour MDT afin de l'utiliser comme compte de service.
Création d'un compte de service pour MDT dans Active Directory
- Allez dans la console "Utilisateurs et ordinateurs Active Directory".
- Créez un utilisateur appelé "CDS_MDT" et donnez-lui un mot de passe complexe.
- Donnez à l'utilisateur "CDS_MDT" des permissions de contrôle total sur le partage et des permissions de contrôle total sur tous les fichiers et dossiers du partage de déploiement.
Ensuite, nous devons configurer les fichiers Bootstrap.ini et CustomSettings.ini pour définir les options de l'environnement de déploiement. Les paramètres ci-dessous permettent d'activer la connexion automatique et d'ignorer des étapes. Ils ne doivent donc être utilisés que dans des environnements de test/laboratoire.
Configuration de Bootstrap.ini
- Dans la console "Deployment Workbench", cliquez droit sur le partage de déploiement et sélectionnez "Propriétés".
- Sélectionnez l'onglet "Rules" et cliquez sur le bouton "Edit Bootstrap.ini".
- Ajoutez les paramètres ci-dessous au fichier Bootstrap.ini.
- Fermez et enregistrez le fichier Bootstrap.ini.
[Settings]
Priority=Default
[Default]
DeployRoot=\\SERVER-NAME\DeploymentShare$
UserDomain=domaine.fr
UserID=CDS_MDT
UserPassword=motdepasse
SkipBDDWelcome=YES
Configuration de CustomSettings.ini
Dans l'onglet "Rules" de la fenêtre des propriétés du Deployment Share, ajoutez les paramètres ci-dessous.
[Settings]
Priority=Default
; Si vous n'utilisez pas de serveur WSUS pour les mises à jour, supprimez ou mettez en commentaire la ligne ci-dessous et decommentez l'autre.
Properties=TargetGroup
; Properties=MyCustomProperty
[Default]
TargetGroup=MDT
OSInstall=Y
SkipCapture=YES
SkipAdminPassword=YES
SkipProductKey=YES
SkipComputerBackup=YES
SkipBitLocker=YES
SkipLocaleSelection=YES
SkipTimeZone=YES
SkipDomainMembership=YES
SkipSummary=YES
SkipFinalSummary=YES
SkipComputerName=YES
SkipUserData=YES
_SMSTSORGNAME=Partage de reference
_SMSTSPackageName=%TaskSequenceName%
DoCapture=YES
ComputerBackupLocation=\\SERVER-NAME\DeploymentShare$\Captures
BackupFile=%TaskSequenceID%_#year(date) & "-" & month(date) & "-" & day(date) & "-" & hour(time) & "-" & minute(time)#.wim
; Si vous voulez utiliser un serveur WSUS pour les mises à jour, utilisez cette ligne, supprimez ou mettez en commentaire les mises à jour provenant d'Internet.
WSUSServer=http://WSUS-SERVER:8530
FinishAction=SHUTDOWN
SLShare=\\SERVER-NAME\DeploymentShare$\Logs
EventService=http://SERVER-NAME:9800
Nous devons maintenant créer le support de démarrage pour démarrer la VM dans l'environnement de déploiement.
Création du support de démarrage
- Dans la console "Deployment Workbench", cliquez avec le bouton droit sur le partage de déploiement.
- Sélectionnez "Update Deployment Share".
- Sélectionnez "Completely regenerate the boot images".
- Suivez l'assistant. La création des images de démarrage prendra un certain temps.
Test et capture d'une image de référence
Pour tout tester, nous avons deux choix :
- Copier le fichier ISO que nous venons de générer et l'insérer dans le lecteur CD/DVD de notre VM,
- Se rendre dans la console "Services de déploiement Windows" et ajouter l'image dans "Images de démarrage" au format WIM.
Dans les deux cas, l'image à utiliser se nomme "LiteTouchPE_x64" "et se trouve ici : M:\DeploymentShare\Boot
Créez une nouvelle VM avec la configuration suivante :
- Au moins 2x vCPUs,
- Au moins 4GB de RAM,
- Adaptateur réseau avec accès au même réseau que le serveur MDT/WDS/WSUS,
- Disque dur virtuel d'au moins 40 Go, de préférence sur un support rapide,
- Démarrez à partir du CD en utilisant le fichier LiteTouchPE_x64.iso de MDT ou à partir du réseau (boot PXE).
Si vous utilisez Hyper-V, veillez à ce que l'option "Utiliser les points de contrôle automatiques" est désactivée et que la VM est une génération 1.
Si vous utilisez VMware, veillez à utiliser l'option de démarrage BIOS et non UEFI.
Démarrez la VM et elle démarrera à partir du fichier LiteTouchPE_x64 dans l'environnement de déploiement. Vous verrez apparaître un écran portant le nom de la séquence de tâches que vous avez créée précédemment. Sélectionnez votre séquence de tâches et cliquez sur "Suivant" et la séquence de tâches commencera. La séquence de tâches installera Windows 10 21H2, effectuera la mise à jour à partir du serveur Internet/WSUS, installera les applications optionnelles si vous les avez ajoutées, puis exécutera à nouveau la mise à jour de Windows à partir du serveur Internet/WSUS. Elle exécutera ensuite SysPrep et tentera de redémarrer dans l'environnement de déploiement à partir du disque local et d'envoyer l'image au serveur MDT.
Lorsque ce processus est terminé, la VM est arrêtée et un fichier nommé W10-21H2_YEAR_MONTH_DAY_HOUR_MINUTE.wim se trouve dans le dossier "Captures" du "Deployment Share".
Vous avez maintenant une image de référence pour Windows 10 21H2 et une installation de "Microsoft Deployment Toolkit", avec un partage de déploiement spécifiquement configuré pour la création et la capture d'images de référence.
Impossible de trouver le fichier script "C:\LTIbootstrap.vbs".
Si vous rencontrez l'erreur suivante : "Impossible de trouver le fichier script "C:\LTIbootstrap.vbs.", il y a deux solutions.
- Vous utilisez une machine virtuelle Hyper-V de génération 2. Dans ce cas, utilisez plutôt une machine virtuelle de génération 1 (donc en mode BIOS).
- Vous utilisez VMware (Workstation, ESXI, Fusion...). Dans ce cas, modifier l'option de démarrage en BIOS au lieu de EFI par défaut.
Déployer une image de référence avec MDT et WDS
Introduction
Nous allons reproduire des étapes très similaires à la création de l'image de référence.
Création du partage de déploiement
- Ouvrez la console "Deployment Workbench" dans le menu Démarrer.
- Cliquez avec le bouton droit sur "Deployment Shares".
- Sélectionnez "New Deployment Share".
- Saisissez le chemin d'accès au partage de déploiement : "M:\Deploy".
- Entrez le nom du partage : "Deploy$".
- Donnez une description au partage.
- Acceptez les valeurs par défaut car nous pourrons les modifier ultérieurement.
- Par défaut, les autorisations de partage sont définies sur le groupe des administrateurs locaux. Nous reviendrons sur ce point plus tard.
Ajouter un système d'exploitation
- Allez dans la console "Deployment Workbench" > "Operating Systems".
- Cliquez avec le bouton droit et sélectionnez "Import Operating System".
- Dans l'assistant, sélectionnez "Custom image file", puis naviguez jusqu'au dossier "Captures" du partage "DeploymentShare" comme fichier source (le fichier .wim créé suite à la capture).
- Lorsqu'on vous demande de spécifier les fichiers de configuration du système d'exploitation, sélectionnez "Setup files are not needed".
- Pour le nom du répertoire de destination, entrez un nom que vous souhaitez utiliser et terminez l'assistant.
- Allez dans le nœud "Operating Systems" et renommez l'image de référence que nous venons de capturer en quelque chose de plus lisible.
Création d'une séquence de tâches
- Dans la console "Deployment Workbench", allez dans "Task Sequences".
- Cliquez avec le bouton droit et sélectionnez "New Task Sequence".
- Pour l'ID, entrez : "W10-21H2".
- Nommez-la "Deploy Windows 10 21H2".
- Sélectionnez "Standard Client Task Sequence".
- Pour le système d'exploitation, sélectionnez l'image personnalisée que nous avons importée précédemment.
- Sélectionnez "Do not specify a product key at this time" si vous utilisez KMS.
- Saisissez un nom d'organisation.
- Saisissez le mot de passe de l'administrateur local.
- Terminez l'assistant.
Maintenant, nous allons configurer la séquence de tâches.
Configuration de la séquence de tâches
- Faites un clic droit sur la séquence de tâches qui vient d'être créée et sélectionnez "Propriétés".
- Développez le dossier "Initialisation" dans le volet de gauche.
- Allez sur l'élément "Gather local only".
- Dans la fenêtre "Propriétés", sélectionnez "Gather local data and process rules".
- Saisissez les éléments suivants dans "Rules file" : customsettings.ini.
- Allez dans le dossier "State Restore" et sélectionnez "Windows Update (Pre-Application Installation)".
- Dans la partie droite de la fenêtre "Propriétés", allez sur l'onglet "Options".
- Décochez la case "Disable this step" et faites de même avec "Windows Update (Post-Application Installation)".
- Sélectionnez l'élément "Install Applications" et cochez la case "Disable this step".
- Cliquez sur "Appliquer" et fermez la séquence de tâches.
Sécurisation du partage de déploiement
Dans le post précédent, nous avons créé un utilisateur appelé mdt_admin dans Active Directory pour être utilisé comme un compte de service. Nous devons donner à cet utilisateur l'accès au nouveau partage de déploiement que nous avons créé ici.
- Allez sur le serveur ou le PC où le partage de déploiement est hébergé.
- Donnez à l'utilisateur mdt_admin des permissions de contrôle total sur le partage et des permissions de contrôle total sur tous les fichiers et dossiers du partage de déploiement.
- Vous pouvez également donner des autorisations similaires aux utilisateurs ou aux groupes qui vont utiliser le partage de déploiement.
Ensuite, nous devons configurer les fichiers Bootstrap.ini et CustomSettings.ini pour contrôler certains aspects de l'environnement de déploiement. Les paramètres ci-dessous sont une configuration minimale de mon laboratoire, et vous pouvez vouloir ajouter plus de temps.
Configuration de Bootstrap.ini
- Dans Deployment Workbench, cliquez avec le bouton droit de la souris sur le partage de déploiement et sélectionnez Propriétés.
- Sélectionnez l'onglet Rules et cliquez sur le bouton Edit Bootstrap.ini.
- Ajoutez les paramètres ci-dessous au fichier Bootstrap.ini.
- Fermez et enregistrez le fichier Bootstrap.ini.
Configuration de CustomSettings.ini
Les paramètres ci-dessous méritent quelques explications. La section [Virtual Machine] concerne l'installation des pilotes, que nous aborderons plus tard dans cet article. La section Join Domain est importante. Ici, j'ai mis le compte mdt_admin à utiliser comme compte pour joindre le périphérique en cours d'imagerie au domaine contoso.com. Si vous suivez ce guide à la lettre, le compte mdt_admin n'aura pas les autorisations appropriées pour joindre un périphérique à un domaine, et vous devez donc soit lui donner les autorisations requises, soit créer un nouveau compte dans ce but précis.
Les autres paramètres sont les préférences d'emplacement relatives au Royaume-Uni et les paramètres de résolution qui empêchent le périphérique fini d'adopter par défaut une résolution de 1024 x 768, et d'utiliser à la place la résolution recommandée que Windows reçoit de l'écran.
Dans l'onglet Règles de la fenêtre des propriétés de Deployment Share, ajoutez les paramètres ci-dessous.
Nous devons maintenant créer le support de démarrage pour démarrer la VM dans l'environnement de déploiement.
Création du support de démarrage
- Dans Deployment Workbench, cliquez avec le bouton droit de la souris sur le partage de déploiement.
- Sélectionnez Update Deployment Share.
- Sélectionnez Completely regenerate the boot images.
- Suivez l'assistant. La création des images de démarrage prendra un certain temps.
Test de la séquence de tâches
Pour tout tester, nous devons copier le fichier ISO que nous venons de générer. Il se trouve dans le dossier Boot du Deployment Share. Allez sur le serveur ou le PC qui héberge le partage de déploiement et naviguez jusqu'au dossier de démarrage. Il devrait y avoir à l'intérieur un fichier nommé LiteTouchPE_x64.iso. Copiez ce fichier à un endroit où une machine virtuelle Hyper-V pourra y accéder. Pour éviter toute confusion avec l'ISO que nous avons généré à partir du partage de déploiement Build, nous ajouterons -deploy au nom de ce nouvel ISO. Créez une nouvelle VM dans Hyper-V avec la configuration suivante :
Pour Hyper-V uniquement : Génération 1, pas 2. Des problèmes ont été signalés avec des VM de génération 2.
- Au moins 2x vCPUs
- Au moins 4GB de RAM
- Adaptateur réseau avec accès au réseau local.
- Disque dur virtuel d'au moins 40 Go, de préférence sur un support rapide.
- Démarrez à partir du CD en utilisant le fichier LiteTouchPE_x64-deploy.iso de MDT.
- Si vous utilisez Hyper-V sous Windows 10 1709 ou supérieur, assurez-vous que l'option Utiliser les points de contrôle automatiques est désactivée.
Démarrez la VM et elle démarrera à partir de l'iso LiteTouchPE_x64-deploy.iso dans l'environnement de déploiement. Un écran de connexion s'affichera et vous devrez vous connecter avec les informations d'identification Active Directory qui ont accès au partage de déploiement. Une fois connecté, vous verrez apparaître un écran portant le nom de la séquence de tâches que vous avez créée précédemment. Sélectionnez votre séquence de tâches et cliquez sur Next. Vous serez invité à entrer un nom pour le dispositif, il sera également ajouté à Active Directory sous ce nom. Cliquez sur Next et la séquence de tâches commencera.
Lorsque la séquence de tâches est terminée, la VM est arrêtée.
Ceci termine le test de base de la séquence de tâches de déploiement. Nous allons maintenant passer aux pilotes et à une configuration plus poussée.
Configuration des associations d'applications par défaut
Voici comment configurer les associations d'applications par défaut dans la séquence de tâches de déploiement.
- En utilisant une installation existante de Windows 10, naviguez vers Paramètres > Système > Applications par défaut.
- Définissez les applications par défaut et toute autre association de fichiers, le cas échéant.
- Ouvrez Windows PowerShell (Admin) en cliquant avec le bouton droit de la souris sur le bouton Windows/Démarrer ou en appuyant sur Win + X.
- Dans la fenêtre PowerShell, tapez ce qui suit et appuyez sur Entrée : Dism /Online /Export-DefaultAppAssociations:C:\AppAssoc.xml
- Après quelques secondes, vous devriez voir L'opération s'est déroulée avec succès dans la fenêtre PowerShell.
- Naviguez jusqu'à C:\ et copiez AppAssoc.xml dans votre partage de déploiement MDT : \SERVER-NAME\Deploy$\_custom.
- Ouvrez le Deployment Workbench et accédez à Deployment Share > Task Sequences.
- Cliquez avec le bouton droit de la souris sur la séquence de tâches Déployer Windows 10 21H2 et sélectionnez Propriétés.
- Cliquez sur l'onglet Séquence de tâches et naviguez jusqu'à Postinstall > Configure.
- Cliquez sur le bouton Ajouter en haut de la vue des actions de la séquence de tâches et allez dans Général > Exécuter la ligne de commande.
- Entrez Set Default App Associations dans le champ Nom, et dans le champ Ligne de commande entrez : [code language="text"]Dism.exe /Image:%OSDisk%\ /Import-DefaultAppAssociations:%DEPLOYROOT%\Applications\_scripts\AppAssoc.xml[/code]
- Cliquez sur Appliquer pour enregistrer les modifications.
Gestion des pilotes
Nous allons maintenant configurer la façon dont les pilotes sont installés pour les périphériques physiques sur lesquels nous allons déployer Windows 10. Il y a plusieurs façons de le faire, ici je vais montrer la méthode "Total Control" que j'ai utilisé plus récemment.
La première chose dont vous aurez besoin est le fabricant et les numéros de modèle de tous les appareils sur lesquels vous souhaitez déployer l'image. Vous pouvez les trouver en démarrant un appareil dans sa version actuelle de Windows ou dans l'environnement de déploiement WinPE en utilisant le disque de démarrage LiteTouch_x64.iso ou un démarrage PXE. Voici un article précédent que j'ai écrit sur la façon de configurer le démarrage PXE pour MDT si nécessaire : Démarrage PXE pour Microsoft Deployment Toolkit.
Lorsque le périphérique est démarré dans l'environnement de déploiement, appuyez sur F8 pour obtenir une invite de commande, et tapez les commandes suivantes :
wmic computersystem get manufacturer
wmic computersystem get model
Le résultat de ces commandes est le nom du fabricant et le numéro de modèle dont vous aurez besoin. La prochaine chose dont vous aurez besoin, ce sont les pilotes. Windows 10 est bon pour installer les pilotes manquants à partir de Windows Update, mais cela peut prendre un certain temps et il serait préférable que le périphérique fonctionne avec tous les pilotes dont il a besoin une fois le déploiement terminé.
La plupart des grands fabricants (Dell, HP, Lenovo) font un travail décent en fournissant des pilotes qui peuvent être utilisés avec MDT. Si vous avez des difficultés à les trouver, vous pouvez utiliser le catalogue Microsoft Update pour rechercher et télécharger les pilotes spécifiques que Windows Update installe et les utiliser avec MDT. Une fois que vous avez les pilotes dont vous avez besoin, nous devons les ajouter à MDT.
- Ouvrez le Deployment Workbench.
- Accédez à Deployment Share > Out-of-Box Drivers.
- Faites un clic droit et sélectionnez Nouveau dossier, nommez le dossier La sortie du fabricant.
- Cliquez avec le bouton droit de la souris sur le dossier Manufacturer et sélectionnez New Folder.
- Nommez le dossier en fonction du modèle de périphérique pour lequel nous allons importer des pilotes.
- Cliquez avec le bouton droit de la souris sur le dossier que vous venez de créer et créez des dossiers pour chaque type de pilote que vous ajouterez, par exemple Graphics, Chipset, Bluetooth. NOTE : Ceci est juste pour la commodité et n'est pas nécessaire pour l'installation des pilotes.
- Faites un clic droit sur un dossier de type de pilote et sélectionnez Importer des pilotes.
- Entrez le répertoire source des pilotes pour ce type de pilote.
- Cochez la case Importer les pilotes même s'ils sont des doublons d'un pilote existant.
- Cliquez sur Suivant et terminez l'assistant. L'assistant copiera tous les fichiers nécessaires dans le dossier du type de pilote.
- Répétez les étapes 7-10 pour chaque type de pilote requis.
- Enfin, répétez les étapes 3 à 11 pour chaque fabricant et modèle requis.
Si vous avez de nombreux fabricants et modèles différents, ce processus peut être assez fastidieux. J'ai créé un script PowerShell pour automatiser le processus, il est sur mon GitHub ici. Il nécessite une certaine documentation que je fournirai dans un post séparé.
Nous devons maintenant modifier la séquence de tâches de déploiement pour configurer l'emplacement du pilote.
- Allez dans l'atelier de déploiement et les séquences de tâches, sélectionnez la séquence de tâches Déployer Windows 10.
- Allez sur l'onglet Séquence de tâches dans la fenêtre Propriétés.
- Naviguez jusqu'à Preinstall et sélectionnez Enable Bitlocker (Offline), puis allez dans le menu Add, General et sélectionnez Set Task Sequence Variable.
- Vous devriez avoir une nouvelle variable vide Set Task Sequence Variable sous Enable Bitlocker (Offline).
- Renommez la variable vide Set Task Sequence Variable en Set DriverGroup.
- Dans le panneau Propriétés, entrez ce qui suit pour Task Sequence Variable : DriverGroup001.
- Dans le panneau Propriétés, entrez la valeur suivante : %Make%\%Model%.
- Maintenant, descendez et sélectionnez Inject Drivers.
- Dans le panneau Propriétés, changez la liste déroulante Choose a selection profile (Choisir un profil de sélection) en Nothing (Rien).
- Sélectionnez l'option Installer tous les pilotes du profil de sélection.
- Cliquez sur Appliquer pour enregistrer les modifications et sur OK pour fermer la séquence de tâches.
La séquence de tâches est maintenant configurée pour installer les pilotes de tout périphérique dont les pilotes se trouvent dans la structure de dossier correcte sous Out-of-Box Drivers.
Démarrez le périphérique physique dans l'environnement de déploiement et exécutez la séquence Déployer Windows 10 21h2. Une fois l'opération terminée, vérifiez le Gestionnaire de périphériques et tous les périphériques devraient être installés avec succès.
Ajout de pilotes à l'image de démarrage de MDT
Il peut être nécessaire d'ajouter des pilotes à l'image de démarrage MDT pour des périphériques tels que des cartes de stockage ou de réseau. Pour déterminer si des pilotes sont nécessaires :
- Démarrez le périphérique en question dans l'environnement de déploiement et appuyez sur F8 pour faire apparaître une invite de commande.
- Tapez ipconfig et si vous disposez d'une adresse IP, vous ne devriez pas avoir à ajouter de pilotes d'adaptateurs réseau.
- Tapez diskpart, et lorsque diskpart est chargé, tapez list disk. Si le disque dur local est répertorié, vous ne devriez pas avoir à ajouter de pilotes de stockage.
Si vous devez ajouter des pilotes à l'image de démarrage :
- Dans le Deployment Workbench, accédez à Deployment Share > Out-of-Box Drivers.
- Cliquez avec le bouton droit de la souris et sélectionnez Nouveau dossier, appelez le dossier WinPE x64.
- Cliquez avec le bouton droit de la souris sur le dossier WinPE x64 et sélectionnez New Folder.
- Nommez le dossier d'un nom approprié au fabricant du périphérique pour lequel vous allez ajouter des pilotes, puis créez un autre dossier à l'intérieur pour le modèle du périphérique.
- Faites un clic droit sur le dossier du modèle que vous venez de créer et créez des dossiers pour chaque type de pilote que vous ajouterez, par exemple Stockage, Réseau.
- Pour importer les pilotes, faites un clic droit sur un dossier de type de pilote et sélectionnez Importer des pilotes.
- Entrez le répertoire source des pilotes et cochez la case Importer les pilotes même s'ils sont des doublons d'un pilote existant.
- Cliquez sur Suivant et terminez l'assistant. L'assistant copiera tous les fichiers nécessaires dans le dossier du type de pilote.
- Répétez les étapes 6 à 8 pour chaque type de pilote requis.
- Nous devons maintenant créer un profil de sélection pour WinPE x64.
- Allez dans Configuration avancée puis Profils de sélection.
- Cliquez avec le bouton droit de la souris sur Selection Profiles et sélectionnez New Selection Profile.
- Entrez WinPE x64 comme nom de profil de sélection.
- Dans la liste des dossiers, naviguez jusqu'à DS001:\ > Out-of-Box Drivers > WinPE x64 et cochez la case à côté du dossier.
- Cliquez sur Next > Next > Finish pour terminer l'assistant.
- Cliquez avec le bouton droit de la souris sur le Deployment Share et sélectionnez Properties.
- Allez dans l'onglet Windows PE et changez le menu déroulant Plate-forme en x64.
- Allez dans l'onglet Drivers and Patches et changez le menu déroulant Selection profile en WinPE x64.
- Assurez-vous que l'option Inclure uniquement les pilotes des types suivants est sélectionnée et que les options Inclure tous les pilotes réseau dans le profil de sélection et Inclure tous les pilotes de stockage de masse dans le profil de sélection sont cochées.
- Cliquez sur Appliquer pour enregistrer les modifications, puis sur OK pour fermer la fenêtre Propriétés.
- Cliquez avec le bouton droit de la souris sur le Deployment Share et sélectionnez Update Deployment Share.
- Sélectionnez Completely regenerate the boot images, puis Next. Les images de démarrage seront régénérées avec les pilotes inclus.
- Cliquez sur Terminer pour terminer l'assistant.
Le support de démarrage MDT devrait maintenant comporter les pilotes de réseau et/ou de stockage requis. Vous disposez maintenant d'une image de référence pour Windows 10 21H2 qui est prête à être déployée.
MDT / WDS avec base de données SQL
On peut utiliser une base de données afin de reparamétrer des appareils (rôles, applications, nom d'ordinateur, ou des variables).
Dans mon cas, j'utilise une base de données afin de nommer les ordinateurs selon leurs adresses MAC. On peut également utiliser le numéro de série :
Dans mon cas, j'ai installé SQL Server 2019 Express (gratuite) : https://go.microsoft.com/fwlink/?linkid=866658
Dans le gestionnaire de configuration SQL, on active les canaux nommés.
On active également SQL Server Browser et on le place en automatique.
Dans MDT, on ajoute la base de données :
On spécifie ces options :
On clique droit sur "Database" et "Configure Database Rules".
On ne coche seulement la première case (dans mon besoin). Cela rajoute automatiquement des informations dans le customsettings.ini.
On installe ensuite "Microsoft SQL Server Management Studio".
On créer un compte :
On le nomme sql_mdt, un mot de passe et on choisit "MDT" comme base de données par défaut.
Dans "User Mapping", on coche MDT.
Exemple de customsettings.ini :
[Settings]
Priority=DefaultGateway, TaskSequenceID, Default, MAKE, CSettings
Properties=TargetGroup
[Default]
OSInstall=Y
;Computer Details
SkipComputerName=YES
SkipDomainMembership=YES
JoinDomain=ad.khroners.fr
DomainAdmin=mdt_admin
DomainAdminDomain=ad.khroners.fr
DomainAdminPassword=S€CUR3DP4ssw0rD1234
;Skip Task Sequence
SkipTaskSequence=NO
;TaskSequenceID=W10PRO-21H2-X64
;Drivers
DriverGroup001=WinPE x64\%Make%
;WSUS
TargetGroup=MDT
;User Data
SkipUserData=YES
;Computer Backup
SkipComputerBackup=YES
;Product Key
SkipProductKey=YES
;Language Packs
SkipPackageDisplay=YES
;Locale and Time
SkipLocaleSelection=YES
SkipTimeZone=YES
KeyboardLocale=040c:0000040c
KeyboardLocalePE=040c:0000040c
UserLocale=fr-FR
UILanguage=fr-FR
TimeZoneName=Romance Standard Time
;Roles and Features
SkipRoles=YES
;Applications
SkipApplications=YES
;Administrator Password
SkipAdminPassword=YES
AdminPassword=local-admin-password
;Local Administrators
SkipAdminAccounts=YES
;Capture Image
SkipCapture=YES
;Bitlocker
SkipBitLocker=YES
;Ready to begin
SkipSummary=YES
;Operating system deployment completed successfully
SkipFinalSummary=YES
FinishAction=REBOOT
WSUSServer=http://RN-SRV-WS-AAD01.ad.khroners.fr:8530
[DefaultGateway]
10.29.0.254=Brest
10.35.100.254=Rennes
[Brest]
SLShare=\\BR-SRV-WDS01.ad.khroners.fr\DeploymentShare$\Logs
EventService=http://BR-SRV-WDS01:9800
[Rennes]
SLShare=\\RN-SRV-WDS01.ad.khroners.fr\DeploymentShare$\Logs
EventService=http://RN-SRV-WDS01:9800
[W10-21H2-ADM-35]
MachineObjectOU=OU=Administratifs,OU=Workstations,OU=RENNES,OU=Sites,DC=ad,DC=khroners,DC=fr
[W10-21H2-FOR-35]
MachineObjectOU=OU=Formateurs,OU=Workstations,OU=RENNES,OU=Sites,DC=ad,DC=khroners,DC=fr
[CSettings]
SQLServer=RN-SRV-WDS01.ad.khroners.fr
Instance=SQLEXPRESS
Database=MDT
Netlib=DBMSSOCN
DBID=sql_mdt
DBPWD=S€CUR3DSqLP4ssw0rD1234
Table=ComputerSettings
Parameters=UUID, AssetTag, SerialNumber, MacAddress
ParameterCondition=OR
Modifier le registre d'une image Windows
Je modifie le registre de l'ISO de Windows afin d'empêcher la recherche automatique de pilotes via Windows Update.
Pour se faire, il faut avoir extrait le wim de l'édition que l'on souhaite (ou spécifier l'index, mais ne déployant qu'un type d'OS (la version pro), j'en ai qu'un).
dism /mount-wim /wimfile:C:\Users\Administrateur.AD\Desktop\install.wim /mountdir:C:\AIKMount /index:1
reg load HKEY_LOCAL_MACHINE\MountedHive C:\AIKMount\Windows\System32\config\SOFTWARE
reg add HKEY_LOCAL_MACHINE\MountedHive\Microsoft\Windows\CurrentVersion\DriverSearching /v SearchOrderConfig /t REG_DWORD /d 0 /f
reg add HKEY_LOCAL_MACHINE\MountedHive\Policies\Microsoft\Windows\WindowsUpdate /v ExcludeWUDriversInQualityUpdate /t REG_DWORD /d 00000001 /f
reg unload HKEY_LOCAL_MACHINE\MountedHive
Dism /Unmount-image /MountDir:C:\AIKMount /commit
La première commande monte l'image dans un répertoire, la suivante monte le registre de cette image. Les deux suivantes modifient le registre, l'autre décharge le registre et la dernière démonte l'image en appliquant les modifications.
Exemple : MDT avec SQL
Dans mon lab, j'ai déployé un MDT avec DFS pour les applications. Voici l'exemple complet :
Fichier customsettings.ini
[Settings]
Priority=DefaultGateway, TaskSequenceID, Default, MAKE, CSettings
Properties=TargetGroup
[Default]
OSInstall=Y
;Computer Details
SkipComputerName=YES
SkipDomainMembership=YES
JoinDomain=ad.khroners.fr
DomainAdmin=mdt_admin
DomainAdminDomain=ad.khroners.fr
DomainAdminPassword=Motdepasse
;Skip Task Sequence
SkipTaskSequence=NO
;TaskSequenceID=W10PRO-21H2-X64
;Drivers
DriverGroup001=WinPE x64\%Make%
;WSUS
TargetGroup=MDT
;User Data
SkipUserData=YES
;Computer Backup
SkipComputerBackup=YES
;Product Key
SkipProductKey=YES
;Language Packs
SkipPackageDisplay=YES
;Locale and Time
SkipLocaleSelection=YES
SkipTimeZone=YES
KeyboardLocale=040c:0000040c
KeyboardLocalePE=040c:0000040c
UserLocale=fr-FR
UILanguage=fr-FR
TimeZoneName=Romance Standard Time
;Roles and Features
SkipRoles=YES
;Applications
SkipApplications=YES
;Administrator Password
SkipAdminPassword=YES
AdminPassword=local-admin-password
;Local Administrators
SkipAdminAccounts=YES
;Capture Image
SkipCapture=YES
;Bitlocker
SkipBitLocker=YES
;Ready to begin
SkipSummary=YES
;Operating system deployment completed successfully
SkipFinalSummary=YES
FinishAction=REBOOT
WSUSServer=http://RN-SRV-WS-AAD01.ad.khroners.fr:8530
EventService=http://RN-SRV-WDS01:9800
[DefaultGateway]
10.29.0.254=Brest
10.35.100.254=Rennes
[Brest]
SLShare=\\BR-SRV-WDS01.ad.khroners.fr\DeploymentShare$\Logs
EventService=http://BR-SRV-WDS01:9800
[Rennes]
SLShare=\\RN-SRV-WDS01.ad.khroners.fr\DeploymentShare$\Logs
EventService=http://RN-SRV-WDS01:9800
[W10-22H2-ADM-35]
MachineObjectOU=OU=Administratifs,OU=Workstations,OU=RENNES,OU=Sites,DC=ad,DC=khroners,DC=fr
[W10-22H2-FOR-35]
MachineObjectOU=OU=Formateurs,OU=Workstations,OU=RENNES,OU=Sites,DC=ad,DC=khroners,DC=fr
[CSettings]
SQLServer=RN-SRV-WDS01.ad.khroners.fr
Instance=SQLEXPRESS
Database=MDT
Netlib=DBMSSOCN
DBID=sql_mdt
DBPWD=Motdepasse
Table=ComputerSettings
Parameters=UUID, AssetTag, SerialNumber, MacAddress
ParameterCondition=OR
Fichier bootstrap.ini
[Settings]
Priority=DefaultGateway, Default
[DefaultGateway]
10.29.0.254=Brest
10.35.100.254=Rennes
[Brest]
DeployRoot=\\BR-SRV-WDS01\DeploymentShare$
[Rennes]
DeployRoot=\\RN-SRV-WDS01\DeploymentShare$
[Default]
UserDomain=AD
UserID=mdt_admin
UserPassword=Motdepasse
SkipBDDWelcome=YES
Scripts
DeployWiz_SelectTS.vbs
J'ai modifié ce script pour utiliser la property "TaskSequenceID" dans le customsettings.ini.
' // ***************************************************************************
' //
' // Copyright (c) Microsoft Corporation. All rights reserved.
' //
' // Microsoft Deployment Toolkit Solution Accelerator
' //
' // File: DeployWiz_Initialization.vbs
' //
' // Version: 6.3.8456.1000
' //
' // Purpose: Main Client Deployment Wizard Initialization routines
' //
' // ***************************************************************************
Option Explicit
'''''''''''''''''''''''''''''''''''''
' Image List
'
Dim g_AllOperatingSystems
Function AllOperatingSystems
Dim oOSes
If isempty(g_AllOperatingSystems) then
set oOSes = new ConfigFile
oOSes.sFileType = "OperatingSystems"
oOSes.bMustSucceed = false
set g_AllOperatingSystems = oOSes.FindAllItems
End if
set AllOperatingSystems = g_AllOperatingSystems
End function
Function InitializeTSList
Dim oItem, sXPathOld
If oEnvironment.Item("TaskSequenceID") <> "" and oProperties("TSGuid") = "" then
sXPathOld = oTaskSequences.xPathFilter
for each oItem in oTaskSequences.oControlFile.SelectNodes( "/*/*[ID = '" & oEnvironment.Item("TaskSequenceID")&"']")
oLogging.CreateEntry "TSGuid changed via TaskSequenceID = " & oEnvironment.Item("TaskSequenceID"), LogTypeInfo
oEnvironment.Item("TSGuid") = oItem.Attributes.getNamedItem("guid").value
exit for
next
oTaskSequences.xPathFilter = sXPathOld
End if
TSListBox.InnerHTML = oTaskSequences.GetHTMLEx ( "Radio", "TSGuid" )
PopulateElements
TSItemChange
End function
Function TSItemChange
Dim oInput
ButtonNext.Disabled = TRUE
for each oInput in document.getElementsByName("TSGuid")
If oInput.Checked then
oLogging.CreateEntry "Found CHecked Item: " & oInput.Value, LogTypeVerbose
ButtonNext.Disabled = FALSE
exit function
End if
next
End function
'''''''''''''''''''''''''''''''''''''
' Validate task sequence List
'
Function ValidateTSList
Dim oTS
Dim sCmd
'ajoute
Dim oItem
Set oShell = createObject("Wscript.shell")
'
set oTS = new ConfigFile
oTS.sFileType = "TaskSequences"
SaveAllDataElements
If Property("TSGuid") = "" then
oLogging.CreateEntry "No valid TSGuid found in the environment.", LogTypeWarning
ValidateTSList = false
End if
oLogging.CreateEntry "TSGuid Found: " & Property("TSGuid"), LogTypeVerbose
If oTS.FindAllItems.Exists(Property("TSGuid")) then
oEnvironment.Item("TaskSequenceID") = oUtility.SelectSingleNodeString(oTS.FindAllItems.Item(Property("TSGuid")),"./ID")
End if
' Set the related properties
oUtility.SetTaskSequenceProperties oEnvironment.Item("TaskSequenceID")
If oEnvironment.Item("OSGUID") <> "" and oEnvironment.Item("ImageProcessor") = "" then
' There was an OSGUID defined within the TS.xml file, however the GUID was not found
' within the OperatingSystems.xml file. Which is a dependency error. Block the wizard.
ValidateTSList = False
ButtonNext.Disabled = True
Bad_OSGUID.style.display = "inline"
Else
ValidateTSList = True
ButtonNext.Disabled = False
Bad_OSGUID.style.display = "none"
End if
' ajoute
sCmd = "wscript.exe """ & oUtility.ScriptDir & "\ZTIGather.wsf"""
oItem = oShell.Run(sCmd, , true)
'
End Function
ZTIWindowsUpdate.wsf
J'ai modifié ce script pour ajouter la property "TargetGroup" pour cibler les PC lors du déploiement pour WSUS.
Il faut donc ajouter un groupe de PC dans WSUS.
<job id="ZTIWindowsUpdate">
<script language="VBScript" src="ZTIUtility.vbs"/>
<script language="VBScript">
' // ***************************************************************************
' //
' // Copyright (c) Microsoft Corporation. All rights reserved.
' //
' // Microsoft Deployment Toolkit Solution Accelerator
' //
' // File: ZTIWindowsUpdate.wsf
' //
' // Version: 6.3.8456.1000
' //
' // Purpose: Installs all needed updates (drivers, patches, service packs,
' // etc.) from the Windows Update/Microsoft Update site or WSUS
' // server, rebooting as required until no more updates are needed.
' //
' // Usage: cscript.exe [//nologo] ZTIWindowsUpdate.wsf [/debug:true]
' //
' // ***************************************************************************
Option Explicit
RunNewInstance
'//----------------------------------------------------------------------------
'// Global Constants
'//----------------------------------------------------------------------------
Const MSIT_WU_REBOOT_MAX = 7
Const MAX_UPDATES = 100
'//----------------------------------------------------------------------------
'// Main Class
'//----------------------------------------------------------------------------
Class ZTIWindowsUpdate
'//----------------------------------------------------------------------------
'// Class instance variable declarations
'//----------------------------------------------------------------------------
Public globalVariable
Private privateVariable
'//----------------------------------------------------------------------------
'// Constructor to initialize needed global objects
'//----------------------------------------------------------------------------
Private Sub Class_Initialize
' No initialization is required
End Sub
'//----------------------------------------------------------------------------
'// Main routine
'//----------------------------------------------------------------------------
Function Main
Dim iRetVal
Dim Item
Dim MSIT_WU_Count
Dim MSIT_LogType
Dim ServiceManager
Dim bFoundMU
Dim NewUpdateService
Dim strCabPath
Dim iResult
Dim oProgress
Dim bFailure, bReboot
Main = Success
' Validate that are not restarting from a failed install.
If ucase(oEnv("SystemDrive")) = "X:" Then
oLogging.CreateEntry "Environment Error: ManualRetry (From ZTIWindowsUpdate).", LogTypeInfo
oEnvironment.Item("LTISuspend") = "LiteTouch is trying to install Windows Updates." & _
vbNewLine & "This cannot be performed in Windows PE." & _
vbNewLine & "If booting from a USB Flash Disk, please remove all drives before Retrying." & _
vbNewLine & "Otherwise, ensure the hard disk is selected first in the boot order of the BIOS."
oEnvironment.Item("SMSTSRebootRequested") = "true"
oEnvironment.Item("SMSTSRetryRequested") = "true"
Main = SUCCESS
exit function
End if
'//----------------------------------------------------------------------------
'// Initialization
'//----------------------------------------------------------------------------
MSIT_WU_Count = oEnvironment.Item("MSIT_WU_Count")
If not IsNumeric(MSIT_WU_Count) then
MSIT_WU_Count = 0
End if
oLogging.CreateEntry "Begin Windows Update. Reboot=[" & oEnvironment.Item("SMSTSRebootRequested") & "] Retry=[" & oEnvironment.Item("SMSTSRetryRequested") & "] Count = " & MSIT_WU_Count , LogTypeInfo
MSIT_WU_Count = MSIT_WU_Count + 1
oEnvironment.Item("MSIT_WU_Count") = MSIT_WU_Count
If oEnvironment.Item("WsusServer") = "" then
oLogging.ReportProgress "Initializing Windows Update process (pass " & MSIT_WU_Count & ")", 0
Else
oLogging.ReportProgress "Initializing WSUS update process (pass " & MSIT_WU_Count & ")", 0
End if
If oEnvironment.Item("SMSTSRebootRequested") <> "" then
oEnvironment.Item("SMSTSRebootRequested") = ""
End if
If oEnvironment.Item("SMSTSRetryRequested") <> "" then
oEnvironment.Item("SMSTSRetryRequested") = ""
End if
If MSIT_WU_Count > MSIT_WU_REBOOT_MAX then
oLogging.ReportFailure "ZTIWindowsUpdate has run and failed too many times. Count = " & MSIT_WU_Count, 9902
End if
' Make sure the necessary agent is in place
iRetVal = VerifyWUA
If iRetVal = 3010 then
' Initiate a reboot and ask that we be re-executed
oEnvironment.Item("SMSTSRebootRequested") = "true"
oEnvironment.Item("SMSTSRetryRequested") = "true"
Exit Function
ElseIf iRetVal <> 0 then
oLogging.ReportFailure "Unexpected issue installing the updated Windows Update Agent, rc = " & iRetVal, 9903
End if
' Opt-In to the Microsoft Update Agent
On Error Resume Next
Item = oFSO.GetFileVersion ( ees("%SystemRoot%\System32\WUAUENG.DLL" ) )
oLogging.CreateEntry "Ready to Opt-In to Microsoft Update: WUA Version: " & Item , LogTypeInfo
Set ServiceManager = nothing
Set ServiceManager = CreateObject("Microsoft.Update.ServiceManager")
On Error Goto 0
If ServiceManager is nothing then
oLogging.CreateEntry "Failed to Create Object: Microsoft.Update.ServiceManager" , LogTypeWarning
Else
ServiceManager.ClientApplicationID = "ZTIWindowsUpdate " & Version
bFoundMU = False
For each Item in ServiceManager.Services
WScript.Echo "Registered Update Service: " & Item.ServiceID & " " & Item.Name
If Item.ServiceID = "7971f918-a847-4430-9279-4a52d1efe18d" then
bFoundMU = True
End if
Next
oLogging.CreateEntry "Microsoft Update Service: Enabled = " & bFoundMU, LogTypeInfo
If not bFoundMU then
On Error Resume Next
Err.clear
If Err.Number <> 0 then
oLogging.CreateEntry "There was an error getting Windows Update to opt into Microsoft Update. Please verify you are running the latest version of Windows Update Agent." , LogTypeWarning
End if
If oEnvironment.Item("WsusServer") = "" then
'//----------------------------------------------------------------------------
'// Try to find the standalone muauth.cab file and install from it
'//----------------------------------------------------------------------------
'
' From http://download.windowsupdate.com/v9/microsoftupdate/redir/muauth.cab
'
' Place this file in the Distribution\Tools folder so this script can find them.
iResult = oUtility.FindFile("muauth.cab", strCabPath)
If iResult <> Success then
'// "" will force a internet search for cab file
strCabPath = ""
End if
oLogging.CreateEntry " about to begin add service ["+ strCabPath +"]", LogTypeInfo
Set NewUpdateService = ServiceManager.AddService2("7971f918-a847-4430-9279-4a52d1efe18d",6,strCabPath)
oLogging.CreateEntry " Status: " & NewUpdateService.RegistrationState, LogTypeInfo
End if
On error goto 0
End if
End if
'//----------------------------------------------------------------------------
'// Process the command line
'//----------------------------------------------------------------------------
Dim IsRegistered, Query_Only, UpdateCommand, BadKBArticlesList
Dim BadGUIDList
Query_Only = FALSE or WScript.Arguments.Named.Exists("QUERY")
IsRegistered = FALSE
If WScript.Arguments.Unnamed.Count > 0 then
UpdateCommand = WScript.Arguments.Unnamed.Item(0)
Elseif Ucase(oEnvironment.Item("DoCapture")) = "YES" or Ucase(oEnvironment.Item("DoCapture")) = "PREPARE" then
UpdateCommand = "IsInstalled = 0 and IsHidden = 0 and Type = 'Software'"
Else
UpdateCommand = "IsInstalled = 0 and IsHidden = 0"
End if
' Check to see if this version of Windows has been registered
IsRegistered = FALSE
On Error Resume Next
For each Item in objWMI.InstancesOf("Win32_WindowsProductActivation")
IsRegistered = Item.ActivationRequired = 0
Exit for
Next
On Error Goto 0
oLogging.CreateEntry "Command Line Procesed Query=" & QUery_Only & " Registered=" & IsRegistered & " UpdateCommand=[" & UpdateCommand & "]" , LogTypeInfo
Set BadKBArticlesList = oEnvironment.ListItem("WUMU_ExcludeKB")
Set BadGUIDList = oEnvironment.ListItem("WUMU_ExcludeID")
'//----------------------------------------------------------------------------
'// Search Windows Update
'//----------------------------------------------------------------------------
oLogging.ReportProgress "Searching for updates", 0
Dim UpdateSession, searchResults, updatesToDownload
Dim Downloader, Installer, UpdateResult
Dim kbArticle, bInstall, kb, iSize
Dim i
On Error Resume Next
Set updateSession = CreateObject("Microsoft.Update.Session")
Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
On Error Goto 0
If updateSession is nothing then
oLogging.ReportFailure "Failed to Create Object: Microsoft.Update.Session.", 9904
End if
If updatesToDownload is nothing then
oLogging.ReportFailure "Failed to Create Object: Microsoft.Update.UpdateColl.", 9905
End if
updateSession.ClientApplicationID = "ZTIWindowsUpdate " & Version
oLogging.CreateEntry "Start Search..." , LogTypeInfo
On Error Resume Next
Set searchResults = updateSession.CreateupdateSearcher().Search(UpdateCommand)
If Err then
If Err.Number = &h8024402c then
oLogging.CreateEntry "Error searching for updates: Not Connected to Internet? (" & Err.Number & ")", LogTypeInfo
Main = Success
ElseIf Err.Number = &h80072ee2 then
oLogging.CreateEntry "Error searching for updates: ERROR_INTERNET_TIMEOUT: Retry! (" & Err.Number & ")", LogTypeInfo
oEnvironment.Item("SMSTSRebootRequested") = "true"
oEnvironment.Item("SMSTSRetryRequested") = "true"
ElseIf Err.Number = &h80244010 then
oLogging.CreateEntry "Timeout Error WU_E_PT_EXCEEDED_MAX_SERVER_TRIPS : Retry! (" & Err.Number & ")", LogTypeInfo
' See: http://blogs.technet.com/sus/archive/2008/09/18/wsus-clients-fail-with-warning-syncserverupdatesinternal-failed-0x80244010.aspx
oEnvironment.Item("SMSTSRebootRequested") = "false"
oEnvironment.Item("SMSTSRetryRequested") = "true"
Else
TestAndLog err = 0, "Windows Update, search for updates."
Main = Failure
End if
CleanupWhenDone
Exit Function
End if
On Error Goto 0
oLogging.ReportProgress "Processing " & searchResults.Updates.Count & " updates.", 0
For each item in searchResults.Updates
bInstall = TRUE
On Error Resume Next
item.AcceptEula
If item.InstallationBehavior.CanRequestUserInput then
bInstall = FALSE ' Do NOT install anything that can Request User Input!
End if
For each kb in Item.Categories
if ucase(kb.Name) = "DRIVERS" then
bInstall = TRUE ' Some XP drivers may be marked as CanRequestUserInput. Override!
exit for
elseif ucase(kb.Name) = "WINDOWS VISTA ULTIMATE LANGUAGE PACKS" then
bInstall = FALSE ' Most users don't want *ALL* Language Packs. Too much. Override!
exit for
end if
Next
If BadKBArticlesList.Count > 0 then
For each kbArticle in item.KBArticleIDs
For each kb in BadKBArticlesList
If lcase(kb) = lcase(kbArticle) then
bInstall = FALSE ' Do NOT install any patch in the Bad KB articles list!
End if
Next
Next
End if
For each kbArticle in BadGUIDList
If lcase(item.Identity.UpdateID) = lcase(kbArticle) then
bInstall = FALSE ' Do NOT install any patch in the Bad GUID articles list!
End if
Next
iSize = empty
kb = ""
for i = 0 to item.KBArticleIDs.Count - 1
If instr(1,Item.Title,item.KBArticleIDs(i),vbTextCompare) = 0 then
oStrings.AddToList kb, "KB" & item.KBArticleIDs(i), " "
End if
next
iSize = item.MinDownloadSize
If item.MaxDownloadSize > 0 then
iSize = Item.MaxDownloadSize
End if
If kb <> "" then
kb = " [ " & kb & " ]"
End if
If iSize > 0 then
kb = kb & " - " & FormatLargeSize(iSize)
End if
If bInstall = TRUE and updatesToDownload.count < MAX_UPDATES then
oLogging.CreateEntry "INSTALL - " & item.Identity.UpdateID & " - " & Item.Title & kb, LogTypeInfo
updatesToDownload.Add(Item)
Else
oLogging.CreateEntry " SKIP - " & item.Identity.UpdateID & " - " & Item.Title & kb, LogTypeInfo
End if
On Error Goto 0
Next
oLogging.CreateEntry "Scan complete, ready to install updates. Count = " & updatesToDownload.Count, LogTypeInfo
If updatesToDownload.Count = 0 or Query_Only then
oLogging.CreateEntry "This computer is up to date (Success)" , LogTypeInfo
oEnvironment.Item("MSIT_WU_Count") = "" ' Reset the counter
CleanupWhenDone
Main = Success
Exit Function
End if
If MSIT_WU_Count > MSIT_WU_REBOOT_MAX - 1 then
MSIT_LogType = LogTypeWarning
Else
MSIT_LogType = LogTypeInfo
End if
'//----------------------------------------------------------------------------
'// Download binaries
'//----------------------------------------------------------------------------
Set oProgress = new Progress
oLogging.CreateEntry "Begin Downloading...", LogTypeInfo
Set Downloader = updateSession.CreateUpdateDownloader()
Downloader.Updates = UpdatesToDownload
Set UpdateResult = Downloader.BeginDownload(oProgress, oProgress, vbNull)
On Error Resume Next
While not UpdateResult.IsCompleted
oLogging.ReportProgress "Downloading " & UpdatesToDownload(UpdateResult.GetProgress.CurrentUpdateIndex).Title, UpdateResult.GetProgress.PercentComplete
WScript.Sleep 500
WEnd
On Error Goto 0
For item = 0 to UpdatesToDownload.Count - 1
If not UpdatesToDownload.Item(item).IsDownloaded then
oLogging.CreateEntry " Failed to download: " & UpdatesToDownload.Item(item).Identity.UpdateID & _
" result(" & UpdateResult.GetProgress.GetUpdateResult(item).ResultCode & ") : " & UpdatesToDownload.Item(item).Title, MSIT_LogType
End if
Next
On Error Resume Next
Downloader.EndDownload UpdateResult
On Error Goto 0
'//----------------------------------------------------------------------------
'// Install Binaries
'//----------------------------------------------------------------------------
oLogging.CreateEntry "Begin Installation...", LogTypeInfo
Set Installer = updateSession.CreateUpdateInstaller()
Installer.Updates = UpdatesToDownload
Set UpdateResult = nothing
On Error Resume Next
Set UpdateResult = Installer.BeginInstall(oProgress, oProgress, vbNull)
If UpdateResult is nothing then
' Some unknown error returned from the installer, reboot and try again.
oLogging.CreateEntry "Installer.Install() returned Unknown failure! " & err.number & " " & Err.Description, LogTypeInfo
oEnvironment.Item("SMSTSRebootRequested") = "true"
oEnvironment.Item("SMSTSRetryRequested") = "true"
Exit Function
End if
On Error Goto 0
On Error Resume Next
While not UpdateResult.IsCompleted
oLogging.ReportProgress "Installing " & UpdatesToDownload(UpdateResult.GetProgress.CurrentUpdateIndex).Title, UpdateResult.GetProgress.PercentComplete
WScript.Sleep 500
WEnd
On Error Goto 0
bReboot = False
bFailure = False
For item = 0 to UpdatesToDownload.Count - 1
If not UpdatesToDownload.Item(item).IsInstalled then
If UpdateResult.GetProgress.GetUpdateResult(item).ResultCode <> 2 then
oLogging.CreateEntry " " & UpdatesToDownload.Item(item).Identity.UpdateID & _
" result(" & UpdateResult.GetProgress.GetUpdateResult(item).ResultCode & " / HR = " & hex(UpdateResult.GetProgress.GetUpdateResult(item).HResult) & _
" ) : " & UpdatesToDownload.Item(item).Title , MSIT_LogType
bFailure = True
End if
If UpdateResult.GetProgress.GetUpdateResult(item).RebootRequired then
bReboot = True
End if
End if
Next
On Error Resume Next
Installer.EndInstall UpdateResult
On Error Goto 0
'//----------------------------------------------------------------------------
'// Cleanup
'//----------------------------------------------------------------------------
If bFailure then
oLogging.CreateEntry "Failure, Please run again!" , LogTypeInfo
oEnvironment.Item("SMSTSRetryRequested") = "true"
oEnvironment.Item("SMSTSRebootRequested") = "true"
ElseIf bReboot then
oLogging.CreateEntry "More to install, Please reboot and run again!" , LogTypeInfo
oEnvironment.Item("SMSTSRetryRequested") = "true"
oEnvironment.Item("SMSTSRebootRequested") = "true"
Else
' A recently installed MicrosoftUpdate/WindowsUpdate component *may* require more/new updates.
' Rerun Main() to ensure that all updates are installed. Exit above when MU/WU returns NO updates.
oLogging.CreateEntry "Success! Please rerun WindowsUpdate to ensure machine is FULLY up to date." , LogTypeInfo
Main = Main()
If LCase(oEnvironment.Item("SMSTSRetryRequested")) <> "true" then
CleanUpWhenDone
End if
End if
End function
'//----------------------------------------------------------------------------
'// Functions
'//----------------------------------------------------------------------------
Function CleanUpWhenDone
Dim NoAutoUpdateState
NoAutoUpdateState = oEnvironment.Item("NoAutoUpdate_Previous")
If NoAutoUpdateState = "<empty>" or NoAutoUpdateState= "" then
oLogging.CreateEntry "Restore NoAutoUpdateKey to <empty>.", LogTypeInfo
On Error Resume Next
oShell.RegDelete "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\NoAutoUpdate"
On Error Goto 0
ElseIf NoAutoUpdateState <> "" then
oLogging.CreateEntry "Restore NoAutoUpdateKey to " & NoAutoUpdateState, LogTypeInfo
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\NoAutoUpdate", NoAutoUpdateState, "REG_DWORD"
Else
oLogging.CreateEntry "Unknown previous NoAutoUpdateKey State, Do Nothing [" & NoAutoUpdateState & "].", LogTypeInfo
End if
End Function
Function VerifyWUA
Dim iResult
Dim strExePath, bUpdateNeeded, objAgentInfo
Dim intMajorVersion
Dim sArchitecture
Dim iNoAutoUpdate
'//----------------------------------------------------------------------------
'// Ensure the desired tracing registry entries are in place
'//----------------------------------------------------------------------------
On error resume next
If UCase(oEnvironment.Item("Debug")) = "TRUE" then
oShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Trace\Level", 3, "REG_DWORD"
oShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Trace\Handler\Flags", &h000000ff, "REG_DWORD"
oShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Trace\Handler\Level", 3, "REG_DWORD"
oShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Trace\COMAPI\Flags", &h000000ff, "REG_DWORD"
oShell.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Trace\COMAPI\Level", 3, "REG_DWORD"
On error goto 0
End if
'//----------------------------------------------------------------------------
'// Configure Windows Update settings
'//----------------------------------------------------------------------------
If oEnvironment.Item("WsusServer") <> "" then
' Configure the WSUS server in the registry. This needs to be a URL (e.g. http://myserver).
oLogging.CreateEntry "Configuring client to use WSUS server " & oEnvironment.Item("WsusServer"), LogTypeInfo
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\WUServer", oEnvironment.Item("WsusServer"), "REG_SZ"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\WUStatusServer", oEnvironment.Item("WsusServer"), "REG_SZ"
' ajoute
If oEnvironment.Item("TargetGroup") <> "" then
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\TargetGroup", oEnvironment.Item("TargetGroup"), "REG_SZ"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\TargetGroupEnabled", 00000001, "REG_DWORD"
End if
'
End if
oLogging.CreateEntry "Configuring Windows Update settings (manual update, use server)", LogTypeInfo
If oEnvironment.Item("NoAutoUpdate_Previous") = "" then
On Error Resume Next
iNoAutoUpdate = oShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\NoAutoUpdate")
If iNoAutoUpdate = "" then
iNoAutoUpdate = "<empty>"
End if
oLogging.CreateEntry "Archive NoAUtoUpdate State: Was [" & iNoAutoUpdate & "].", LogTypeInfo
oEnvironment.Item("NoAutoUpdate_Previous") = iNoAutoUpdate
On Error Goto 0
End if
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\UseWUServer", 1, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\NoAutoUpdate", 1, "REG_DWORD"
' Restart the service to get the latest settings
oShell.Run "net stop wuauserv", 0, true
oShell.Run "net start wuauserv", 0, true
'//----------------------------------------------------------------------------
'// Ensure the needed Windows Update Agent version is installed
'//----------------------------------------------------------------------------
bUpdateNeeded = True ' init value, do not touch
' See if the version is sufficient
On Error Resume Next
Set objAgentInfo = CreateObject("Microsoft.Update.AgentInfo")
If Err.Number = 0 then
' Make sure ApiMajorVersion is 4 or higher (Version 4 is needed to opt-in to Microsoft Update)
intMajorVersion = 0 ' init value
intMajorVersion = objAgentInfo.GetInfo("ApiMajorVersion")
If intMajorVersion >= 4 Then
bUpdateNeeded = False
oLogging.CreateEntry "Windows Update Agent verion " & intMajorVersion & " found, OK to continue", LogTypeInfo
Else
oLogging.CreateEntry "Windows Update Agent verion " & intMajorVersion & " found, upgrade needed", LogTypeInfo
End if
Else
oLogging.CreateEntry "Unable to create Microsoft.Update.AgentInfo object, Windows Update Agent upgrade is needed", LogTypeInfo
End if
If not bUpdateNeeded then
VerifyWUA = 0
Exit Function
End if
'//----------------------------------------------------------------------------
'// Try to find the standalone installer file and install from it
'//----------------------------------------------------------------------------
' From http://technet.microsoft.com/en-us/library/bb932139.aspx, you can obtain the
' Windows Update Agent stand-alone installer from:
'
' http://go.microsoft.com/fwlink/?LinkID=100334 (WindowsUpdateAgent30-x86.exe)
' http://go.microsoft.com/fwlink/?LinkID=100335 (windowsupdateagent30-x64.exe)
'
' Place these files in the Distribution\Tools\<platform> folder so this script can find them.
sArchitecture = lcase(oEnvironment.Item("Architecture"))
If sArchitecture = "" then
sArchitecture = lcase(EES("%Processor_Architecture%"))
End if
If sArchitecture = "amd64" then
sArchitecture = "x64"
End if
iResult = oUtility.FindFile("WindowsUpdateAgent30-" & sArchitecture & ".exe", strExePath)
If iResult = Success then
oLogging.CreateEntry "About to install updated Windows Update Agent from " & strExePath, LogTypeInfo
iResult = oShell.Run(strExePath & " /quiet /norestart", 0, true)
oLogging.CreateEntry "Windows Update Agent installation return code = " & iResult, LogTypeInfo
VerifyWUA = 3010
Exit Function
End if
oLogging.CreateEntry "Unable to find WindowsUpdateAgent30-" & sArchitecture & ".exe, will attempt to download", LogTypeInfo
'//----------------------------------------------------------------------------
'// Download the Windows Update Agent
'//----------------------------------------------------------------------------
' See http://msdn2.microsoft.com/en-us/library/aa387285.aspx for the basic logic used here.
Dim sWURedistCab, oWUXML, sFileVer1, sFileVer2, sWUDownload
sWURedistCab = InternetFileDownload("http://update.microsoft.com/redist/wuredist.cab")
VerifyCriticalFile sWURedistCab, "wuredist.cab"
' Extract XML File
oUtility.RunWithHeartbeat ees("Expand.exe -r " & sWURedistCab & " -F:wuRedist.xml %temp%")
VerifyCriticalFile "%Temp%\WURedist.xml", "wuRedist.xml"
' Load XML File
Set oWUXML = oUtility.CreateXMLDOMObjectEx(EES("%Temp%\WURedist.xml"))
If oWUXML is nothing then
oLogging.CreateEntry "Failed to load: %Temp%\WURedist.xml" , LogTypeError
VerifyWUA = 1
Exit function
End if
' Get Local File Version
sFileVer1 = oFSO.GetFileVersion ( ees("%SystemRoot%\System32\WUAUENG.DLL" ) )
oLogging.CreateEntry "Current Version %SystemRoot%\System32\WUAUENG.DLL : " & sFileVer1 , LogTypeInfo
' Get New File Version
sFileVer2 = oWUXML.selectSingleNode ("//WURedist/StandaloneRedist/architecture[@name='" & sArchitecture & "']/@clientVersion").Text
oLogging.CreateEntry "Current Version wuredist.cab : " & sFileVer2 , LogTypeInfo
' Download and install if file Versions don't match
If sFileVer1 <> sFileVer2 then
sWUDownload = InternetFileDownload( oWUXML.DocumentElement.selectSingleNode ("//WURedist/StandaloneRedist/architecture[@name='" & sArchitecture & "']/@downloadUrl").Text )
VerifyCriticalFile sWUDownload, "WUDownload.exe"
iResult = oUtility.RunWithHeartbeat(sWUDownload & " /wuforce /quiet /norestart")
VerifyWUA = iResult
Exit Function
End if
' Cleanup
On Error Resume Next
For each item in array ( sWURedistCab, EES("%Temp%\WURedist.xml"), sWUDownload )
If oFSO.FileExists(item) then
oFSO.DeleteFile item
End if
Next
On Error Goto 0
End Function
Function InternetFileDownload( InternetURL )
Dim InternetBuffer
Dim ADODB
Set ADODB = CreateObject("ADODB.Stream")
Set InternetBuffer = CreateObject("Msxml2.XmlHttp")
InternetBuffer.open "GET", InternetURL , false
On Error Resume Next
InternetBuffer.send ""
On Error Goto 0
If InternetBuffer.ReadyState = 4 then
oLogging.CreateEntry "Status: " & InternetBuffer.Status & " " & InternetURL, LogTypeInfo
Else
oLogging.CreateEntry "Ready State : " & InternetBuffer.ReadyState & " " & InternetURL , LogTypeWarning
End if
If InternetBuffer.Status = 200 then
If ADODB.State <> 0 then ADODB.Close
ADODB.Type = 1 '(1=binary,2=Text)
ADODB.Mode = 3 '(1=Read,2=Write,3=RW)
ADODB.Open
ADODB.Write InternetBuffer.ResponseBody
ADODB.SaveToFile EES( "%temp%\" & oFSO.GetFileName(InternetURL) ) , 2
ADODB.Close
End if
If InternetBuffer.Status = 200 then
InternetFileDownload = EES( "%temp%\" & oFSO.GetFileName(InternetURL) )
End if
End function
Function FormatLargeSize( lSize )
Dim i
For i = 1 to len(" KMGTPEZY")
If cdbl(lSize) < 1024 ^ i then
FormatLargeSize = int(cdbl(lSize)/(1024^(i-1))) & " " & mid(" KMGTPEZY",i,1) & "B"
Exit function
End if
next
End function
Function EES ( EnvStr )
EES = oShell.ExpandEnvironmentStrings( EnvStr )
End function
Sub VerifyCriticalFile (FileName, Description)
If FileName = "" or not oFSO.FileExists(ees(FileName)) then
oLogging.CreateEntry Description & " not found: " & FileName , LogTypeError
oLogging.CreateEntry " Most likely cause: No Internet Access or unconfigured Proxy settings!", LogTypeError
oLogging.ReportFailure "Critical file " & FileName & " was not found, aborting", 9906
End if
End sub
End Class
Class Progress
Public Default Function Process
End Function
End Class
</script>
</job>
Raccourcis.ps1
Ce script me permet d'ajouter des raccourcis dans le bureau public de l'ordinateur.
# Raccourci Office.com avec icône
Copy-Item "\\RN-SRV-WDS01.ad.khroners.fr\GPO$\Raccourcis\Office.ico" -Destination "C:\Office.ico"
$TargetFile = "https://www.office.com/"
$shortcutFile = "C:\Users\Public\Desktop\Portail Office Web.lnk"
$WScriptShell = New-Object -ComObject WScript.Shell
$shortcut = $WScriptShell.CreateShortcut($ShortcutFile)
$shortcut.TargetPath = $TargetFile
$shortcut.IconLocation = "C:\Office.ico"
$shortcut.Save()
# Raccourcis suite Microsoft365
Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Word.lnk" -Destination "c:\users\Public\Desktop" -Force
Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Excel.lnk" -Destination "c:\users\Public\Desktop" -Force
Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\PowerPoint.lnk" -Destination "c:\users\Public\Desktop" -Force
Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\OneNote.lnk" -Destination "c:\users\Public\Desktop" -Force
Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Outlook.lnk" -Destination "c:\users\Public\Desktop" -Force
Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Publisher.lnk" -Destination "c:\users\Public\Desktop" -Force
Install_Drivers.ps1
Ce script me permet de télécharger les pilotes via Windows Update.
$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = $Session.CreateUpdateSearcher()
$Searcher.ServiceID = '7971f918-a847-4430-9279-4a52d1efe18d'
$Searcher.SearchScope = 1 # MachineOnly
$Searcher.ServerSelection = 3 # Third Party
$Criteria = "IsInstalled=0 and Type='Driver'"
Write-Host('Searching Driver-Updates...') -Fore Green
$SearchResult = $Searcher.Search($Criteria)
$Updates = $SearchResult.Updates
#Show available Drivers...
$Updates | select Title, DriverModel, DriverVerDate, Driverclass, DriverManufacturer | fl
$UpdatesToDownload = New-Object -Com Microsoft.Update.UpdateColl
$updates | % { $UpdatesToDownload.Add($_) | out-null }
Write-Host('Downloading Drivers...') -Fore Green
$UpdateSession = New-Object -Com Microsoft.Update.Session
$Downloader = $UpdateSession.CreateUpdateDownloader()
$Downloader.Updates = $UpdatesToDownload
$Downloader.Download()
$UpdatesToInstall = New-Object -Com Microsoft.Update.UpdateColl
$updates | % { if($_.IsDownloaded) { $UpdatesToInstall.Add($_) | out-null } }
Write-Host('Installing Drivers...') -Fore Green
$Installer = $UpdateSession.CreateUpdateInstaller()
$Installer.Updates = $UpdatesToInstall
$InstallationResult = $Installer.Install()
if($InstallationResult.RebootRequired) {
Write-Host('Reboot required! please reboot now..') -Fore Red
} else { Write-Host('Done..') -Fore Green }
$updateSvc.Services | ? { $_.IsDefaultAUService -eq $false -and $_.ServiceID -eq "7971f918-a847-4430-9279-4a52d1efe18d" } | % { $UpdateSvc.RemoveService($_.ServiceID) }
RestoreREG.ps1
Ce script permet de restaurer le registre suite à ma modification de ce dernier avant le déploiement : Modifier le registre d... | Docs Khroners
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching /v SearchOrderConfig /t REG_DWORD /d 00000001 /f
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /f
Applications
Liste
Bundle pour installer toutes les applications
Exemple de commande d'installation
MSI
msiexec /I \\ad.khroners.fr\SI$\GPO\Chrome\googlechromestandaloneenterprise64.msi /qn
Si le répertoire où est placé le setup est sur un partage DFS (ou simplement en dehors du DeploymentShare (à vérifier)), il faut qu'une des applications du bundle comprenne le partage dans le champ "Working Directory".
EXE
\\ad.khroners.fr\SI$\GPO\Bitwarden\Bitwarden-Installer-2022.10.1.exe /S /ALLUSERS
Erreur "Verify BCDBootEx" avec MDT
Si vous obtenez l'erreur "Verify BCDBootEx", il faut modifier le fichier LTIApply.wsf dans le dossier scripts du DeploymentShare.
On remplace :
TestAndFail RunBCDBootEx (sDestinationDrive & "\Windows", "/s" & gauche (oBootDrive. Drive, 2) & "/f UEFI"), 5616, "Verify BCDBootEx"
par :
TestAndFail RunBCDBootEx( sDestinationDrive & "\windows", " "), 5616,"Verify BCDBootEx"