Come rilevare in remoto Windows ha completato la configurazione della patch dopo il riavvio


10

Stiamo programmando di automatizzare la creazione di macchine virtuali per la nostra infrastruttura di build in modo da poter:

  1. Ridimensionare le risorse di compilazione in base alla domanda, ad esempio aggiungendo più agenti di compilazione quando necessario e rimuovendole quando non sono necessarie
  2. Ricreare tutto o parte dell'ambiente di costruzione se / quando le macchine muoiono
  3. Duplica l'ambiente di compilazione quando abbiamo bisogno di una configurazione di prova

Uno dei passaggi di questo processo è l'automazione della creazione delle immagini di base della macchina virtuale (nel nostro caso utilizzando Hyper-V). Per questo abbiamo una sceneggiatura che:

  1. Crea nuovo VHDX da ISO con lo script Convert-WindowsImage . Attualmente stiamo utilizzando Windows 2012 R2 ma cercheremo di iniziare con il 2016 non appena sarà disponibile.
  2. Aggiunge uno script automatico al nuovo VHDX con tutta la configurazione di base di cui abbiamo bisogno
  3. Aggiorna il VHDX con le ultime patch di Windows usando lo script Apply-WindowsUpdate
  4. Crea una nuova VM Hyper-V basata sul VHDX e la avvia
  5. Attende l'avvio della macchina virtuale e attende che il servizio WinRM sia pronto per accettare le connessioni remote
  6. Attende che Windows completi la configurazione iniziale e la configurazione delle nuove patch
  7. Applica ulteriori patch
  8. Riavvia per completare la configurazione delle ultime patch
  9. Attende che Windows completi la configurazione delle patch
  10. Invia uno script sysprep alla macchina e invoca quello script. Questo esegue sysprep e quindi spegne la macchina
  11. Elimina la VM ma mantiene il VHDX
  12. Rimuove i file sysprep e incustoditi dal VHDX e quindi compatta il VHDX
  13. Sposta VHDX nella posizione del modello e contrassegna come sola lettura

Il problema che stiamo riscontrando è nei passaggi 6 e 9. Idealmente attendiamo che tutta la configurazione sia completa prima di riavviare / spegnere la macchina, ma non sembra esserci un modo per rilevare che Windows ha terminato la fase di configurazione.

Quando si esegue l'interfaccia utente è molto chiaro quando viene eseguita una delle due fasi poiché l'interfaccia utente di accesso non viene visualizzata fino a quando il processo non è pronto. Tuttavia, quando si utilizza WinRM per connettersi in remoto alla macchina, ciò è meno chiaro poiché WinRM fornisce l'accesso alla macchina prima che venga eseguita con il lavoro di configurazione.

Quindi la domanda è qual è il modo più infallibile per rilevare su una connessione remota che Windows ha terminato la configurazione degli aggiornamenti ecc. In modo che possiamo riavviare / spegnere la macchina senza causare problemi in seguito.

------ MODIFICARE -----

Alla fine stiamo usando una versione modificata della risposta di Katherine in quanto anche il nostro script attende windeploye si ngencompleta. Dato che ngennon si completa fino a quando il sistema operativo non ha terminato l'inizializzazione che funziona, e come bonus il VHDX finale avrà tutto il framework .NET ngen-ed, il che significa che non dovremo occuparcene quando creeremo nuovi VM del disco modello. Sia lo script che usiamo per creare il modello VHDX sia gli script per creare l' ambiente di test locale sono su github nel caso qualcuno fosse interessato.

Risposte:


6

Potrebbe sembrare una specie di risposta strana, ma ...

C'è uno script di PowerShell per controllare se ci sono aggiornamenti disponibili per Nagios . Probabilmente potresti usare questo script o una variante per i tuoi scopi, senza Nagios.

Per sapere se sono in corso, controlla se Wuauclt e TrustedInstaller sono in esecuzione. I consigli di Microsoft sugli aggiornamenti su Server Core potrebbero essere di aiuto qui :

A seconda degli aggiornamenti installati, potrebbe essere necessario riavviare il computer, anche se il sistema non lo notificherà. Per determinare se il processo di installazione è stato completato, utilizzare Task Manager per verificare che i processi Wuauclt o Trusted Installer non siano in esecuzione attivamente. È inoltre possibile utilizzare i metodi nella sezione "Visualizzazione degli aggiornamenti installati" per controllare l'elenco degli aggiornamenti installati.

Probabilmente puoi estrarre queste informazioni con qualcosa del genere Get-Process -Computername YourImage TrustedInstaller.exe. Al termine dei processi Wuauclt e TrustedInstaller, il riavvio dovrebbe essere sicuro.


Tale script risolve il problema di ottenere aggiornamenti e rilevare se è necessario un riavvio, che è un altro problema che potrebbe essere necessario risolvere, ma lo script non si occupa di attendere il completamento del riavvio fino al punto in cui la macchina è pronta per funzionare .
Petrik,

Hai commentato mentre stavo modificando. Ho aggiunto alcune informazioni sul rilevamento di quello stato in Server Core, che è vicino a farlo da remoto.
Katherine Villyard,

1
Ero troppo commentato felice. Daremo un'occhiata alla ricerca di Wuauclt o TrustedInstaller.
Petrik,

Ero un po '"hit post" felice me stesso. :)
Katherine Villyard,

1
Questo approccio ha funzionato quasi per me, tranne per il fatto che sia TrustedInstaller che Wuauclt terminano prima dell'inizializzazione. Dopo aver aggiunto windeploy e ngen, lo script attende che la macchina completi tutta l'inizializzazione (probabilmente perché ngen non viene completata fino a quando la macchina non ha terminato l'inizializzazione).
Petrik,

3

Ogni patch di aggiornamento di Windows scriverà diversi eventi nel registro eventi di installazione.

  • ID evento 1: avvio delle modifiche per il pacchetto KB ####
  • ID evento 4: è necessario riavviare prima che il pacchetto KB #### possa essere modificato nello stato installato
  • ID evento 2 - Il pacchetto KB #### è stato modificato correttamente nello stato Installato

Un modo per determinare l'applicazione di tutte le patch sarebbe quello di eseguire un controllo su ID evento 4. Confrontare l'ora di quell'evento con l'ora corrente. Se non è stato scritto nessun ID evento 4 per 5 o 10 minuti, probabilmente tutti i pataches sono stati eseguiti e pronti per il riavvio.

Non sono chiaro se si desidera eseguire il primo riavvio al termine dell'installazione delle patch (evento4) o il secondo riavvio al termine della configurazione (evento 2). Questo codice fa il primo. È sufficiente modificare filterHashTable in id evento 2 per l'altro riavvio prima del passaggio 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
    }
}

Non funzionerebbe annotare gli ID KB di tutti i pacchetti che iniziano l'installazione e assumerne il completamento solo quando non ci sono più aggiornamenti in volo?
Simon Richter,

L'elenco delle patch cambierà ogni mese nella patch martedì. Aggiornare il processo ogni mese per utilizzare un nuovo elenco sarebbe un punto di manutenzione in corso ... Pensavo che ciò che avevo suggerito sarebbe stato più semplice.
Clayton,

1
Intendevo come estensione della tua risposta: quando l'aggiornamento inizia l'installazione (evento 1), viene aggiunto all'elenco e rimosso quando viene segnalato (evento 4). Con alcune modifiche (aggiornamenti non riusciti, reimpostazione dell'elenco durante il riavvio?) Dovrebbe essere possibile determinare se è ancora in corso un'installazione.
Simon Richter,

Sfortunatamente, per una nuova installazione non ci sono voci nel registro eventi. Non ho provato a installare dopo che la macchina è stata inizializzata, ma presumo che questo approccio funzionerà bene in quel caso.
Petrik,

Nuova installazione? Confuso. Hai un processo in 13 passaggi qui. Hai chiesto assistenza per i passaggi 6 e 9. La tua domanda era "un modo per rilevare che Windows ha terminato la fase di configurazione" e non un modo per iniziare la distribuzione di patch.
Clayton,

0

Ho avuto un buon successo con il seguente approccio: attendere fino a quando Windows non cambia il tipo di avvio del servizio di installazione del modulo di Windows (aka TrustedInstaller) in manuale (avvio richiesta) - dopo un riavvio. A quel punto, gli aggiornamenti hanno completato l'installazione.

Il processo di installazione affidabile a volte continua a essere eseguito dopo l'installazione delle patch? Tuttavia, il tipo di avvio del servizio viene comunque reimpostato su Manuale.

Puoi verificare tu stesso, se l'osservazione di cui sopra è coerente / corretta, guardando i messaggi del registro eventi precedenti e correlando gli eventi tra i registri di sistema e di installazione.

La modifica all'avvio di Windows Module Installer viene registrata come evento di sistema 7040 e si correla con l'ultimo evento 2 nel registro di installazione, dopo un riavvio.

Penso che quando gli aggiornamenti vengono installati per la prima volta, questo servizio è impostato su "Avvio automatico" nel caso in cui sia necessario un riavvio. Viene ripristinato su "Manuale" quando è installata l'ultima patch (indipendentemente dal fatto che sia necessario un riavvio).

Su alcuni server, ho notato che l'avvio affidabile dell'installer passa rapidamente da Manuale a Automatico e viceversa, e questo può accadere ogni ora circa. Ho il sospetto che sia qualche applicazione che verifica regolarmente la presenza di aggiornamenti. Ma, secondo la mia esperienza, in genere sembra sicuro supporre che, se l'avvio è manuale, non si verificano patch.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.