通过注册表提取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
相关产品推荐
相关产品推荐

