Cách phát hiện từ xa windows đã hoàn tất cấu hình bản vá sau khi khởi động lại


10

Chúng tôi dự định tự động hóa việc tạo VM cho cơ sở hạ tầng xây dựng của chúng tôi để chúng tôi có thể:

  1. Quy mô tài nguyên xây dựng dựa trên nhu cầu, ví dụ: bằng cách thêm nhiều tác nhân xây dựng khi được yêu cầu và loại bỏ chúng khi không cần thiết
  2. Tái tạo tất cả hoặc một phần của môi trường xây dựng nếu / khi máy chết
  3. Sao y môi trường xây dựng khi chúng tôi cần thiết lập thử nghiệm

Một trong những bước trong quy trình này là tự động hóa việc tạo các hình ảnh cơ sở VM (trong trường hợp của chúng tôi là sử dụng Hyper-V). Cho rằng chúng tôi có một kịch bản:

  1. Tạo VHDX mới từ ISO với tập lệnh Convert-WindowsImage . Chúng tôi hiện đang sử dụng Windows 2012R2 nhưng sẽ tìm cách bắt đầu với năm 2016 ngay khi có sẵn.
  2. Thêm một tập lệnh không giám sát vào VHDX mới với tất cả cấu hình cơ bản chúng ta cần
  3. Cập nhật VHDX với các bản vá windows mới nhất bằng cách sử dụng tập lệnh Apply-WindowsUpdate
  4. Tạo một Hyper-V VM mới dựa trên VHDX và khởi động nó
  5. Chờ VM khởi động và đợi dịch vụ WinRM sẵn sàng chấp nhận kết nối từ xa
  6. Chờ các cửa sổ hoàn tất cấu hình ban đầu và cấu hình của các bản vá mới
  7. Áp dụng bất kỳ bản vá nào nữa
  8. Khởi động lại để hoàn thành cấu hình của các bản vá mới nhất
  9. Chờ các cửa sổ hoàn tất cấu hình các bản vá
  10. Đẩy tập lệnh sysprep vào máy và gọi tập lệnh đó. Điều này chạy sysprep và sau đó tắt máy
  11. Xóa VM nhưng vẫn giữ VHDX
  12. Loại bỏ các tập tin sysprep và unattend khỏi VHDX và sau đó thu gọn VHDX
  13. Di chuyển VHDX đến vị trí mẫu và đánh dấu là chỉ đọc

Vấn đề chúng tôi gặp phải là ở bước 6 và 9. Lý tưởng nhất là chúng tôi đợi tất cả cấu hình hoàn tất trước khi chúng tôi khởi động lại / tắt máy nhưng dường như không có cách nào để phát hiện các cửa sổ đã kết thúc giai đoạn cấu hình.

Khi đi qua UI, rất rõ ràng khi một trong hai bước được thực hiện vì UI đăng nhập không hiển thị cho đến khi quá trình sẵn sàng. Tuy nhiên, khi sử dụng WinRM để kết nối từ xa với máy thì điều này không rõ ràng vì WinRM cung cấp quyền truy cập vào máy trước khi nó được thực hiện với công việc cấu hình.

Vì vậy, câu hỏi đặt ra là cách chứng minh ngu ngốc nhất để phát hiện qua kết nối từ xa mà Windows đã hoàn tất cấu hình các bản cập nhật, v.v ... để chúng tôi có thể khởi động lại / tắt máy mà không gây ra sự cố sau này.

------ BIÊN TẬP -----

Cuối cùng, chúng tôi đang sử dụng một phiên bản sửa đổi của câu trả lời của Kinda trong đó kịch bản của chúng tôi cũng đang chờ windeployngenhoàn thành. Cho rằng điều ngenđó không hoàn thành cho đến khi hệ điều hành hoàn thành việc khởi tạo hoạt động và như một phần thưởng, VHDX cuối cùng sẽ có tất cả .NET framework ngen-ed, điều đó có nghĩa là chúng ta không phải đối phó với điều đó khi chúng ta tạo mới VM của đĩa mẫu. Cả hai tập lệnh mà chúng tôi sử dụng để tạo mẫu VHDX và tập lệnh để tạo môi trường kiểm tra cục bộ đều có trên github trong trường hợp có ai quan tâm.

Câu trả lời:


6

Điều này nghe có vẻ giống như một câu trả lời kỳ lạ, nhưng ...

Có tập lệnh PowerShell để kiểm tra xem có bản cập nhật nào cho Nagios không . Bạn có thể có thể sử dụng tập lệnh này hoặc một biến thể cho mục đích của mình mà không cần Nagios.

Về việc họ có đang tiến hành hay không, hãy kiểm tra xem Wuauclt và TrustedInstaller có đang chạy hay không. Lời khuyên của Microsoft về các bản cập nhật trên Server Core có thể giúp tại đây :

Tùy thuộc vào các bản cập nhật được cài đặt, bạn có thể cần phải khởi động lại máy tính, mặc dù hệ thống sẽ không thông báo cho bạn về điều này. Để xác định xem quá trình cài đặt đã hoàn tất chưa, hãy sử dụng Trình quản lý tác vụ để xác minh rằng các quy trình Wuauclt hoặc Trusted Installer không hoạt động. Bạn cũng có thể sử dụng các phương thức trong phần Cập nhật cài đặt Cập nhật phần cài đặt để xem danh sách các bản cập nhật đã cài đặt.

Bạn có thể có thể kéo thông tin đó với một cái gì đó như Get-Process -Computername YourImage TrustedInstaller.exe. Sau khi cả hai quá trình Wuauclt và TrustedInstaller kết thúc, việc khởi động lại sẽ an toàn.


Kịch bản đó giải quyết vấn đề nhận cập nhật và phát hiện nếu cần phải khởi động lại, đây là một vấn đề khác chúng ta có thể cần giải quyết, nhưng kịch bản không giải quyết được việc chờ khởi động lại để hoàn thành công việc mà máy đã sẵn sàng để làm việc .
Petrik

Bạn nhận xét trong khi tôi đang chỉnh sửa. Tôi đã thêm một số thông tin về việc phát hiện trạng thái đó trong Server Core, gần như thực hiện nó từ xa.
Kinda Villyard

1
Tôi đã được bình luận quá hạnh phúc. Tôi sẽ xem xét việc tìm kiếm Wuauclt hoặc TrustedInstaller.
Petrik

Bản thân tôi đã được một chút "hit post" hạnh phúc. :)
Kinda Villyard

1
Cách tiếp cận này gần như có hiệu quả đối với tôi, ngoại trừ cả TrustedInstaller và Wuauclt đều chấm dứt trước khi quá trình khởi tạo được thực hiện. Sau khi thêm Windeploy và ngen, tập lệnh chờ máy hoàn tất tất cả khởi tạo (có thể vì ngen không hoàn thành cho đến khi máy hoàn tất khởi tạo).
Petrik

3

Mỗi bản vá cập nhật Windows sẽ ghi một số sự kiện trong Nhật ký sự kiện thiết lập.

  • ID sự kiện 1 - Bắt đầu thay đổi cho gói KB ####
  • ID sự kiện 4 - Cần khởi động lại trước khi gói KB #### có thể được thay đổi thành trạng thái đã cài đặt
  • ID sự kiện 2 - Gói KB #### đã được thay đổi thành công sang trạng thái Đã cài đặt

Một cách để xác định tất cả các bản vá đã được áp dụng là lặp lại kiểm tra ID sự kiện 4. So sánh thời gian của sự kiện đó với thời gian hiện tại. Nếu không có ID sự kiện nào được viết trong 5 hoặc 10 phút, thì tất cả các thao tác có thể đã được thực hiện và sẵn sàng khởi động lại.

Tôi không rõ nếu bạn muốn thực hiện khởi động lại lần đầu tiên khi cài đặt xong các bản vá lỗi (event4) hoặc lần khởi động lại thứ hai sau khi chúng được cấu hình xong (sự kiện 2). Mã này làm trước đây. Chỉ cần thay đổi bộ lọcHashTable thành sự kiện id 2 để khởi động lại khác trước bước 10 của bạn.

$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
    }
}

Sẽ không hoạt động để ghi lại ID KB của tất cả các gói bắt đầu cài đặt và chỉ giả sử hoàn thành khi không có thêm bản cập nhật nào trong chuyến bay?
Simon Richter

Danh sách các bản vá sẽ thay đổi mỗi tháng vào bản vá vào thứ ba. Cập nhật quy trình mỗi tháng để sử dụng danh sách mới sẽ là một điểm bảo trì liên tục ... Tôi nghĩ những gì tôi đề xuất sẽ đơn giản hơn.
Clayton

1
Ý tôi là phần mở rộng cho câu trả lời của bạn: khi bản cập nhật bắt đầu cài đặt (sự kiện 1), nó sẽ được thêm vào danh sách và xóa khi báo cáo xong (sự kiện 4). Với một số điều chỉnh (cập nhật thất bại, thiết lập lại danh sách trong khi khởi động lại?) Có thể xác định liệu có còn cài đặt đang diễn ra hay không.
Simon Richter

Vì vậy, đối với một cài đặt mới, không có mục nào trong eventlog không may. Tôi chưa thử cài đặt sau khi máy đã khởi tạo nhưng tôi cho rằng phương pháp này sẽ hoạt động tốt trong trường hợp đó.
Petrik

Cài đặt mới? Bối rối. Bạn đã có một quá trình 13 bước ở đây. Bạn đã yêu cầu trợ giúp với các bước 6 và 9. Câu hỏi của bạn là "cách phát hiện các cửa sổ đã kết thúc giai đoạn cấu hình" không phải là cách để bắt đầu triển khai các bản vá.
Clayton

0

Tôi đã thành công tốt đẹp với cách tiếp cận sau: Đợi cho đến khi Windows thay đổi loại khởi động của Dịch vụ cài đặt mô-đun Windows (còn gọi là TrustedInstaller) thành Thủ công (Bắt đầu theo yêu cầu) - sau khi khởi động lại. Tại thời điểm đó, cập nhật đã hoàn tất cài đặt.

Quá trình cài đặt đáng tin cậy đôi khi tiếp tục chạy sau khi các bản vá đã được cài đặt? Tuy nhiên, loại khởi động dịch vụ vẫn được đặt lại thành Thủ công.

Bạn có thể tự xác minh, nếu quan sát trên là nhất quán / chính xác, bằng cách xem các thông báo nhật ký sự kiện trước đó và các sự kiện tương quan giữa nhật ký Hệ thống và Cài đặt.

Thay đổi khởi động cho Windows Module Installer được ghi lại dưới dạng sự kiện Hệ thống 7040 và nó tương quan với Sự kiện 2 cuối cùng trong nhật ký Cài đặt, sau khi khởi động lại.

Tôi nghĩ rằng, khi các bản cập nhật được cài đặt lần đầu tiên, dịch vụ này được đặt thành 'Tự động bắt đầu' trong trường hợp cần khởi động lại. Nó được đặt lại thành 'Thủ công' khi bản vá cuối cùng được cài đặt (bất kể có yêu cầu khởi động lại hay không).

Trên một số máy chủ, tôi nhận thấy rằng khởi động Trình cài đặt đáng tin cậy nhanh chóng được chuyển từ Thủ công sang Tự động và quay lại và điều này có thể xảy ra mỗi giờ hoặc lâu hơn. Tôi nghi ngờ đó là một số ứng dụng thường xuyên kiểm tra cập nhật. Nhưng, theo kinh nghiệm của tôi, nó thường có vẻ an toàn khi giả định, nếu khởi động là Thủ công, thì không có bản vá nào xảy ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.