You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:40:39