PowerShell共享权限报表:ConvertTo-HTML/CSV转换失败求助
解决共享权限报表转换为HTML/CSV的问题
我猜你遇到的核心问题是:Get-Acl返回的Access规则是.NET的FileSystemAccessRule对象,这类对象包含很多不可序列化的复杂属性,直接用ConvertTo-HTML/CSV处理的话,要么输出内容混乱,要么直接失败。另外如果你的过滤逻辑没有保留完整的属性结构,也会导致后续转换出错。
下面给你一套可行的解决方案,直接修改你的函数就能解决问题:
第一步:重构Get-Membr函数,提取可序列化属性
我们需要把复杂的.NET对象转换成PowerShell原生的PSCustomObject,只保留我们需要的字段,这样转换工具就能正常识别了:
Function Get-Membr { param( [Parameter(Mandatory=$true)] [string]$UNC ) # 获取共享ACL并过滤目标规则,同时转换为可序列化的自定义对象 $permissionRules = Get-Acl $UNC | Select-Object -ExpandProperty Access | Where-Object { # 这里保留你的原有过滤条件,比如只保留AD组、允许权限等 $_.IdentityReference -match '^YOURDOMAIN\\' -and $_.AccessControlType -eq 'Allow' } | ForEach-Object { # 提取需要的属性,转换成简单的键值对对象 [PSCustomObject]@{ 权限主体 = $_.IdentityReference.Value 权限类型 = $_.AccessControlType.ToString() 权限内容 = $_.FileSystemRights.ToString() 继承规则 = $_.InheritanceFlags.ToString() 传播规则 = $_.PropagationFlags.ToString() } } return $permissionRules }
第二步:添加AD组成员查询逻辑(可选)
如果还需要获取每个AD组的成员,只需要在ForEach-Object里加入AD查询的代码(需要提前加载ActiveDirectory模块):
Function Get-Membr { param( [Parameter(Mandatory=$true)] [string]$UNC ) # 确保加载AD模块 if (-not (Get-Module -Name ActiveDirectory)) { Import-Module ActiveDirectory -ErrorAction Stop } $permissionRules = Get-Acl $UNC | Select-Object -ExpandProperty Access | Where-Object { $_.IdentityReference -match '^YOURDOMAIN\\' -and $_.AccessControlType -eq 'Allow' } | ForEach-Object { # 提取组名(去掉域名前缀) $groupName = $_.IdentityReference.Value -replace '^YOURDOMAIN\\', '' # 查询组内所有成员(递归查询嵌套组) $groupMembers = Get-ADGroupMember -Identity $groupName -Recursive | Select-Object -ExpandProperty Name [PSCustomObject]@{ 权限主体 = $groupName 权限类型 = $_.AccessControlType.ToString() 权限内容 = $_.FileSystemRights.ToString() 继承规则 = $_.InheritanceFlags.ToString() 传播规则 = $_.PropagationFlags.ToString() 组成员 = ($groupMembers -join '; ') } } return $permissionRules }
第三步:正常输出到CSV或HTML
现在函数返回的是标准的PowerShell对象集合,直接用转换cmdlet就能生成正确的文件了:
# 生成报表数据 $report = Get-Membr -UNC "\\YourServer\YourShare" # 输出到CSV $report | ConvertTo-Csv -NoTypeInformation | Out-File "共享权限报表.csv" -Encoding UTF8 # 输出到HTML(带自定义标题和样式) $report | ConvertTo-Html -Title "共享权限及AD组成员报表" -Body "<h1 style='text-align:center'>共享权限明细报表</h1>" | Out-File "共享权限报表.html" -Encoding UTF8
关键注意事项
- 替换代码中的
YOURDOMAIN为你的实际域名 - 运行脚本的账号需要同时拥有读取共享ACL和查询AD组的权限
- 如果不需要递归查询嵌套组,去掉
Get-ADGroupMember的-Recursive参数即可
内容的提问来源于stack exchange,提问作者Urfried Mendes
相关产品推荐
相关产品推荐

