使用PowerShell结合CSV批量设置用户文件夹权限遇问题求助
批量设置用户文件夹权限问题解决
问题背景
现有如下结构的CSV文件:
user,password,name fcuadrado,P@assword,Paco Cuadrado rita,1234@ASIR,Rita la cantaora ccoton,Asir1234,Carmelo Conton
已通过PowerShell创建本地用户:
foreach ($users in (Import-Csv .\usuarios.csv)){ $securepassword = ConvertTo-SecureString "$users.password" -AsPlainText -Force New-LocalUser -Name $users.user -Password $securepassword -FullName $users.name }
创建用户文件夹:
foreach ($users in (Import-Csv .\usuarios.csv)){ New-Item -Name $users.user -Path C:\users -ItemType Directory }
但执行以下权限设置代码时出现两个问题:
- 循环无法正确获取CSV中的用户信息
- 修复信息获取问题后,所有文件夹权限都被设置给同一个用户
foreach ($users in (Import-Csv .\usuarios.csv)){ $acl = Get-Acl -Path c:\users\$($users.user) $acl.SetAccessRuleProtection($true,$false) $acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null } $ace = New-Object System.Security.Accesscontrol.FileSystemAccessRule ($($users.user), "FullControl", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow") $acl.AddAccessRule($ace) Set-Acl -Path "c:\users\$($users.user)" -AclObject $acl }
问题原因及修复
1. 解决CSV用户信息获取失败问题
原代码中存在参数缺失空格的语法错误,导致PowerShell无法正确解析参数,进而无法读取CSV中的用户信息:
- 创建用户的代码中,
-Name $users.user-Password需改为-Name $users.user -Password - 创建文件夹的代码中,
-Name $users.user-Path需改为-Name $users.user -Path - 权限设置代码中,确保CSV文件名与实际一致(原代码曾混用
usuarios.csv和users.csv,需统一)
2. 解决权限批量设置错误问题
权限被错误分配给同一用户的核心原因:
- 创建
FileSystemAccessRule时,仅使用用户名可能导致身份解析歧义(优先匹配域用户而非本地用户) - 继承标志参数设置不当,导致权限规则未正确应用
修复后的权限设置代码:
foreach ($users in (Import-Csv .\usuarios.csv)){ $userPath = "C:\users\$($users.user)" # 获取目标文件夹的ACL $acl = Get-Acl -Path $userPath # 禁用继承并移除原有继承的权限规则 $acl.SetAccessRuleProtection($true, $false) # 移除所有现有显式权限规则 $acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null } # 构造本地用户的完整身份标识:机器名\用户名 $userIdentity = "$env:COMPUTERNAME\$($users.user)" # 创建权限规则:修正继承传播标志为"None",确保权限直接应用 $ace = New-Object System.Security.AccessControl.FileSystemAccessRule( $userIdentity, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow" ) # 添加权限规则到ACL $acl.AddAccessRule($ace) # 应用更新后的ACL到文件夹 Set-Acl -Path $userPath -AclObject $acl }
关键修复点:
- 使用
$env:COMPUTERNAME\$($users.user)指定本地用户完整身份,避免身份解析错误 - 将继承传播标志从
InheritOnly改为None,确保权限直接应用到目标文件夹及其子项 - 引入
$userPath变量统一路径,减少拼写错误
内容的提问来源于stack exchange,提问作者Sergio Sánchez
相关产品推荐
相关产品推荐

