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

使用PowerShell脚本通过CSV文件导出导入文件夹结构及权限时的AccessControlType转换错误排查求助

解决PowerShell导入文件夹权限的错误问题

嘿,我来帮你搞定这个权限导入的报错!你遇到的问题根源有两个:一是导出脚本没保存权限规则的关键属性(Allow/Deny类型、继承传播标志),二是导入脚本构造FileSystemAccessRule时用错了参数顺序和内容。咱们一步步来修复:

1. 修改导出脚本,补全必要的权限属性

你当前的导出脚本只存了IsInherited这个布尔值,但构造权限规则需要的是AccessControlType(Allow/Deny)、InheritanceFlags和PropagationFlags这三个核心枚举值,IsInherited只是用来判断权限是否继承的标识,不能直接用来创建新规则。

修改后的导出脚本:

$FolderPath = Get-ChildItem -Directory -Path $DriveLetter -Force
$Report = @()
Foreach ($Folder in $FolderPath) {
    # 跳过系统文件夹
    if ($Folder.Name -notlike '*$RECYCLE.BIN*' -and $Folder.Name -notlike '*System Volume Information*') {
        $Acl = Get-Acl -Path $Folder.FullName
        foreach ($Access in $acl.Access) {
            $Properties = [ordered]@{
                'FolderName'        = $Folder.FullName  # 建议存完整路径,避免后续拼接出错
                'IDRef'             = $Access.IdentityReference
                'FSRights'          = $Access.FileSystemRights
                'AccessType'        = $Access.AccessControlType  # 新增:Allow/Deny类型
                'InheritanceFlags'  = $Access.InheritanceFlags  # 新增:继承范围枚举
                'PropagationFlags'  = $Access.PropagationFlags  # 新增:传播行为枚举
                'IsInherited'       = $Access.IsInherited       # 保留继承标识,可选
            }
            $Report += New-Object -TypeName PSObject -Property $Properties
        }
    }
}
$Report | Export-Csv -Path $ExportACL -NoTypeInformation -Encoding UTF8

这里把FolderName改成了$Folder.FullName,后续导入时不用手动拼接路径,避免盘符或父文件夹的拼接错误;如果需要保留相对路径,也可以调整为$Folder.FullName.Replace($DriveLetter, '')。

2. 修改导入脚本,正确构造FileSystemAccessRule

之前的导入脚本错误地把Inherited(布尔值)传给了构造函数,而FileSystemAccessRule的正确构造参数顺序是:
IdentityReference, FileSystemRights, InheritanceFlags, PropagationFlags, AccessControlType

修改后的导入脚本:

# 导入CSV时指定编码,避免乱码
$ACL_Imp = Import-Csv -Path $ExportACL -Encoding UTF8

foreach ($LItem in $ACL_Imp) {
    # 若用相对路径则拼接,用完整路径直接用$LItem.FolderName即可
    $path_full = $Drivepath + $LItem.FolderName
    
    # 保险判断:确保文件夹存在再设置权限
    if (-not (Test-Path $path_full)) {
        Write-Warning "文件夹不存在:$path_full,跳过权限设置"
        continue
    }

    $ACL_Set = Get-Acl $path_full
    
    # 用导出的完整属性构造权限规则参数
    $permissionParams = @(
        $LItem.IDRef,
        $LItem.FSRights,
        $LItem.InheritanceFlags,
        $LItem.PropagationFlags,
        $LItem.AccessType
    )
    
    # 创建并应用权限规则,增加错误捕获
    try {
        $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permissionParams
        $ACL_Set.SetAccessRule($accessRule)
        $ACL_Set | Set-Acl $path_full
        Write-Host "成功设置权限:$path_full -> $($LItem.IDRef)"
    }
    catch {
        Write-Error "设置权限失败:$path_full -> $($LItem.IDRef),错误:$_"
    }
}

3. 错误原因复盘

你之前的导出脚本没保存AccessControlType(Allow/Deny)信息,导入时又错误地把Inherited(TRUE/FALSE)传给了构造函数需要AccessControlType枚举的参数位置,PowerShell无法把TRUE转换成合法的Allow或Deny枚举值,因此抛出了那个错误。

额外注意点

  • 你的CSV示例里有重复的Domain\GRP_A权限,导入时可能会出现重复设置,建议导出前先去重,或者导入时判断是否已存在该权限。
  • 如果新服务器的域环境和旧服务器不一致,IdentityReference(比如Domain\UserA)需要提前做账号映射才能正常识别。
  • 始终指定-Encoding UTF8进行导出/导入,避免中文或特殊字符乱码。

内容的提问来源于stack exchange,提问作者JLV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:37:37