Bagaimana mendeteksi dari jarak jauh windows telah menyelesaikan konfigurasi patch setelah reboot

10

Kami berencana untuk mengotomatisasi pembuatan VM untuk infrastruktur pembangunan kami sehingga kami dapat:

  1. Skala sumber daya bangunan berdasarkan permintaan, misalnya dengan menambahkan lebih banyak agen pembangunan saat diperlukan dan menghapusnya saat tidak diperlukan
  2. Buat kembali semua atau sebagian lingkungan bangunan jika / saat mesin mati
  3. Gandakan lingkungan build saat kami membutuhkan tes

Salah satu langkah dalam proses ini adalah mengotomatiskan pembuatan gambar dasar VM (dalam kasus kami menggunakan Hyper-V). Untuk itu kami memiliki skrip yang:

  1. Membuat VHDX baru dari ISO dengan skrip Convert-WindowsImage . Kami saat ini menggunakan Windows 2012R2 tetapi akan segera memulai 2016 segera setelah tersedia.
  2. Menambahkan skrip tanpa pengawasan ke VHDX baru dengan semua konfigurasi dasar yang kita butuhkan
  3. Memperbarui VHDX dengan tambalan windows terbaru menggunakan skrip Apply-WindowsUpdate
  4. Menciptakan VM Hyper-V baru berdasarkan VHDX dan memulainya
  5. Tunggu VM untuk boot dan menunggu layanan WinRM siap menerima koneksi jarak jauh
  6. Tunggu windows untuk menyelesaikan konfigurasi awal dan konfigurasi patch baru
  7. Menerapkan tambalan lebih lanjut
  8. Reboot untuk menyelesaikan konfigurasi tambalan terbaru
  9. Menunggu windows untuk menyelesaikan konfigurasi tambalan
  10. Dorong skrip sysprep ke mesin dan aktifkan skrip itu. Ini menjalankan sysprep dan kemudian mematikan mesin
  11. Menghapus VM tetapi tetap menggunakan VHDX
  12. Menghapus sysprep dan unattend file dari VHDX dan kemudian memadatkan VHDX
  13. Memindahkan VHDX ke templat lokasi dan tandai sebagai hanya-baca

Masalah yang kita alami adalah pada langkah 6 dan 9. Idealnya kita menunggu semua konfigurasi selesai sebelum kita me-reboot / mematikan mesin, tetapi sepertinya tidak ada cara untuk mendeteksi bahwa windows telah menyelesaikan tahap konfigurasi.

Ketika melewati UI, sangat jelas kapan salah satu langkah dilakukan karena UI login tidak muncul sampai proses siap. Namun ketika menggunakan WinRM untuk terhubung dari jarak jauh ke mesin, ini kurang jelas karena WinRM menyediakan akses ke mesin sebelum dilakukan dengan pekerjaan konfigurasi.

Jadi pertanyaannya adalah apa cara bukti paling bodoh untuk mendeteksi melalui koneksi jarak jauh bahwa Windows telah selesai mengkonfigurasi pembaruan dll. Sehingga kita dapat reboot / mematikan mesin tanpa menyebabkan masalah di kemudian hari.

------ EDIT -----

Pada akhirnya kami menggunakan versi modifikasi dari jawaban Katherine di mana skrip kami juga menunggu windeploydan ngenmenyelesaikan. Mengingat itu ngentidak selesai sampai setelah OS selesai menginisialisasi yang berfungsi, dan sebagai bonus VHDX akhir akan memiliki semua .NET framework ngen-ed yang berarti kita tidak harus berurusan dengan itu ketika kita membuat yang baru VMS disk templat. Kedua skrip yang kami gunakan untuk membuat template VHDX dan skrip untuk membuat lingkungan pengujian lokal ada di github jika ada yang tertarik.

Petrik
sumber

Jawaban:

6

Ini mungkin terdengar seperti jawaban yang aneh, tapi ...

Ada skrip PowerShell untuk memeriksa untuk melihat apakah ada pembaruan yang tersedia untuk Nagios . Anda mungkin dapat menggunakan skrip ini atau varian untuk tujuan Anda, tanpa Nagios.

Mengenai apakah sedang dalam proses, periksa apakah Wuauclt dan TrustedInstaller berjalan atau tidak. Saran Microsoft tentang pembaruan pada Server Core dapat membantu di sini :

Bergantung pada pembaruan yang diinstal, Anda mungkin perlu me-restart komputer, meskipun sistem tidak akan memberi tahu Anda tentang hal ini. Untuk menentukan apakah proses instalasi telah selesai, gunakan Task Manager untuk memverifikasi bahwa proses Wuauclt atau Pemasang Tepercaya tidak berjalan secara aktif. Anda juga dapat menggunakan metode di bagian “Melihat pembaruan yang diinstal” untuk memeriksa daftar pembaruan yang diinstal.

Anda mungkin dapat menarik informasi itu dengan sesuatu seperti Get-Process -Computername YourImage TrustedInstaller.exe. Setelah proses Wuauclt dan TrustedInstaller selesai, aman untuk reboot.

Katherine Villyard
sumber
Script itu memecahkan masalah untuk mendapatkan pembaruan dan mendeteksi jika reboot diperlukan, yang merupakan masalah lain yang mungkin perlu kita selesaikan, tetapi script tidak berurusan dengan menunggu reboot untuk menyelesaikan sampai pada titik di mana mesin siap untuk melakukan pekerjaan .
Petrik
Anda berkomentar saat saya mengedit. Saya menambahkan beberapa info tentang mendeteksi keadaan itu di Server Core, yang hampir melakukannya dari jarak jauh.
Katherine Villyard
1
Aku terlalu senang berkomentar. Saya akan melihat mencari Wuauclt atau TrustedInstaller.
Petrik
Saya menjadi "hit post" kecil sendiri. :)
Katherine Villyard
1
Pendekatan ini hampir berhasil bagi saya, kecuali bahwa TrustedInstaller dan Wuauclt berakhir sebelum inisialisasi dilakukan. Setelah menambahkan windeploy dan ngen script menunggu mesin untuk menyelesaikan semua inisialisasi (mungkin karena ngen tidak menyelesaikan sampai setelah mesin selesai menginisialisasi).
Petrik
3

Setiap tambalan pemutakhiran Windows akan menulis beberapa peristiwa dalam log peristiwa pengaturan.

  • ID Peristiwa 1 - Memulai perubahan untuk paket KB ####
  • ID Peristiwa 4 - Pembaruan diperlukan sebelum paket KB #### dapat diubah ke status terpasang
  • ID Peristiwa 2 - Paket KB #### berhasil diubah ke status Terpasang

Salah satu cara untuk menentukan semua tambalan telah diterapkan adalah dengan mengulang pemeriksaan pada ID Peristiwa 4. Bandingkan waktu acara itu dengan waktu saat ini. Jika tidak ada event ID 4 yang ditulis selama 5 atau 10 menit, maka semua pataches mungkin dilakukan, dan siap untuk reboot.

Saya tidak jelas apakah Anda ingin melakukan reboot pertama ketika patch selesai menginstal (event4), atau reboot kedua setelah selesai mengkonfigurasi (event 2). Kode ini melakukan yang pertama. Cukup ganti filterHashTable ke id acara 2 untuk reboot lain sebelum langkah 10 Anda.

$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
sumber
Tidakkah akan berhasil untuk menuliskan ID KB dari semua paket yang mulai menginstal, dan menganggap penyelesaian hanya ketika tidak ada lagi pembaruan dalam penerbangan?
Simon Richter
Daftar tambalan akan berubah setiap bulan di tambalan Selasa. Memperbarui proses setiap bulan untuk menggunakan daftar baru akan menjadi titik perawatan yang berkelanjutan ... Saya pikir apa yang saya sarankan akan lebih sederhana.
Clayton
1
Maksud saya sebagai ekstensi untuk jawaban Anda: ketika pembaruan mulai menginstal (peristiwa 1), itu ditambahkan ke daftar, dan dihapus ketika melaporkan dilakukan (peristiwa 4). Dengan beberapa penyesuaian (pembaruan yang gagal, reset daftar saat reboot?) Harus dimungkinkan untuk menentukan apakah masih ada instalasi yang sedang berlangsung.
Simon Richter
Jadi untuk instalasi baru tidak ada entri dalam eventlog sayangnya. Saya belum mencoba menginstal setelah mesin diinisialisasi tetapi saya berasumsi bahwa pendekatan ini akan berfungsi dengan baik dalam kasus itu.
Petrik
Instalasi baru? Bingung. Anda punya proses 13 langkah di sini. Anda meminta bantuan dengan langkah 6 dan 9. Pertanyaan Anda adalah untuk "cara mendeteksi bahwa windows telah menyelesaikan tahap konfigurasi" bukan cara untuk memulai penyebaran tambalan.
Clayton
0

Saya telah berhasil dengan pendekatan berikut: Tunggu hingga Windows mengubah jenis startup Layanan Pemasang Modul Windows (alias TrustedInstaller) menjadi Manual (Meminta Mulai) - setelah reboot. Pada saat itu, pembaruan telah selesai diinstal.

Proses Pemasang Tepercaya terkadang terus berjalan setelah tambalan diinstal? Namun jenis layanan mulai masih diatur ulang ke Manual.

Anda dapat memverifikasi sendiri, jika pengamatan di atas konsisten / benar, dengan melihat pesan log peristiwa sebelumnya dan menghubungkan peristiwa antara Sistem dan Pengaturan log.

Perubahan awal untuk Penginstal Modul Windows dicatat sebagai peristiwa Sistem 7040, dan berkorelasi dengan Peristiwa 2 terakhir di log Pengaturan, setelah reboot.

Saya pikir, ketika pembaruan pertama kali diinstal, layanan ini diatur ke 'Auto Start' jika diperlukan reboot. Ini diatur kembali ke 'Manual' ketika tambalan terakhir diinstal (terlepas dari apakah reboot diperlukan).

Pada beberapa server, saya perhatikan bahwa startup Pemasang tepercaya dengan cepat beralih dari Manual ke Otomatis dan kembali, dan ini mungkin terjadi setiap jam atau lebih. Saya menduga itu adalah beberapa aplikasi yang secara teratur memeriksa pembaruan. Tetapi, yang saya alami adalah bahwa secara umum tampaknya aman untuk diasumsikan, jika start-up adalah Manual, maka tidak ada patching yang terjadi.

ydrol
sumber