如何用PowerShell获取指定OU内控制文件共享文件夹访问的组的用户列表
实现方案(PowerShell 脚本)
前置要求
- 运行环境需安装 Active Directory 模块(域控制器默认安装,成员服务器可通过RSAT工具安装)
- 运行账号需拥有fileshare1共享的读取权限、指定OU的AD读取权限、AD组成员查询权限
- 确保fileshare1的路径可以本地访问或通过UNC路径正常访问
操作步骤
1. 定义核心参数
先根据实际环境替换以下变量取值:
# 目标文件共享路径,可使用本地路径或UNC路径 $sharePath = "\\文件服务器地址\fileshare1" # 指定AD组的OU完整路径 $targetOU = "OU=example2,OU=example1,OU=Groups,DC=domain1,DC=domain2,DC=example,DC=uk" # 结果导出路径 $exportPath = "C:\temp\fileshare1权限清单.csv"
2. 获取指定OU下的所有AD安全组
# 提取目标OU下所有安全组,存储为哈希表方便后续匹配 $adGroups = Get-ADGroup -Filter * -SearchBase $targetOU -Properties Name, SamAccountName | Group-Object -AsHashTable -Property SamAccountName
3. 遍历目标共享下所有文件夹的ACL,提取匹配的AD组
# 递归获取所有文件夹的ACL(去掉-Recurse则只扫描根目录文件夹) $folders = Get-ChildItem -Path $sharePath -Directory -Recurse -ErrorAction SilentlyContinue $folderAclResults = @() foreach ($folder in $folders) { $acl = Get-Acl -Path $folder.FullName -ErrorAction SilentlyContinue foreach ($accessRule in $acl.Access) { # 过滤掉非域身份、特殊权限项,只保留存在于目标OU的AD组 $ruleAccount = $accessRule.IdentityReference.Value.Split("\")[-1] if ($adGroups.ContainsKey($ruleAccount)) { $folderAclResults += [PSCustomObject]@{ 文件夹路径 = $folder.FullName 组名称 = $adGroups[$ruleAccount].Name 组SamAccountName = $ruleAccount } } } } # 去重,避免同一个组在同一个文件夹出现多次不同权限条目重复统计 $uniqueGroupFolderPairs = $folderAclResults | Select-Object 文件夹路径,组名称,组SamAccountName -Unique
4. 查询每个匹配组的所有成员(包含嵌套组成员)
$finalResults = @() foreach ($pair in $uniqueGroupFolderPairs) { # 递归获取组内所有用户成员,排除嵌套组本身 $groupMembers = Get-ADGroupMember -Identity $pair.组SamAccountName -Recursive | Where-Object ObjectClass -eq "user" | Get-ADUser -Properties DisplayName, UserPrincipalName foreach ($member in $groupMembers) { $finalResults += [PSCustomObject]@{ 文件夹路径 = $pair.文件夹路径 权限组名称 = $pair.组名称 用户显示名 = $member.DisplayName 用户登录名 = $member.UserPrincipalName 用户SamAccountName = $member.SamAccountName } } } # 导出结果到CSV $finalResults | Export-Csv -Path $exportPath -Encoding UTF8 -NoTypeInformation
结果说明
- 生成的CSV文件包含所需的所有字段:每个文件夹对应的权限组、以及组内所有有访问权限的用户
- 如果不需要扫描子文件夹,删除
Get-ChildItem命令后的-Recurse参数即可 - 脚本默认跳过无权限访问的文件夹,可根据需要调整
ErrorAction参数处理异常
内容的提问来源于stack exchange,提问作者Paul Machin
相关产品推荐
相关产品推荐

