Comment détecter à distance Windows a terminé la configuration des correctifs après le redémarrage

10

Nous prévoyons d'automatiser la création de machines virtuelles pour notre infrastructure de génération afin de pouvoir:

  1. Faites évoluer les ressources de build en fonction de la demande, par exemple en ajoutant plus d'agents de build lorsque cela est nécessaire et en les supprimant quand ce n'est pas nécessaire
  2. Recréez tout ou partie de l'environnement de construction si / quand les machines meurent
  3. Dupliquez l'environnement de construction lorsque nous avons besoin d'une configuration de test

L'une des étapes de ce processus consiste à automatiser la création des images de base de la machine virtuelle (dans notre cas, en utilisant Hyper-V). Pour cela, nous avons un script qui:

  1. Crée un nouveau VHDX à partir d'ISO avec le script Convert-WindowsImage . Nous utilisons actuellement Windows 2012R2, mais nous envisageons de commencer 2016 dès qu'il sera disponible.
  2. Ajoute un script sans assistance au nouveau VHDX avec toute la configuration de base dont nous avons besoin
  3. Met à jour le VHDX avec les derniers correctifs Windows à l'aide du script Apply-WindowsUpdate
  4. Crée une nouvelle machine virtuelle Hyper-V basée sur le VHDX et la démarre
  5. Attend le démarrage de la machine virtuelle et attend que le service WinRM soit prêt à accepter les connexions à distance
  6. Attend que Windows termine la configuration initiale et la configuration des nouveaux correctifs
  7. Applique tout autre patch
  8. Redémarre pour terminer la configuration des derniers correctifs
  9. Attend que Windows termine la configuration des correctifs
  10. Envoie un script sysprep à la machine et appelle ce script. Cela exécute sysprep puis éteint la machine
  11. Supprime la machine virtuelle mais conserve le VHDX
  12. Supprime sysprep et les fichiers sans assistance du VHDX, puis compacte le VHDX
  13. Déplace le VHDX à l'emplacement du modèle et le marque en lecture seule

Le problème que nous rencontrons est dans les étapes 6 et 9. Idéalement, nous attendons que toute la configuration soit terminée avant de redémarrer / arrêter la machine, mais il ne semble pas y avoir de moyen de détecter que Windows a terminé la phase de configuration.

Lorsque vous parcourez l'interface utilisateur, il est très clair lorsque l'une ou l'autre étape est terminée car l'interface utilisateur de connexion n'apparaît que lorsque le processus est prêt. Cependant, lorsque vous utilisez WinRM pour vous connecter à distance à la machine, cela est moins clair car WinRM fournit un accès à la machine avant de terminer le travail de configuration.

La question est donc de savoir quel est le moyen le plus infaillible de détecter sur une connexion à distance que Windows a fini de configurer les mises à jour, etc. afin que nous puissions redémarrer / arrêter la machine sans causer de problèmes plus tard.

------ ÉDITER -----

En fin de compte, nous utilisons une version modifiée de la réponse de Katherine dans la mesure où notre script attend windeployet ngense termine également. Étant donné que ngencela ne se termine que bien après la fin de l'initialisation du système d'exploitation, et en bonus, le VHDX final aura tout le framework .NET ngen-ed, ce qui signifie que nous n'avons pas à gérer cela lorsque nous créons de nouveaux VM du disque modèle. Les scripts que nous utilisons pour créer le modèle VHDX et les scripts pour créer l' environnement de test local sont sur github au cas où quelqu'un serait intéressé.

Petrik
la source

Réponses:

6

Cela peut sembler une sorte de réponse étrange, mais ...

Il existe un script PowerShell pour vérifier s'il existe des mises à jour disponibles pour Nagios . Vous pourriez probablement utiliser ce script ou une variante à vos fins, sans Nagios.

Quant à savoir s'ils sont en cours, vérifiez si Wuauclt et TrustedInstaller sont en cours d'exécution ou non. Les conseils de Microsoft sur les mises à jour sur Server Core peuvent vous aider ici :

Selon les mises à jour installées, vous devrez peut-être redémarrer l'ordinateur, bien que le système ne vous en informe pas. Pour déterminer si le processus d'installation est terminé, utilisez le Gestionnaire des tâches pour vérifier que les processus Wuauclt ou Trusted Installer ne s'exécutent pas activement. Vous pouvez également utiliser les méthodes de la section «Affichage des mises à jour installées» pour vérifier la liste des mises à jour installées.

Vous pouvez probablement extraire ces informations avec quelque chose comme Get-Process -Computername YourImage TrustedInstaller.exe. Une fois les processus Wuauclt et TrustedInstaller terminés, le redémarrage devrait être sûr.

Katherine Villyard
la source
Ce script résout le problème d'obtenir des mises à jour et de détecter si un redémarrage est nécessaire, ce qui est un autre problème que nous devrons peut-être résoudre, mais le script ne traite pas de l'attente d'un redémarrage au point où la machine est prête à travailler. .
Petrik
Vous avez commenté pendant que je montais. J'ai ajouté quelques informations sur la détection de cet état dans Server Core, ce qui est proche de le faire à distance.
Katherine Villyard
1
J'étais trop heureux de commenter. J'examinerai la possibilité de rechercher Wuauclt ou TrustedInstaller.
Petrik
J'étais moi-même un peu "hit post" heureux. :)
Katherine Villyard
1
Cette approche a presque fonctionné pour moi, sauf que TrustedInstaller et Wuauclt se terminent avant l'initialisation. Après avoir ajouté windeploy et ngen, le script attend que la machine termine toute l'initialisation (probablement parce que ngen ne se termine que bien après la fin de l'initialisation de la machine).
Petrik
3

Chaque correctif de mise à jour Windows écrit plusieurs événements dans le journal des événements d'installation.

  • ID d'événement 1 - Lancement de modifications pour le package KB ####
  • ID d'événement 4 - Un redémarrage est nécessaire avant que le package KB #### puisse passer à l'état installé
  • ID d'événement 2 - Le package KB #### a été correctement remplacé par l'état Installé

Une façon de déterminer si tous les correctifs ont été appliqués serait de boucler une vérification sur l'ID d'événement 4. Comparez l'heure de cet événement à l'heure actuelle. Si aucun ID d'événement 4 n'a été écrit pendant 5 ou 10 minutes, tous les patches sont probablement terminés et prêts à redémarrer.

Je ne sais pas si vous voulez faire le premier redémarrage lorsque l'installation des correctifs est terminée (event4), ou le deuxième redémarrage après avoir terminé la configuration (événement 2). Ce code fait le premier. Changez simplement le filterHashTable en id d'événement 2 pour l'autre redémarrage avant votre étape 10.

$target = "bart"
$found = $false
while (-not $found) {
    $lastEvent4 = (get-winevent -comp $target -maxEvents 1 -filterHashTable @{ Logname='Setup'; id = '4';}).timeCreated
    if (((get-date) - $lastEvent4).totalMinutes -gt 10) {
        "do reboot"
        restart-computer -comp -$target
        $found = $true
    } else {
        "wait"
        start-sleep 60
    }
}
Clayton
la source
Cela ne fonctionnerait-il pas d'écrire les identifiants de base de connaissances de tous les packages qui commencent à s'installer et de ne se terminer que lorsqu'aucune mise à jour n'est en cours?
Simon Richter
La liste des correctifs va changer chaque mois le mardi. Mettre à jour le processus chaque mois pour utiliser une nouvelle liste serait un point de maintenance continu ... Je pensais que ce que je proposais serait plus simple.
Clayton
1
Je voulais dire comme une extension de votre réponse: lorsque la mise à jour commence à s'installer (événement 1), elle est ajoutée à la liste et supprimée lorsqu'elle signale que c'est fait (événement 4). Avec quelques ajustements (mises à jour échouées, réinitialisation de la liste lors du redémarrage?), Il devrait être possible de déterminer s'il y a toujours une installation en cours.
Simon Richter
Donc, pour une nouvelle installation, il n'y a malheureusement aucune entrée dans le journal des événements. Je n'ai pas essayé d'installer une fois la machine initialisée, mais je suppose que cette approche fonctionnera bien dans ce cas.
Petrik
Nouvelle installation? Confus. Vous avez ici un processus en 13 étapes. Vous avez demandé de l'aide pour les étapes 6 et 9. Votre question était pour "un moyen de détecter que Windows a terminé l'étape de configuration" et non un moyen de commencer le déploiement des correctifs.
Clayton
0

J'ai eu un bon succès avec l'approche suivante: Attendez que Windows modifie le type de démarrage du service Windows Module Installer (aka TrustedInstaller) en Manuel (Demand Start) - après un redémarrage. À ce stade, l'installation des mises à jour est terminée.

Le processus Trusted Installer continue parfois de s'exécuter après l'installation des correctifs? Cependant, le type de démarrage du service est toujours réinitialisé sur Manuel.

Vous pouvez vérifier par vous-même, si l'observation ci-dessus est cohérente / correcte, en consultant les messages du journal des événements précédents et en corrélant les événements entre les journaux système et de configuration.

La modification de démarrage de Windows Module Installer est enregistrée en tant qu'événement système 7040 et est corrélée au dernier événement 2 du journal d'installation, après un redémarrage.

Je pense que lorsque les mises à jour sont installées pour la première fois, ce service est défini sur «Démarrage automatique» au cas où un redémarrage serait nécessaire. Il est remis à «Manuel» lorsque le dernier correctif est installé (indépendamment du fait qu'un redémarrage ait été requis).

Sur certains serveurs, j'ai remarqué que le démarrage du programme d'installation de confiance est rapidement basculé de Manuel à Automatique et inversement, et cela peut se produire toutes les heures environ. Je soupçonne que c'est une application qui vérifie régulièrement les mises à jour. Mais, selon mon expérience, il semble généralement sûr de supposer que si le démarrage est manuel, aucun correctif ne se produit.

ydrol
la source