如何在PowerShell中生成AD域用户及组可访问网络共享的CSV列表?
无需外部工具,用PowerShell即可实现需求
完全可以仅用PowerShell(搭配Active Directory模块)生成符合要求的CSV报告,以下是分步实现方案:
前置准备
- 确保已安装Active Directory模块:Windows Server默认自带,客户端需安装RSAT工具中的AD模块
- 运行脚本的账号需具备:
- 域内用户/组的读取权限
- 目标共享资源的权限查看权限
步骤1:获取域内共享资源并提取权限
先获取所有非系统默认共享(可根据需求调整过滤规则),再提取每个共享的访问权限:
# 导入AD模块 Import-Module ActiveDirectory # 替换为你的域名称 $domainName = "YOUR_DOMAIN" # 获取所有非系统默认共享(过滤ADMIN$、IPC$等) $shares = Get-SmbShare | Where-Object { $_.Name -notin @("ADMIN$", "IPC$", "C$", "D$") } # 遍历共享,提取权限及对应AD对象类型(用户/组) $sharePermissions = foreach ($share in $shares) { $accessRules = Get-SmbShareAccess -Name $share.Name -ErrorAction SilentlyContinue foreach ($rule in $accessRules) { # 仅处理域内对象 if ($rule.AccountName -match "^$domainName\\") { $adObjectName = $rule.AccountName.Split("\")[1] $adObject = Get-ADObject -Filter { Name -eq $adObjectName } -Properties ObjectClass -ErrorAction SilentlyContinue $objectType = if ($adObject) { $adObject.ObjectClass } else { "Unknown" } } else { $objectType = "Local/Non-Domain Object" } [PSCustomObject]@{ ShareName = $share.Name SharePath = $share.Path IdentityName = $rule.AccountName AccessRight = "$($rule.AccessControlType) - $($rule.AccessRight)" ObjectType = $objectType } } }
步骤2:导出基础权限CSV
直接导出所有用户/组的共享权限记录:
$sharePermissions | Export-Csv -Path "AD_Share_Permissions_Base.csv" -NoTypeInformation -Encoding UTF8
这份CSV会包含:共享名称、共享路径、权限主体(用户/组)、权限类型、对象类型。
步骤3:生成用户实际访问权限报告(含组继承)
如果需要获取用户通过直接权限+组继承的所有可访问共享,可使用以下脚本生成用户专属报告:
# 递归获取用户所属的所有嵌套组 function Get-NestedGroups { param([string]$SamAccountName) $adObject = Get-ADUser $SamAccountName -Properties MemberOf -ErrorAction SilentlyContinue if ($adObject) { $groups = $adObject.MemberOf | Get-ADGroup foreach ($group in $groups) { $group # 递归获取组的父组 Get-NestedGroups -SamAccountName $group.SamAccountName } } } # 生成每个用户的完整访问报告 $userAccessReports = foreach ($user in Get-ADUser -Filter *) { # 获取用户所有嵌套组 $userGroups = Get-NestedGroups -SamAccountName $user.SamAccountName | Select-Object -Unique SamAccountName $groupIdentities = $userGroups | ForEach-Object { "$domainName\$_" } # 提取用户直接权限+组继承权限 $directAccess = $sharePermissions | Where-Object { $_.IdentityName -eq "$domainName\$($user.SamAccountName)" -and $_.ObjectType -eq "user" } $groupAccess = $sharePermissions | Where-Object { $_.IdentityName -in $groupIdentities -and $_.ObjectType -eq "group" } # 合并并去重 $allAccess = ($directAccess + $groupAccess) | Select-Object -Unique ShareName, SharePath, AccessRight foreach ($access in $allAccess) { [PSCustomObject]@{ UserName = $user.Name SamAccountName = $user.SamAccountName ShareName = $access.ShareName SharePath = $access.SharePath AccessRight = $access.AccessRight AccessSource = if ($access -in $directAccess) { "Direct Permission" } else { "Group Inheritance" } } } } # 导出用户访问报告 $userAccessReports | Export-Csv -Path "AD_User_Share_Access_Report.csv" -NoTypeInformation -Encoding UTF8
步骤4:生成组专属访问报告
如果需要单独导出组的共享权限记录,可直接过滤基础权限列表:
$groupPermissions = $sharePermissions | Where-Object { $_.ObjectType -eq "group" } $groupPermissions | Export-Csv -Path "AD_Group_Share_Permissions.csv" -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者Kar
相关产品推荐
相关产品推荐

