怎么用脚本获取启动设置(含代码示例与常见问答)
目录导读
- 什么是启动设置,为什么要用脚本获取?
- 适用场景:Windows、macOS、Linux三大系统脚本方案
- 核心方法一:Windows注册表与WMI脚本
- 核心方法二:Linux / macOS 启动项扫描脚本
- 常见问题与问答精选
- 脚本安全与优化建议
什么是启动设置,为什么要用脚本获取?
启动设置(Startup Settings)指的是操作系统或应用程序在开机、用户登录或特定服务启动时自动运行的程序、服务、计划任务或配置项,常见的启动项包括:系统服务、用户登录启动程序、注册表 Run 键、Launchd 守护进程等。

为什么要用脚本获取?
手动检查启动设置非常繁琐,尤其在企业运维、安全审计或系统优化场景下,需要批量管理多台机器,脚本能够快速扫描、导出并分析启动项,帮助发现恶意软件、冗余程序或配置异常。
核心价值:
- 批量提取多台设备的启动项
- 监控启动项变更(用于入侵检测)
- 清理无效启动项,提升系统启动速度
适用场景:三大系统脚本方案总览
| 操作系统 | 主要启动设置位置 | 推荐脚本语言 |
|---|---|---|
| Windows | 注册表、启动文件夹、计划任务、服务 | PowerShell、VBScript |
| Linux | ~/.bashrc、rc.local、systemd、init.d | Shell (bash) |
| macOS | Login Items、LaunchAgents、LaunchDaemons | Shell (zsh) + plist 解析 |
每个系统均提供原生工具或API,无需第三方软件即可完成扫描。
核心方法一:Windows 注册表与WMI脚本
1 使用PowerShell获取启动项
PowerShell是Windows最强大的脚本工具,可直接读取注册表与WMI。
示例:获取当前用户启动项
# 获取当前用户注册表Run键 Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" # 获取所有用户的Run键 Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run"
示例:获取所有计划任务中的启动任务
Get-ScheduledTask | Where-Object {$_.Settings.AllowStartIfOnBatteries -eq $true}
示例:输出为CSV报告
$startupInfo = @()
# 注册表扫描
$regPaths = @(
"HKCU:\Software\Microsoft\Windows\CurrentVersion\Run",
"HKLM:\Software\Microsoft\Windows\CurrentVersion\Run"
)
foreach ($path in $regPaths) {
$items = Get-ItemProperty -Path $path -ErrorAction SilentlyContinue
foreach ($property in $items.PSObject.Properties) {
if ($property.Name -notin @('PSPath','PSParentPath','PSChildName','PSDrive','PSProvider')) {
$startupInfo += [PSCustomObject]@{
Source = $path
Name = $property.Name
Path = $property.Value
}
}
}
}
# 启动文件夹扫描
$userStartup = [Environment]::GetFolderPath('Startup')
Get-ChildItem $userStartup | ForEach-Object {
$startupInfo += [PSCustomObject]@{
Source = "StartupFolder"
Name = $_.Name
Path = $_.FullName
}
}
$startupInfo | Export-Csv -Path "startup_report.csv" -NoTypeInformation
2 使用VBScript(旧系统兼容)
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
strRegKey = "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\"
strValue = objShell.RegRead(strRegKey & "YourStartupName")
If IsNull(strValue) Then
WScript.Echo "Not Found"
Else
WScript.Echo strValue
End If
核心方法二:Linux / macOS 启动项扫描脚本
1 Linux – 检查systemd与rc.local
#!/bin/bash
# 获取所有systemd启用服务
systemctl list-unit-files --type=service --state=enabled --no-pager
# 检查rc.local(传统init系统)
if [ -f /etc/rc.local ]; then
cat /etc/rc.local | grep -v "^#" | grep -v "^$"
fi
# 检查用户级启动项 (~/.bashrc, ~/.config/autostart)
echo "=== User autostart ==="
ls -la ~/.config/autostart/ 2>/dev/null
cat ~/.bashrc 2>/dev/null | grep -E "^[a-zA-Z]"
2 macOS – 获取Login Items与LaunchAgents
#!/bin/zsh
# 获取系统登录项(通过AppleScript)
osascript -e 'tell application "System Events" to get the name of every login item'
# 检查LaunchAgents目录
echo "=== LaunchAgents (user) ==="
ls ~/Library/LaunchAgents/*.plist 2>/dev/null
echo "=== LaunchDaemons (system) ==="
ls /Library/LaunchDaemons/*.plist 2>/dev/null
# 分析plist内容(提取ProgramArguments)
for plist in ~/Library/LaunchAgents/*.plist; do
echo "--- $(basename $plist) ---"
/usr/libexec/PlistBuddy -c "Print :ProgramArguments" "$plist" 2>/dev/null
done
常见问题与问答精选
Q1: 脚本执行时提示权限不足怎么办?
A: 很多启动设置(如HKLM注册表、systemd全局服务、LaunchDaemons)需要管理员权限运行,请以管理员身份运行PowerShell,或使用 sudo 执行Linux/macOS脚本。
Q2: 如何检测启动项是否被篡改?
A: 可结合 哈希比对 或 时间戳监控,先运行一次脚本生成基准报告(如 startup_baseline.csv),后续定期运行并对比差异,PowerShell的 Compare-Object 可直接比较CSV。
Q3: 脚本能否获取第三方软件的隐藏启动项?
A: 某些恶意软件会通过计划任务、WMI事件订阅或驱动方式启动,建议使用 Sysinternals Autoruns(免费工具)或 注册表实时监控 作为补充,脚本可扫描 HKLM\SYSTEM\CurrentControlSet\Services 下所有服务。
Q4: 在macOS中如何让脚本自动提取所有用户的Login Items?
A: 由于macOS权限模型限制,需逐个用户目录扫描,可使用 dscl . -list /Users 获取用户列表,再依次检查 ~/Library/Preferences/com.apple.loginitems.plist,但注意现代macOS需通过 userdefaults 命令。
Q5: 脚本执行后如何生成可视化报告?
A: 将输出导出为CSV后,可用Python(pandas+matplotlib)或PowerShell的 ConvertTo-Html 生成HTML仪表板。
$startupInfo | ConvertTo-Html -Title "启动项报告" | Out-File report.html
脚本安全与优化建议
- 避免删除关键系统服务:脚本输出仅供分析,删除操作前请手动确认。
- 日志记录:每次执行写入日志文件(如
startup_scan_$(Get-Date -Format yyyyMMdd).log)。 - 跨平台统一管理:若管理多系统,可考虑用 Ansible 或 Puppet 下发脚本,统一收集结果。
- 性能优化:WMI查询在大量机器上可能较慢,可改用CIM(PowerShell Core)或限制同时执行线程数。
最终建议:将脚本保存为 .ps1 或 .sh 文件,并加入参数化支持(如 -Scope User 或 -ExportPath),方便重复使用与自动化运维。
提示:实际生产环境中,请结合具体的安全策略与合规要求,避免泄露敏感配置信息。