You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用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-PhysicalDiskGet-Volume的健康状态综合判断
  • 若需要完全匹配界面文字,可将上述检测结果整理为对应描述即可

内容的提问来源于stack exchange,提问作者Makoto Aizen Sagara

火山引擎 最新活动