吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 226|回复: 4
收起左侧

[经验求助] 如何批量获取文件夹内2/3/4级子文件夹的权限

[复制链接]
Chanlong 发表于 2024-9-11 23:52
50吾爱币
各位52的技术老师们,如题
如何在Windows环境下,批量获取文件夹内,二三级子文件夹的权限信息(比如哪些Users拥有读,写.管理权限诸如此类)
通过右键属性查找效率很低,尤其是对于加了域控的文件服务器来说读取权限是特别花时间的,
最近因为上级领导要求需要整理所有共享文件夹的权限,这个工作量太庞大了...特此来求助
\\10.X.XX.X\部门文件夹\XX文件\X文件
能获取到最下级文件夹(含继承)权限的明细,可以导出为一个表格的(希望可以自定义导出路径)
由于是WindowsServer做的文件服务器,非群晖
问了下GPT写的批处理脚本都不太满意....
首先是因为中文路径的原因,再加上共享的原因在内
找遍了整个52都没有关于这类软件的资源,特此砌筑万分感谢, 请大佬们支支招

最佳答案

查看完整内容

远程文件夹的不太会玩,我自己尝试重新写了一下,我也扔给AI改了一下 我的是群晖放出来的 http webdav共享文件夹,没成功。我自己点开右键看了一下 我确实也看不到用户权限的设置位置。 代码放在这您试试看可行不,不可行等明天其他大佬来解吧 [mw_shl_code=powershell,true]Add-Type -AssemblyName System.Windows.Forms function Show-FolderBrowserDialog { param ( [string]$Description = "选择文 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Cristy 发表于 2024-9-11 23:52
Chanlong 发表于 2024-9-12 01:06
大佬太牛啦!powershell运行确实有效果!!!不过这对于没有进行映射在本地的共享文件夹作用不大吧?
运行后 ...

远程文件夹的不太会玩,我自己尝试重新写了一下,我也扔给AI改了一下    我的是群晖放出来的 http  webdav共享文件夹,没成功。我自己点开右键看了一下 我确实也看不到用户权限的设置位置。  代码放在这您试试看可行不,不可行等明天其他大佬来解吧


[PowerShell] 纯文本查看 复制代码
Add-Type -AssemblyName System.Windows.Forms
function Show-FolderBrowserDialog {
    param (
        [string]$Description = "选择文件夹",
        [switch]$ShowNewFolderButton = $false
    )
    
    $folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
    $folderBrowser.Description = $Description
    $folderBrowser.ShowNewFolderButton = $ShowNewFolderButton
    $result = $folderBrowser.ShowDialog()
    
    if ($result -eq 'OK') {
        return $folderBrowser.SelectedPath
    } else {
        Write-Host "操作已取消。"
        exit
    }
}
function Show-FileOpenDialog {
    param (
        [string]$Filter = "快捷方式 (*.lnk)|*.lnk",
        [string]$Title = "选择快捷方式"
    )
    
    $openFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $openFileDialog.Filter = $Filter
    $openFileDialog.Title = $Title
    $result = $openFileDialog.ShowDialog()
    
    if ($result -eq 'OK') {
        return $openFileDialog.FileName
    } else {
        Write-Host "操作已取消。"
        exit
    }
}
function Get-FileSystemAcl {
    param (
        [string]$Path
    )
    
    try {
        $acls = Get-Acl -Path $Path
    } catch {
        Write-Warning "获取路径 '$Path' 的 ACL 失败。错误: $_"
        return @()
    }
    
    $permissions = @()
    
    foreach ($access in $acls.Access) {
        $permissions += [PSCustomObject]@{
            文件夹路径     = $Path
            用户            = $access.IdentityReference
            继承            = $access.IsInherited
            完全控制        = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::FullControl
            修改            = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::Modify
            读取和执行      = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::ReadAndExecute
            读取            = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::Read
            写入            = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::Write
            特殊权限        = $access.FileSystemRights -match "Special"
        }
    }
    return $permissions
}
function Connect-NetworkPath {
    param (
        [string]$NetworkPath,
        [PSCredential]$Credential
    )
    
    try {
        
        New-PSDrive -Name "Z" -PSProvider FileSystem -Root $NetworkPath -Credential $Credential -ErrorAction Stop
        Write-Host "成功连接到网络路径: $NetworkPath"
        return $true
    } catch {
        Write-Warning "无法连接到网络路径 '$NetworkPath'。错误: $_"
        return $false
    }
}
function Disconnect-NetworkPath {
    param (
        [string]$DriveName = "Z"
    )
    
    try {
        Remove-PSDrive -Name $DriveName -ErrorAction Stop
        Write-Host "成功断开驱动器: $DriveName"
    } catch {
        Write-Warning "无法断开驱动器 '$DriveName'。错误: $_"
    }
}
function Export-Permissions {
    param (
        [string]$FolderPath
    )
    
    $results = @()
    
    if (-not (Test-Path -Path $FolderPath)) {
        Write-Warning "文件夹路径 '$FolderPath' 不存在。"
        return @()
    }
    try {
        
        $items = Get-ChildItem -Path $FolderPath -Recurse -Directory -Force -ErrorAction Stop
    } catch {
        Write-Warning "访问文件夹 '$FolderPath' 失败。错误: $_"
        return @()
    }
    
    foreach ($item in $items) {
        try {
            $results += Get-FileSystemAcl -Path $item.FullName
        } catch {
            Write-Warning "处理文件夹 '$($item.FullName)' 时出错: $_"
        }
    }
    
    return $results
}
function Get-ShortcutTargetPath {
    param (
        [string]$ShortcutPath
    )
    
    try {
        $shell = New-Object -ComObject WScript.Shell
        $shortcut = $shell.CreateShortcut($ShortcutPath)
        return $shortcut.TargetPath
    } catch {
        Write-Warning "处理快捷方式 '$ShortcutPath' 时出错: $_"
        return $null
    }
}
$credential = Get-Credential
$shortcutPath = Show-FileOpenDialog -Filter "快捷方式 (*.lnk)|*.lnk" -Title "选择快捷方式"
$saveFolder = Show-FolderBrowserDialog -Description "选择保存权限报告的文件夹" -ShowNewFolderButton
Write-Host "保存位置: $saveFolder"
if ($shortcutPath -and (Test-Path -Path $shortcutPath)) {
    $targetPath = Get-ShortcutTargetPath -ShortcutPath $shortcutPath
    
    if ($targetPath) {
        if (Connect-NetworkPath -NetworkPath $targetPath -Credential $credential) {
            $permissionsData = Export-Permissions -FolderPath $targetPath
            $folderName = [System.IO.Path]::GetFileNameWithoutExtension($shortcutPath)
            $exportPath = [System.IO.Path]::Combine($saveFolder, "$folderName-权限报告.csv")
            
            if ($permissionsData) {
                $permissionsData | Export-Csv -Path $exportPath -NoTypeInformation -Encoding UTF8
                Write-Host "权限信息已导出到 $exportPath"
            } else {
                Write-Host "未找到任何权限信息。"
            }
            
            
            Disconnect-NetworkPath
        }
    } else {
        Write-Warning "无法获取快捷方式 '$shortcutPath' 的目标路径。"
    }
} else {
    Write-Warning "快捷方式 '$shortcutPath' 不存在或无效。"
}
Cristy 发表于 2024-9-12 00:58
powershell粘贴 执行 试试

第一个弹窗选被查目录
第二个弹窗选择表格存放目录
[PowerShell] 纯文本查看 复制代码
Add-Type -AssemblyName System.Windows.Forms

$folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$folderBrowser.ShowNewFolderButton = $false
$result = $folderBrowser.ShowDialog()

if ($result -eq 'OK') {
    $rootFolder = $folderBrowser.SelectedPath
} else {
    Write-Host "没有选择源文件夹,脚本结束。"
    exit
}

$saveFolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$saveFolderBrowser.Description = "选择保存权限报告的文件夹"
$saveFolderBrowser.ShowNewFolderButton = $true
$saveResult = $saveFolderBrowser.ShowDialog()

if ($saveResult -eq 'OK') {
    $saveFolder = $saveFolderBrowser.SelectedPath
} else {
    Write-Host "没有选择保存位置,脚本结束。"
    exit
}

function Get-FileSystemAcl {
    param (
        [string]$Path
    )
    
    $acls = Get-Acl -Path $Path
    $permissions = @()
    
    foreach ($access in $acls.Access) {
        $permissions += [PSCustomObject]@{
            路径            = $Path
            用户            = $access.IdentityReference
            继承            = $access.IsInherited
            完全控制        = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::FullControl
            修改            = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::Modify
            读取和执行      = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::ReadAndExecute
            读取            = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::Read
            写入            = $access.FileSystemRights -contains [System.Security.AccessControl.FileSystemRights]::Write
            特殊权限        = $access.FileSystemRights -match "Special"
        }
    }
    return $permissions
}

function Export-Permissions {
    param (
        [string]$FolderPath
    )
    
    $results = @()
    $items = Get-ChildItem -Path $FolderPath -Recurse -Force
    
    foreach ($item in $items) {
        $results += Get-FileSystemAcl -Path $item.FullName
    }
    
    return $results
}

$permissionsData = Export-Permissions -FolderPath $rootFolder

$exportPath = [System.IO.Path]::Combine($saveFolder, '权限报告.csv')
$permissionsData | Export-Csv -Path $exportPath -NoTypeInformation -Encoding UTF8

Write-Host "权限信息已导出到 $exportPath"

免费评分

参与人数 1吾爱币 +1 收起 理由
Chanlong + 1 谢谢@Thanks!

查看全部评分

 楼主| Chanlong 发表于 2024-9-12 01:06
Cristy 发表于 2024-9-12 00:58
powershell粘贴 执行 试试

第一个弹窗选被查目录

大佬太牛啦!powershell运行确实有效果!!!不过这对于没有进行映射在本地的共享文件夹作用不大吧?
运行后发现是选择本地路径的所属文件夹,可否增加一处拖拽?比如我创建共享文件夹的的快捷方式(可能存在七八个的样子)拖拽到.bat脚本上运行那种,是我最想要的.这个对于本地来说效果也是相当优秀了
 楼主| Chanlong 发表于 2024-9-12 08:41
Cristy 发表于 2024-9-12 01:51
远程文件夹的不太会玩,我自己尝试重新写了一下,我也扔给AI改了一下    我的是群晖放出来的 http  webda ...

非常感谢,您的答案非常符合我的需求!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 18:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表