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

能否通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:39:59