You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过注册表提取Windows活跃用户的PowerShell脚本输出异常问题

解决注册表提取活跃用户的输出文件问题

问题根源

  • 使用Out-File -Force时,如果在循环/遍历逻辑里逐次写入,每次都会覆盖之前的文件内容,最终只保留最后一条结果。
  • 使用>>追加写入时,不会自动清除文件原有内容,导致新旧数据混杂。

两种可行解决方案

方案1:先收集所有结果,再一次性写入

先把筛选出的所有活跃用户存入变量,最后统一输出到文件,既覆盖旧数据,又保留全部结果:

# 初始化空数组存储结果
$activeUsers = @()

# 从HKLM提取用户相关信息(示例逻辑,根据实际脚本调整)
$hklmUsers = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" | Where-Object { $_.ProfileImagePath -match "Users\\" }

# 遍历HKU项对比筛选活跃用户
foreach ($user in Get-ChildItem "HKU:\" | Where-Object { $_.Name -match "^HKEY_USERS\\S-1-5-21-" }) {
    $sid = $user.Name.Split("\")[-1]
    $matchingHKLM = $hklmUsers | Where-Object { $_.PSChildName -eq $sid }
    if ($matchingHKLM) {
        # 将符合条件的用户信息加入数组
        $activeUsers += [PSCustomObject]@{
            SID  = $sid
            User = ($matchingHKLM.ProfileImagePath -split "\\")[-1]
        }
    }
}

# 一次性写入文件,自动覆盖旧内容
$activeUsers | Out-File -Path "C:\temp\ActiveUsers.txt" -Force

方案2:先清空文件,再追加写入

先手动清空目标文件,再用追加方式写入每条结果:

# 先清空目标文件
$null | Out-File -Path "C:\temp\ActiveUsers.txt" -Force

# 从HKLM提取用户相关信息
$hklmUsers = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" | Where-Object { $_.ProfileImagePath -match "Users\\" }

# 遍历HKU项筛选并追加写入
foreach ($user in Get-ChildItem "HKU:\" | Where-Object { $_.Name -match "^HKEY_USERS\\S-1-5-21-" }) {
    $sid = $user.Name.Split("\")[-1]
    $matchingHKLM = $hklmUsers | Where-Object { $_.PSChildName -eq $sid }
    if ($matchingHKLM) {
        $userName = ($matchingHKLM.ProfileImagePath -split "\\")[-1]
        # 追加写入当前用户信息
        "SID: $sid, 用户: $userName" | Out-File -Path "C:\temp\ActiveUsers.txt" -Append
    }
}

关键说明

  • 方案1更高效,尤其当结果数量较多时,减少了磁盘IO操作。
  • 方案2适合需要实时写入日志类场景,但要确保每次执行前先清空文件。

内容的提问来源于stack exchange,提问作者AALV8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:35:01