该项目是针对基于Windows的OS的轻巧补丁管理工具。它有助于监视和控制OS的补丁管理。最初是为了帮助基于Windows Virtual Desktop(WVD)解决方案的补丁管理而编写的,但对于其他基于WVD的解决方案或设置也非常有效。 (例如,家庭计算机的补丁管理)
对于基于Windows的工作负载的补丁管理,您通常拥有许多企业级选项。例如,如果WVD补丁管理管理也将System Center Configuration Manager,Windows更新,Windows Update的Windows Update,也可以将其注入基本WVD图像。
但是有时候,也许您没有设置,可以使用上面突出显示的工具。也许您有许多广告域和森林,也许您可能会缺少一些功能,例如报告,仪表板,遥测,仅举几例。
这是您可能从试图满足此类需求的项目中受益的时候。
通常,我们的建议始终是首先查看上面描述的专业解决方案,并且只有当您看到那些专业解决方案的差距时,您可能想检查此开源项目。


遥测数据现在支持来自Azure平台的信息(如果VM在Azure平台内运行)。有关VM元数据的信息,例如Azure VM名称(VMResourCename),资源组名称(ResourceGroupName)和订阅ID(sisscriptionID)。基本上信息定义了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此项目的源代码以不同的焦油/zip格式WVDCUS.zip 。在下载目录中,右键单击文件上的Properties ,并在复选框Unblock上标记。单击OK 。WVDCUS.zip文件的内容提取到WVDCUS目录中。例如进入目录: C:Program FilesWVDCUS Log Analytics Workspace ,在首选区域中,具有唯一名称和付费-as-you-go计划:https://docs.microsoft.com/en-us/azure/azure-monitor/azure-monitor/quick-create-worke-worke-worke-workspace-create-a-workspace-a-workspaceApplication Insights与以前的资源相同的区域,具有唯一名称,具有基于工作空间的选项,然后选择您之前创建的工作区。 https://docs.microsoft.com/en-us/azure/azure-monitor/app/create-workspace-resource-resource#create-workspace-基于基于 - 库Application Insights上,资源单击Overview和复制Instrumentation Key别名Telemetry Key将在以后在配置期间使用。 C:Program FilesWVDCUSWVDCUS.Service.exe.configTelemetryKey并替换内容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-iupdatesearcher-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 Administratorcd C:Program FilesWVDCUSC:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe WVDCUS.Service.exeinstallutil.exe进程失败,请检查安装日志以找出原因。默认情况下,日志与服务可执行文件处于同一文件夹中。WVDCUS.Console.exe ,则installutil.exe将失败。错误是事件日志已通过控制台应用程序注册。如果失败,只需使用Command Bellow(删除事件日志)卸载Windows服务,然后再次安装Windows Service。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操作。ApplyStart
您可以在事件日志中查看有关服务健康,失败和信息消息的详细信息。
eventvwr.msc ,您可以在日志文件中找到详细信息。WVDCUSLog日志。
Windows服务启动并在运行状态下,它将开始生成遥测数据,并将其存储到通过TelemetryKey标识符的配置Application Insights资源中。由于Application Insights资源与在配置过程中的Log Analytics Workspace连接,因此您可能会从Log Analytics Workspace资源中可用的所有功能中受益。有关更多详情
遥测数据被存储为自定义事件,您可能会在customEvents表中找到它们。这使您可以查看和分析所有主机的数据,并从许多角度和指定的时间范围内查看有关补丁管理的当前状态,健康和信息消息。有关更多详情

通过查询和多个观点分析数据是非常强大的功能。但是,对于日常监控,通常需要通过某种报告快速查看主机的整体状态。幸运的是, Log Analytics Workspace资源也具有这样的功能。
您可以在遥测数据上使用自定义查询创建自定义工作簿,并通过相关的视觉表示形式呈现结果。
有关更多详细信息,请参见:https://docs.microsoft.com/en-us/azure/azure-monitor/platform/workbooks-oberview
Application Insights资源,部分WorkbooksCheckForUpdatesIntervalHours设置对齐。当时间范围较低时,您可能看不到任何数据。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/learn/tutorial-response
这是您可以根据条件集创建警报的方式。
Application Insights资源,部分Logs ,关闭窗口和示例查询customEvents表旁边选择Little Eye Icon。See in query editorNew 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 = 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 ,这将触发动作和注意力。
提醒您可以收到的电子邮件以吸引您的注意。
