基于CSV用PowerShell创建AD用户:组添加与P盘映射问题
解决AD用户创建脚本的两个问题:组添加与个人共享文件夹映射
现有脚本的问题反馈
- CSV分隔符错误:你的CSV文件使用制表符作为列分隔符,但脚本中用了
-Delimiter ";",会导致Import-CSV无法正确解析列数据,需改为-Delimiter "t"`。 - 缺少用户添加到AD组的逻辑
- 缺少个人共享文件夹创建与映射的逻辑
解决方案实现
1. 添加用户到对应AD组
根据用户的Fonction字段,预先定义职位与AD组的映射关系,创建用户后自动将其添加到对应组。
2. 创建个人共享文件夹并映射P盘
- 在指定服务器路径下创建用户专属文件夹
- 配置NTFS权限(用户完全控制、管理员完全控制)
- 共享文件夹
- 通过AD用户属性设置自动映射P盘(无需额外登录脚本)
修改后的完整脚本
$CSVFile = "C:\Users\Utilisateurs.csv" # 修正CSV分隔符为制表符 $CSVData = Import-CSV -Path $CSVFile -Delimiter "`t" -Encoding UTF8 # 定义职位与AD组的映射(根据实际组名修改) $groupMapping = @{ "ingénieur SI" = "Groupe_Ingenieurs_SI" "Technicien" = "Groupe_Techniciens" "Dev" = "Groupe_Developpeurs" "agent" = "Groupe_Agents" } # 定义共享文件夹根路径(根据实际服务器路径修改) $shareRoot = "\\Serveur-AD\Partages\Utilisateurs" Foreach($Utilisateur in $CSVData){ $UtilisateurPrenom = $Utilisateur.Prenom.Trim() $UtilisateurNom = $Utilisateur.Nom.Trim() $UtilisateurLogin = ($UtilisateurPrenom).Substring(0,1) + "." + $UtilisateurNom $UtilisateurEmail = "$UtilisateurLogin@axeplane.loc" $UtilisateurMotDePasse = "IT-Axeplane@2020" $UtilisateurFonction = $Utilisateur.Fonction.Trim() $OU = $Utilisateur.Ou.Trim() # Vérifier la présence de l'utilisateur dans l'AD if (Get-ADUser -Filter {SamAccountName -eq $UtilisateurLogin} -ErrorAction SilentlyContinue) { Write-Warning "L'identifiant $UtilisateurLogin existe déjà dans l'AD" continue } else { # 创建AD用户 New-ADUser -Name "$UtilisateurNom $UtilisateurPrenom" ` -DisplayName "$UtilisateurNom $UtilisateurPrenom" ` -GivenName $UtilisateurPrenom ` -Surname $UtilisateurNom ` -SamAccountName $UtilisateurLogin ` -UserPrincipalName "$UtilisateurLogin@axeplane.loc" ` -EmailAddress $UtilisateurEmail ` -Title $UtilisateurFonction ` -Path $OU ` -AccountPassword (ConvertTo-SecureString $UtilisateurMotDePasse -AsPlainText -Force) ` -ChangePasswordAtLogon $true ` -Enabled $true Write-Output "Création de l'utilisateur : $UtilisateurLogin ($UtilisateurNom $UtilisateurPrenom)" # 获取刚创建的用户对象 $user = Get-ADUser -Identity $UtilisateurLogin # 1. 添加用户到对应AD组 $groupName = $groupMapping[$UtilisateurFonction] if ($groupName) { try { Add-ADGroupMember -Identity $groupName -Members $user -ErrorAction Stop Write-Output "Ajout de $UtilisateurLogin au groupe $groupName" } catch { Write-Warning "Échec de l'ajout au groupe $groupName : $_" } } else { Write-Warning "Aucun groupe associé à la fonction : $UtilisateurFonction" } # 2. 创建个人共享文件夹并映射P盘 $userFolder = Join-Path -Path $shareRoot -ChildPath $UtilisateurLogin # 创建文件夹(如果不存在) if (-not (Test-Path -Path $userFolder)) { try { New-Item -Path $userFolder -ItemType Directory -ErrorAction Stop | Out-Null Write-Output "Création du dossier personnel : $userFolder" } catch { Write-Warning "Échec de la création du dossier : $_" continue } } # 设置NTFS权限 try { $acl = Get-Acl -Path $userFolder # 添加用户完全控制权限 $userAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "$UtilisateurLogin", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow" ) $acl.AddAccessRule($userAccessRule) # 添加管理员完全控制权限 $adminAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "BUILTIN\Administrators", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow" ) $acl.AddAccessRule($adminAccessRule) Set-Acl -Path $userFolder -AclObject $acl -ErrorAction Stop Write-Output "Configuration des permissions NTFS pour $userFolder" } catch { Write-Warning "Échec de la configuration des permissions : $_" } # 共享文件夹(如果未共享) if (-not (Get-SmbShare -Name $UtilisateurLogin -ErrorAction SilentlyContinue)) { try { New-SmbShare -Name $UtilisateurLogin -Path $userFolder -FullAccess "$UtilisateurLogin", "BUILTIN\Administrators" -ErrorAction Stop Write-Output "Partage du dossier : $UtilisateurLogin -> $userFolder" } catch { Write-Warning "Échec du partage du dossier : $_" } } # 设置AD用户自动映射P盘 try { Set-ADUser -Identity $user -HomeDrive "P:" -HomeDirectory $userFolder -ErrorAction Stop Write-Output "Configuration du disque P: pour $UtilisateurLogin -> $userFolder" } catch { Write-Warning "Échec de la configuration du disque P: : $_" } } }
关键说明
- 组映射:修改
$groupMapping中的组名为你的实际AD组名称 - 共享路径:修改
$shareRoot为你的实际服务器共享根路径 - 权限配置:脚本中设置了用户和管理员的完全控制权限,可根据需求调整
- 自动映射P盘:通过
Set-ADUser设置HomeDrive和HomeDirectory,用户登录时系统会自动映射P盘,无需额外登录脚本 - 错误处理:添加了
try/catch和-ErrorAction参数,避免单个步骤失败导致整个脚本中断
内容的提问来源于stack exchange,提问作者Joe H
相关产品推荐
相关产品推荐

