能否通过PowerShell临时获取Windows所有文件夹所有权以运行校验和脚本?
问题:PowerShell扫描C盘特定文件时权限拒绝的解决方案
我需要运行PowerShell脚本生成C盘下所有特定扩展名(.bat、.com)文件的MD5校验和,现有脚本如下:
Get-ChildItem -Path 'C:\' -Recurse -Include ('*.bat, *.com') -File | Get-FileHash -Algorithm MD5 |Export-Csv -Path 'C:\folder\hashes.csv' -NoTypeInformation | Format-List脚本运行时出现多个权限拒绝错误,例如访问
C:\Program Files\Windows Defender Advanced Threat Protection\Classification\Configuration等路径被拒绝。已知这是缺乏文件夹所有权导致的,尝试添加set-executionpolicy remotesigned语句无效果。由于生产扫描的特性,无法手动逐个获取并归还所有权,请问能否通过PowerShell临时获取这些文件夹所有权,完成校验和生成后再归还?
解决方案
1. 先修正原脚本的参数错误
原脚本的-Include参数格式有误,应该用数组形式'*.bat', '*.com'而非合并成单个字符串,否则会错误匹配文件名包含*.bat, *.com的文件。修正后的基础扫描脚本(可跳过无权限文件快速执行):
Get-ChildItem -Path 'C:\' -Recurse -Include '*.bat', '*.com' -File -ErrorAction SilentlyContinue | Get-FileHash -Algorithm MD5 | Export-Csv -Path 'C:\folder\hashes.csv' -NoTypeInformation
注:-ErrorAction SilentlyContinue会忽略权限错误并跳过对应文件,适合不需要完整扫描的场景。
2. 临时获取所有权并自动归还的完整脚本
要实现临时获取权限、扫描后自动归还所有权,可借助系统自带的takeown.exe和icacls.exe工具,结合PowerShell的错误捕获机制处理无权限文件。以下是可直接运行的完整脚本:
# 配置扫描参数 $targetExtensions = '*.bat', '*.com' $outputCsvPath = 'C:\folder\hashes.csv' $scanResults = @() # 先扫描可直接访问的文件,捕获权限错误路径 Get-ChildItem -Path 'C:\' -Recurse -Include $targetExtensions -File ` -ErrorVariable accessDeniedFiles -ErrorAction SilentlyContinue | ForEach-Object { $scanResults += Get-FileHash -Path $_.FullName -Algorithm MD5 } # 处理权限被拒的文件:临时获取所有权→扫描→归还权限 foreach ($errorEntry in $accessDeniedFiles) { if ($errorEntry.Exception -is [System.UnauthorizedAccessException]) { $filePath = $errorEntry.TargetObject $originalOwner = $null try { # 获取文件原始所有者信息 $fileAcl = Get-Acl -Path $filePath -ErrorAction Stop $originalOwner = $fileAcl.Owner # 临时获取所有权并授予管理员完全权限 takeown /F $filePath /A | Out-Null icacls $filePath /grant Administrators:F | Out-Null # 计算MD5并加入结果集 $fileHash = Get-FileHash -Path $filePath -Algorithm MD5 $scanResults += $fileHash } catch { Write-Warning "无法处理文件 $filePath : $_" } finally { # 无论扫描成功与否,归还原始所有权并移除临时权限 if ($originalOwner) { icacls $filePath /setowner $originalOwner | Out-Null icacls $filePath /remove Administrators:F | Out-Null } } } } # 导出所有扫描结果到CSV $scanResults | Export-Csv -Path $outputCsvPath -NoTypeInformation
核心说明
- 必须以管理员身份运行脚本,否则
takeown和icacls无法执行权限变更操作 - 使用
-ErrorVariable捕获权限错误的文件路径,避免脚本中途中断 finally块确保无论扫描成功与否,都会尝试归还原始所有者权限,避免权限遗留问题- 仅对确实无权限的文件执行权限变更,减少对系统权限的影响
内容的提问来源于stack exchange,提问作者Sigshane
相关产品推荐
相关产品推荐

