返回

Win Cmd & PowerShell: 列出文件/文件夹及其权限

windows

列出文件、文件夹及其权限

获取文件和文件夹的完整列表,同时包含访问权限,是进行系统管理和安全审计的关键步骤。在 Windows 的命令行环境(cmd)中,dir 命令虽然可以列出文件和文件夹,但并不直接提供权限信息。这里介绍两种主要方法来实现这一目标。

使用 icacls 命令

icacls(Integrated Access Control List)是 Windows 中一个强大的命令行工具,专门用于显示和修改文件、文件夹的访问控制列表。结合 for 循环和 dir 命令,可以逐个处理每个文件和文件夹,并获取其权限信息。

操作步骤:

  1. 构建基础命令: 利用 dir /b /s 获取所有文件和文件夹的路径, /b 表示只输出文件名或文件夹名, /s 表示包括子目录。

  2. 结合 for 循环: 使用 for /f 命令逐行读取 dir 命令的输出。
    for /f "delims=" %i in ('dir /b /s') do ... 将每一个文件或文件夹的路径赋值给变量 %i。注意在批处理脚本(.bat 文件)中,应使用 %%i

  3. 使用 icacls 获取权限: 对每个路径执行 icacls "%i"。这会输出该文件或文件夹的完整权限信息,包括用户或组,以及其被赋予的具体权限。

  4. 合并输出:dir 的结果和 icacls 的结果合并输出,通常需要将输出重定向到文本文件进行保存,以便于后续分析。

代码示例:

@echo off
(
for /f "delims=" %%i in ('dir /b /s') do (
echo File/Folder: %%i
icacls "%%i"
echo.
)
) > output.txt
echo Complete, saved to output.txt

原理分析:

icacls 命令提供了细粒度的访问控制信息。其输出包含所有对目标文件或文件夹有访问权限的用户和组,并显示其被授予的权限类型,比如读、写、执行、完全控制等。
通过 for 循环,icacls 可以遍历每个目标并逐一收集信息。

额外说明:

  • 输出的 output.txt 文件内容会较多,适合在完成大量文件的处理时使用, 方便查找。
  • icacls 命令的输出信息比较详细,但是格式不如表格友好。若需格式化输出,可配合 PowerShell 脚本使用。
  • 对大型目录结构运行这个脚本时,处理时间可能比较长。建议事先了解整个操作的预期时长, 避免意外中断。

使用 PowerShell 的 Get-Acl

PowerShell 提供了更强大和更易于操作的访问控制列表管理功能,通过 Get-Acl 命令可以轻松获取文件或文件夹的访问权限信息。配合 PowerShell 的管道(|)功能,可以进行更复杂的数据处理和筛选。

操作步骤:

  1. 获取文件和文件夹列表: 使用 Get-ChildItem -Path "your_directory" -Recurse 来获取目标文件夹(your_directory需要替换成具体路径)下所有子文件夹和文件。参数 -Recurse 可以保证包含子目录。

  2. 循环获取 ACL: 使用 foreach 循环遍历每一个子项目, 每一个项目通过管道 | 输入给 Get-Acl 来获得该对象的访问权限控制列表。
    foreach ($item in Get-ChildItem -Path "your_directory" -Recurse){ ... }

  3. 提取权限信息: $item | Get-Acl 会获得 Access 属性, 可以将拥有者、用户、权限等属性解析出来。

  4. 格式化输出: 使用 Powershell 可以方便地生成不同格式的输出,方便后期使用。 常见的例如 Select 命令用于选择特定属性。

  5. 保存结果: 将输出结果管道至 Export-Csv 命令可以将数据输出成CSV格式的文件。

代码示例:

Get-ChildItem -Path "C:\YourDirectory" -Recurse | ForEach-Object {
    $acl = Get-Acl $_.FullName
    $owner = $acl.Owner
    Write-Host "File/Folder: $($_.FullName)"
    Write-Host "Owner: $owner"

    $acl.Access | Select IdentityReference, FileSystemRights, AccessControlType | ForEach-Object {
        Write-Host  "    User/Group: $($_.IdentityReference) , Rights: $($_.FileSystemRights),  Access Type: $($_.AccessControlType)"
       }

      Write-Host " "
   } | Out-File -FilePath  "output.txt"

原理分析:

Get-Acl 返回一个 Access Control List(访问控制列表)对象。该对象包含了与目标相关的访问权限的所有信息,如所有者、每个访问控制项,并包含了授权信息如被赋予的权限类型。

通过使用 Select IdentityReference, FileSystemRights, AccessControlType 可以更方便地筛选需要的信息。这种方法使得处理大型数据集,获取每个对象以及对应的用户和权限更为有效。
结合 -OutFile 或者 Export-Csv 可以生成方便后期使用的结果文件。

额外说明:

  • PowerShell 命令能进行更灵活的操作,也更加适合做自动化任务。
  • 脚本中的 “C:\YourDirectory” 需要替换为实际的文件夹路径。
  • Powershell 可以格式化输出CSV文件,更易于做数据处理,方便后续导入数据库等操作。
  • 为了增加可读性,使用Write-Host来区分每个文件或文件夹的访问控制列表信息。
  • 使用Out-File来方便保存输出内容。

两种方法各有侧重:icacls 方法简洁快速,适合对少量文件进行快速查询;而 PowerShell 方法更强大,适合大规模文件和复杂权限管理。根据具体需求选择合适的方法即可。理解这些工具的工作原理可以帮助更好地管理和保护文件系统的安全。