如何用Batch Script或PowerShell自动读取控制面板安全和维护设置
安全和维护配置读取方案:PowerShell/Batch脚本改进与状态获取说明
1. 读取「控制面板>安全和维护>更改安全和维护设置」的配置值(原脚本修正)
原脚本的核心问题是混淆了「功能是否启用」和「该类别的通知是否启用」——「更改安全和维护设置」界面控制的是是否显示对应类别的通知提醒,而非功能本身的开关。以下是修正后的检测方案:
修正思路
该界面的配置存储在用户注册表路径HKCU:\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.SecurityAndMaintenance下,每个DWORD值对应一个类别的通知开关(1=启用通知,0=禁用通知)。
改进后的PowerShell脚本(可直接运行,或嵌入Batch)
# 读取安全和维护通知配置 $configPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.SecurityAndMaintenance" $config = Get-ItemProperty -Path $configPath -ErrorAction SilentlyContinue Write-Host "=== 安全和维护通知配置 ===" # 对应界面的各个选项 $settings = @( @{Name="Windows 更新"; RegKey="WindowsUpdate"}, @{Name="Internet 安全设置"; RegKey="InternetSecurity"}, @{Name="网络防火墙"; RegKey="Firewall"}, @{Name="Microsoft 账户"; RegKey="MicrosoftAccount"}, @{Name="Windows 激活"; RegKey="WindowsActivation"}, @{Name="间谍软件和不需要的软件保护"; RegKey="SpywareProtection"}, @{Name="用户账户控制"; RegKey="UserAccountControl"}, @{Name="病毒保护"; RegKey="VirusProtection"}, @{Name="Windows 备份"; RegKey="WindowsBackup"}, @{Name="自动维护"; RegKey="AutomaticMaintenance"}, @{Name="驱动器状态"; RegKey="DriveStatus"}, @{Name="设备软件"; RegKey="DeviceSoftware"}, @{Name="启动应用"; RegKey="StartupApps"}, @{Name="Windows 疑难解答"; RegKey="WindowsTroubleshooting"}, @{Name="文件历史记录"; RegKey="FileHistory"}, @{Name="存储空间"; RegKey="StorageSpaces"}, @{Name="工作文件夹"; RegKey="WorkFolders"} ) foreach ($setting in $settings) { $regValue = $config.$($setting.RegKey) $status = if ($regValue -eq 1) { "已启用通知" } else { "已禁用通知" } Write-Host "$($setting.Name): $status" }
原脚本的具体问题修正点
- Windows Update:原脚本检测服务运行状态,实际应读取
WindowsUpdate注册表项判断通知开关 - 自动维护:原脚本检测任务状态,实际应读取
AutomaticMaintenance注册表项 - Windows Backup:原脚本检测备份完成状态,实际应读取
WindowsBackup注册表项判断通知开关 - 设备软件/驱动器状态:原脚本检测硬件状态,实际应读取对应注册表项判断通知开关
2. 读取「控制面板>安全和维护」主界面的状态信息
该界面显示的是系统安全和维护的实时状态汇总,没有直接的官方API可以一次性读取界面所有内容,但可以通过拆解每个状态的数据源,用PowerShell逐个获取准确信息,并非无法实现:
核心状态获取方案
Write-Host "=== 安全和维护主界面状态 ===" # 病毒保护状态 $antivirus = Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct -ErrorAction SilentlyContinue $virusStatus = if ($antivirus -and $antivirus.ProductState -band 0x1000) { "已启用" } else { "未启用" } Write-Host "病毒保护: $virusStatus" # Windows Update状态 $wuService = Get-Service wuauserv -ErrorAction SilentlyContinue $updatesAvailable = (Get-WindowsUpdate -ErrorAction SilentlyContinue).Count -gt 0 $wuStatus = if ($wuService.Status -eq "Running") { if ($updatesAvailable) { "有可用更新" } else { "已更新到最新" } } else { "服务未运行" } Write-Host "Windows 更新: $wuStatus" # 网络防火墙状态 $firewallEnabled = (Get-NetFirewallProfile | Where-Object Enabled -eq $true).Count -gt 0 $firewallStatus = if ($firewallEnabled) { "已启用" } else { "未启用" } Write-Host "网络防火墙: $firewallStatus" # 用户账户控制(UAC)状态 $uacValue = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name EnableLUA -ErrorAction SilentlyContinue).EnableLUA $uacStatus = if ($uacValue -eq 1) { "已启用" } else { "已禁用" } Write-Host "用户账户控制: $uacStatus" # 自动维护状态 $maintTask = Get-ScheduledTask -TaskName "Automatic-Maintenance" -ErrorAction SilentlyContinue $maintStatus = if ($maintTask.State -eq "Ready") { "已启用" } else { "未启用" } Write-Host "自动维护: $maintStatus" # 备份状态 $backupConfig = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsBackup" -ErrorAction SilentlyContinue $backupStatus = if ($backupConfig.EnableBackup -eq 1) { "已配置" } else { "未配置" } Write-Host "Windows 备份: $backupStatus"
说明
- 主界面的每个状态都对应系统的具体组件或注册表配置,通过针对性的Cmdlet或注册表读取可以还原界面显示的信息
- 部分状态(如"驱动器状态")需要结合
Get-PhysicalDisk和Get-Volume的健康状态综合判断 - 若需要完全匹配界面文字,可将上述检测结果整理为对应描述即可
内容的提问来源于stack exchange,提问作者Makoto Aizen Sagara




