PowerShell设置用户文件夹FullControl权限报错:身份引用无法转换
解决PowerShell设置文件夹ACL时的身份识别错误
错误原因
报错Some or all identity references could not be translated.是因为系统无法将你传入的用户标识符转换为有效的安全主体,大概率是CSV里的用户格式不对,或者用户在当前域/系统中不存在。
解决步骤
- 修正CSV用户格式:必须使用
域名\用户名或者UPN格式(user@domain.com),不能只写单独的用户名,比如把jdoe改成CONTOSO\jdoe。 - 验证用户有效性:在循环里添加用户存在性检查,避免无效用户导致报错。
- 修复UNC路径:你的文件夹路径
\ypdcwnwinfs001\H$\Home少了一个反斜杠,应该写成\\ypdcwnwinfs001\H$\Home,否则PowerShell会识别为相对路径。 - 清理冗余的ACL操作:代码里同时调用了
SetAccessRule和AddAccessRule,选一个即可——SetAccessRule会替换用户的现有权限,AddAccessRule是追加权限,重复调用会导致逻辑混乱。 - 完善权限规则参数:添加继承和传播设置,确保权限能正确应用到子文件夹和文件。
修改后的完整代码
# Import the CSV file $csvFilePath = "C:\path\folders.csv" $folders = Import-Csv -Path $csvFilePath # Loop through each row in the CSV foreach ($folder in $folders) { # 修正UNC路径格式 $folderPath = "\\ypdcwnwinfs001\H$\Home\" + $folder.FolderName # 创建文件夹(-Force会自动创建父目录) New-Item -ItemType Directory -Path $folderPath -Force # 获取当前文件夹ACL $acl = Get-Acl -Path $folderPath $user = $folder.users # 验证用户身份是否有效 try { $ntAccount = [System.Security.Principal.NTAccount]$user $sid = $ntAccount.Translate([System.Security.Principal.SecurityIdentifier]) Write-Host "用户 $user 身份验证成功" } catch { Write-Error "用户 $user 不存在或格式错误:$_" continue # 跳过无效用户的文件夹权限设置 } # 定义权限参数 $permission = "FullControl" $accessType = "Allow" # 添加继承和传播设置:容器和对象都继承,不传播到父项 $inheritanceFlags = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit $propagationFlags = [System.Security.AccessControl.PropagationFlags]::None # 创建完整的访问规则 $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule( $user, $permission, $inheritanceFlags, $propagationFlags, $accessType ) # 添加权限规则(替换用SetAccessRule,追加用AddAccessRule,二选一) $acl.AddAccessRule($accessRule) # 应用更新后的ACL Set-Acl -Path $folderPath -AclObject $acl Write-Host "已成功为文件夹 $folderPath 分配 $user 的FullControl权限" }
额外注意事项
- 如果是域环境,确保运行脚本的机器已加入域,且有权限查询AD用户(可以用
Get-ADUser $user替代Translate方法来验证,需要先导入AD模块:Import-Module ActiveDirectory)。 - 检查共享路径
\\ypdcwnwinfs001\H$\Home是否能正常访问,运行脚本的账号需要有该路径的读写权限。
内容的提问来源于stack exchange,提问作者Ryan Almadin
相关产品推荐
相关产品推荐

