이 프로젝트는 Windows 기반 OS 용 경량 패치 관리 도구입니다. OS의 패치 관리를 모니터링하고 제어하는 데 도움이됩니다. Windows 용 패치 관리를 위해 원래 작성하여 WVD (Windows Virtual Desktop) 기반 솔루션을 사용하지만 다른 비 WVD 기반 솔루션 또는 설정에도 잘 작동합니다. (예 : 가족 컴퓨터를위한 패치 관리)
Windows 기반 워크로드의 패치 관리의 경우 일반적으로 많은 엔터프라이즈 레벨 옵션이 있습니다. 예를 들어, 시스템 센터 구성 관리자, Windows For Business, Windows 업데이트, WVD 패치 관리의 경우 기본 WVD 이미지에 주입합니다.
그러나 때로는 위에서 강조 표시된 도구를 사용할 수있는 설정이 없을 수도 있습니다. 어쩌면 많은 광고 도메인과 숲이있을 수 있습니다. 아마도보고, 대시 보드, 원격 측정법과 같은 일부 기능이 누락되었을 수도 있습니다.
이것은 그러한 요구를 해결하려는이 프로젝트의 혜택을 누릴 수 있습니다.
일반적으로, 우리의 권장 사항은 항상 위에서 설명한 전문 솔루션을 먼저 살펴 보는 것이며,이 오픈 소스 프로젝트를 확인할 수있는 전문 솔루션과 관련이있는 경우에만 가능합니다.


원격 측정 데이터는 이제 Azure 플랫폼에서 제공되는 정보를 지원합니다 (VM이 Azure 플랫폼 내부에서 실행되는 경우). Azure VM 이름 (vmresourcename), 리소스 그룹 이름 (ResourceGroupName) 및 구독 ID (SubscriptionId)와 같은 VM 메타 데이터에 대한 정보. 기본적으로 Azure VM이 정의되는 정보.
이를 통해 더 풍부한 필터링 기능을 지원하고 Azure VM 및 이러한 VM이 정의되는 위치를 식별 할 수 있습니다. 이 호스팅 환경이 Azure 플랫폼 내부에서 실행되지 않는 경우, 이러한 정보는 원격 측정 헤더에서 사용할 수 없습니다.
Application Insights 및 Log Analytics Workspace 검색하고 만들 수 있습니다. 필요한 경우 무료 Azure 계정을 만들 수도 있습니다 : https://azure.microsoft.com/en-us/free WVDCUS.zip 모니터링 된 호스트에 배포 해야하는 이진 파일이 포함되어 있습니다.Source code.zip 이 프로젝트의 소스 코드Source code.tar.gz 다른 TAR/ZIP 형식 으로이 프로젝트의 소스 코드WVDCUS.zip 을 다운로드하십시오. 다운로드 디렉토리에서 파일의 Properties 마우스 오른쪽 버튼으로 클릭하고 확인란을 Unblock . OK 클릭하십시오.WVDCUS.zip 파일의 내용을 WVDCUS 디렉토리로 추출하십시오. 예를 들어 디렉토리에 다음과 같습니다. C:Program FilesWVDCUS Log Analytics Workspace 작성하십시오. 고유 한 이름과 지불금 계획 : https://docs.microsoft.com/en-us/azure/azure-monitor/learn/quick-create-workspace#create-a-workspaceApplication Insights 고유 한 이름으로 작업 공간 기반 옵션을 선택하고 이전에 만든 작업 영역을 선택하십시오. https://docs.microsoft.com/en-us/azure/azure-monitor/app/create-workspace-resource#create-workspace 기반-resourceApplication Insights 리소스에서 나중에 구성 중에 사용할 수있는 Overview 및 복사 Instrumentation Key 텔레미트 Telemetry Key 클릭하십시오. C:Program FilesWVDCUSWVDCUS.Service.exe.config 파일을 엽니 다.TelemetryKey 검색하고 컨텐츠 00000000-0000-0000-0000-000000000000 계기 Instrumentation Key 항목의 Application Insights 리소스에서 얻은 값으로 바꾸십시오.CheckForUpdatesIntervalHours 보다 적합한 값으로 변경하십시오. 이 값은 새 업데이트를 자주 확인 해야하는 양을 지정합니다. 기본값은 4 시간이며 유효한 값은 1-590 시간이 될 수 있습니다.UpdatesSearchQuery 의 값을보다 적합한 값으로 변경하십시오. 이 값은 패치의 유형 및 범주를 자동으로 설치 해야하는 범주를 지정합니다. 쿼리 및 매개 변수에 대한 설명은 다음과 같습니다. https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ff357803(v=vs.85) 및 여기서 https://docs.microsoft.com/en-us/windows/win32/api/wuapi/nf-wuapi-wuapi-updatesearcher-searchWVDCUS.Console.exe.config 에 대해 동일한 구성을 반복하십시오
WVDCUS.Console.exe 를 실행하여 응용 프로그램이 올바르게 구성되어 있는지 확인할 수 있습니다. 응용 프로그램 출력의 오류를 확인하십시오. 일부 오류가 표시되면 충분한 권한이 있는지 확인하십시오. 응용 프로그램은 패치를 사용할 수있는 경우 패치를 확인, 다운로드 및 설치할 수 있습니다.
콘솔 애플리케이션으로 구성을 확인한 후에는 Windows 서비스로 실행하려면 응용 프로그램을 등록하여 구성을 마무리 할 수 있습니다. Windows 서비스로 실행하려는 응용 프로그램을 등록하려면 설치된 컴퓨터에 관리자 자격 증명이 있어야합니다. .NET 런타임의 일부인 installutil.exe 도구를 사용해야합니다. 이 도구는 .NET 프레임 워크와 함께 폴더 %windir%Microsoft.NETFramework[64]<framework version> 에 설치됩니다. 예를 들어, 64 비트 버전의 기본 경로는 %windir%Microsoft.NETFramework64v4.0.30319InstallUtil.exe 입니다.
Run as Administrator .cd C:Program FilesWVDCUSC:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe WVDCUS.Service.exe 를 사용하여 등록 프로세스를 실행하십시오installutil.exe 프로세스가 실패하면 설치 로그를 확인하여 이유를 확인하십시오. 기본적으로 로그는 서비스 실행 파일과 동일한 폴더에 있습니다.WVDCUS.Console.exe 이전 - installutil.exe 가 실패합니다. 오류는 이벤트 로그가 콘솔 응용 프로그램에 의해 이미 등록된다는 것입니다. 실패하면 명령 벨로우 (이벤트 로그 제거)로 Windows 서비스를 제거하고 Windows 서비스를 다시 설치하십시오.C:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe /u WVDCUS.Service.exeC:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe WVDCUS.Service.exe 
services.msc 디스플레이 이름 WVDCUS Service 에서 등록 된 Windows 서비스를 찾을 수 있습니다. 서비스 자체의 이름은 WVDCUS 입니다.WVDCUS Service 엽니 다. 복구 탭에서 첫 번째 및 두 번째 실패에 대해 지정된 Restart the Service .Apply 클릭하십시오Start
이벤트 로그의 서비스 건강, 실패, 정보 메시지에 대한 자세한 정보를 볼 수 있습니다.
eventvwr.msc .WVDCUSLog 로그를 검색하십시오.
Windows 서비스가 시작되고 상태가 실행되면 원격 측정 데이터를 생성하고 TelemetryKey 식별자를 통해 프로비저닝 된 Application Insights 리소스에 저장합니다. 프로비저닝 프로세스 중에 Application Insights 리소스가 Log Analytics Workspace 와 연결되어 있으므로 Log Analytics Workspace 리소스에서 사용 가능한 모든 기능을 활용할 수 있습니다. 자세한 내용은 https://docs.microsoft.com/en-us/azure/azure-monitor/log-query/log-query-overview를 참조하십시오
원격 측정 데이터는 사용자 정의 이벤트로 저장되며 customEvents 테이블에서 찾을 수 있습니다. 이를 통해 모든 호스트의 데이터를보고 분석하고 여러 관점 및 지정된 시간 범위에서 패치 관리에 대한 현재 상태, 건강 및 정보 메시지를 볼 수 있습니다. 자세한 내용은 https://docs.microsoft.com/en-us/azure/azure/azure-monitor/log-query/get-started-queries를 참조하십시오

쿼리와 여러 관점을 통해 데이터를 분석하는 것은 매우 강력한 기능입니다. 그러나 매일 모니터링하려면 일반적으로 어떤 종류의 보고서를 통해 호스트의 전체 상태를 신속하게 확인해야합니다. 다행히 Log Analytics Workspace Resource에는 이러한 기능도 있습니다.
원격 측정 데이터를 통해 사용자 정의 쿼리로 사용자 정의 통합 문서를 만들고 관련 시각적 표현을 통해 결과를 렌더링 할 수 있습니다.
자세한 내용은 https://docs.microsoft.com/en-us/azure/azure/azure-monitor/platform/workbooks-overview를 참조하십시오
Application Insights 리소스, 섹션 Workbooks 로 이동하십시오CheckForUpdatesIntervalHours 설정과 정렬되어야합니다. 시간 범위가 낮 으면 데이터가 표시되지 않을 수 있습니다.Run Query 버튼을 클릭하여 최신 데이터에서 차트를 렌더링합니다.Done Editing 버튼을 클릭하십시오.Save 버튼을 클릭하고 통합 문서를 선호하는 이름으로 저장하십시오. 다음에 Workbooks 섹션으로 직접 이동하여 방금 만든 통합 문서를 클릭하여 최신 데이터가있는 보고서를보십시오.
let WVDCUS = customEvents
| where itemType == 'customEvent' and operation_Name == 'WVDCUS.Event';
let WVDCUS_TelemetryStart = WVDCUS
| where name == 'TelemetryStart'
| project MachineName = tostring(customDimensions.MachineName), operation_Id, timestamp, VMResourceName = tostring(customDimensions.VMResourceName), ResourceGroupName = tostring(customDimensions.ResourceGroupName), SubscriptionId = tostring(customDimensions.SubscriptionId)
| summarize arg_max(timestamp, *) by MachineName;
let WVDCUS_Result = WVDCUS_TelemetryStart
| join kind = innerunique customEvents on operation_Id
| where name in ('NoUpdatesAvailable', 'UpdatesInstalledNoUpdates', 'UpdatesNotInstalledFailed', 'UpdatesInstalledRebootRequired', 'UpdatesInstalledAllOK', 'Error')
| extend State=replace(@'NoUpdatesAvailable', @'Up to date', name)
| extend State=replace(@'UpdatesInstalledNoUpdates', @'Up to date', State)
| extend State=replace(@'UpdatesNotInstalledFailed', @'Failed', State)
| extend State=replace(@'UpdatesInstalledRebootRequired', @'Reboot Required', State)
| extend State=replace(@'UpdatesInstalledAllOK', @'Up to date', State)
| extend State=replace(@'Error', @'Error', State)
| project MachineName, Timestamp = timestamp1, State, VMResourceName, ResourceGroupName, SubscriptionId;
WVDCUS_Result
| project MachineName, State, VMResourceName, ResourceGroupName, SubscriptionId
| summarize Count=count() by State
| render piechart;
각 호스트의 현재 상태를 보여주는 보고서를 볼 수도 있습니다. 새로운 보고서 부분으로 생성 된 통합 문서를 확장 할 수 있습니다.
Edit 버튼을 클릭하십시오.Add 버튼이 표시됩니다. 클릭하고 Add Query 선택하십시오.CheckForUpdatesIntervalHours 설정과 정렬되어야합니다. 시간 범위가 낮 으면 데이터가 표시되지 않을 수 있습니다.Run Query 버튼을 클릭하여 최신 데이터의 결과를 확인하십시오.Done Editing 버튼을 클릭하십시오.Save 버튼을 클릭하십시오. let WVDCUS = customEvents
| where itemType == 'customEvent' and operation_Name == 'WVDCUS.Event';
let WVDCUS_TelemetryStart = WVDCUS
| where name == 'TelemetryStart'
| project MachineName = tostring(customDimensions.MachineName), operation_Id, timestamp, VMResourceName = tostring(customDimensions.VMResourceName), ResourceGroupName = tostring(customDimensions.ResourceGroupName), SubscriptionId = tostring(customDimensions.SubscriptionId)
| summarize arg_max(timestamp, *) by MachineName;
let WVDCUS_Result = WVDCUS_TelemetryStart
| join kind = innerunique customEvents on operation_Id
| where name in ('NoUpdatesAvailable', 'UpdatesInstalledNoUpdates', 'UpdatesNotInstalledFailed', 'UpdatesInstalledRebootRequired', 'UpdatesInstalledAllOK', 'Error')
| extend State=replace(@'NoUpdatesAvailable', @'Up to date', name)
| extend State=replace(@'UpdatesInstalledNoUpdates', @'Up to date', State)
| extend State=replace(@'UpdatesNotInstalledFailed', @'Failed', State)
| extend State=replace(@'UpdatesInstalledRebootRequired', @'Reboot Required', State)
| extend State=replace(@'UpdatesInstalledAllOK', @'Up to date', State)
| extend State=replace(@'Error', @'Error', State)
| project MachineName, Timestamp = timestamp1, State, VMResourceName, ResourceGroupName, SubscriptionId;
WVDCUS_Result
| project MachineName, Timestamp, State, VMResourceName, ResourceGroupName, SubscriptionId
아래 그림에 두 부분이 포함 된 결합 된 예제 보고서를 볼 수 있습니다.

마지막으로, 매일 보고서 확인에 관심이 없을 수도 있습니다. 아마도 이것이 실제로 필요한 경우에만하고 싶을 수도 있습니다. 이 경우 일부 호스트가주의를 기울여야한다는 경고 메커니즘의 혜택을 누릴 수 있습니다.
다시 Log Analytics Workspace 이러한 기능이 내장 기능이 있습니다. 자세한 내용은 https://docs.microsoft.com/en-us/azure/azure-monitor/learn/tutorial-response를 참조하십시오
조건 세트에 따라 경고를 만들 수있는 방법은 다음과 같습니다.
Application Insights 리소스, 섹션 Logs , 예제 쿼리가있는 닫기 창으로 이동customEvents 테이블 옆에 작은 눈 아이콘을 선택하십시오.See in query editor 클릭하십시오.New alert rule 버튼을 클릭하십시오Scope 그대로 유지합니다 - Application Insights 인스턴스를 수정하기 위해 지적해야합니다.Condition 섹션에 초점을 맞추고 시간 범위 값을 지정하십시오 -이 값은 CheckForUpdatesIntervalHours 설정과 정렬되어야합니다. 시간 범위가 낮 으면 데이터가 표시되지 않을 수 있습니다.Search query 텍스트 상자에 복사/붙여 넣습니다Number of results 에 따라 경고 로직을 지정하고, Greater than 및 임계 값 0 기본적으로 상태에 Failed 새로운 레코드, Reboot Required , Error 쿼리에 의해 반환되면 경고가 트리거됩니다.Action Group 만들거나 선택해야합니다. 버튼 Select action group 클릭하십시오. 필요한 경우 클릭하여 Create action group . https://docs.microsoft.com/en-us/azure/azure-monitor/platform/action-groups?wt.mc_id=portal-microsoft_azure_monitoring을 참조하십시오.Create alert rule let WVDCUS = customEvents
| where itemType == 'customEvent' and operation_Name == 'WVDCUS.Event';
let WVDCUS_TelemetryStart = WVDCUS
| where name == 'TelemetryStart'
| project MachineName = tostring(customDimensions.MachineName), operation_Id, timestamp, VMResourceName = tostring(customDimensions.VMResourceName), ResourceGroupName = tostring(customDimensions.ResourceGroupName), SubscriptionId = tostring(customDimensions.SubscriptionId)
| summarize arg_max(timestamp, *) by MachineName;
let WVDCUS_Result = WVDCUS_TelemetryStart
| join kind = innerunique customEvents on operation_Id
| where name in ('NoUpdatesAvailable', 'UpdatesInstalledNoUpdates', 'UpdatesNotInstalledFailed', 'UpdatesInstalledRebootRequired', 'UpdatesInstalledAllOK', 'Error')
| extend State=replace(@'NoUpdatesAvailable', @'Up to date', name)
| extend State=replace(@'UpdatesInstalledNoUpdates', @'Up to date', State)
| extend State=replace(@'UpdatesNotInstalledFailed', @'Failed', State)
| extend State=replace(@'UpdatesInstalledRebootRequired', @'Reboot Required', State)
| extend State=replace(@'UpdatesInstalledAllOK', @'Up to date', State)
| extend State=replace(@'Error', @'Error', State)
| project MachineName, Timestamp = timestamp1, State, VMResourceName, ResourceGroupName, SubscriptionId;
WVDCUS_Result
| where State in ('Failed','Reboot Required', 'Error')
| project MachineName, Timestamp, State, VMResourceName, ResourceGroupName, SubscriptionId
이는 일부 호스트가 미국 중 하나에 Failed 되면 Reboot Required 와주의를 Error 야합니다.
관심을 끌기 위해받을 수있는 이메일을 알리십시오.
