使用PowerShell脚本通过CSV文件导出导入文件夹结构及权限时的AccessControlType转换错误排查求助
嘿,我来帮你搞定这个权限导入的报错!你遇到的问题根源有两个:一是导出脚本没保存权限规则的关键属性(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

