使用PowerShell创建AD用户:基于部门与位置配置多OU路径变量
AD用户创建脚本:结合部门与位置动态生成OU路径的优化方案
核心思路:用哈希表替代冗余的If-Else判断
原脚本的If-Else分支过多,新增位置或部门时需要大量修改代码。推荐用嵌套哈希表来映射「位置-部门」对应的OU结构,既简洁又易扩展。
方案实现步骤
- 定义OU映射规则
先把不同位置的基础OU、各部门对应的OU名称整理成嵌套哈希表,后续新增位置/部门只需要在表中添加条目即可:
# 定义位置与部门的OU映射表 $ouMapping = @{ "LDN" = @{ DepartmentOUs = @{ "IT" = "OU=IT" "Finance" = "OU=Finance" "Sales" = "OU=Sales" "HR" = "OU=HR" "Client Services" = "OU=Client Services" } BaseOU = "OU=London (LDN),OU=Europe,OU=Company Staffing,DC=testcompany,DC=local" DefaultOU = "OU=London (LDN),OU=Europe,OU=Company Staffing,DC=testcompany,DC=local" } "NY" = @{ DepartmentOUs = @{ "IT" = "OU=IT" "Finance" = "OU=Finance" # 可按需添加纽约其他部门的OU映射 } BaseOU = "OU=New York (NY),OU=North America,OU=Company Staffing,DC=testcompany,DC=local" DefaultOU = "OU=New York (NY),OU=North America,OU=Company Staffing,DC=testcompany,DC=local" } }
- 动态生成OU路径
根据用户的$Office和$Department变量,从映射表中匹配对应的OU片段,拼接成完整路径:
# 先获取当前位置的映射配置 $locationConfig = $ouMapping[$Office] if (-not $locationConfig) { # 如果位置未定义,默认用伦敦配置 $locationConfig = $ouMapping["LDN"] } # 匹配部门对应的OU,不存在则用默认OU $departmentOU = $locationConfig.DepartmentOUs[$Department] if ($departmentOU) { $OU = "$departmentOU,$($locationConfig.BaseOU)" } else { $OU = $locationConfig.DefaultOU }
- 修正原脚本的语法问题
原脚本存在两处错误:
- 使用了中文引号(
“IT”),PowerShell无法识别,需改为英文双引号"IT" - Sales和HR的OU路径里多了一个逗号(
DC=testcompany,,DC=local),需删除多余逗号
完整修改后的脚本示例
# 定义OU映射表 $ouMapping = @{ "LDN" = @{ DepartmentOUs = @{ "IT" = "OU=IT" "Finance" = "OU=Finance" "Sales" = "OU=Sales" "HR" = "OU=HR" "Client Services" = "OU=Client Services" } BaseOU = "OU=London (LDN),OU=Europe,OU=Company Staffing,DC=testcompany,DC=local" DefaultOU = "OU=London (LDN),OU=Europe,OU=Company Staffing,DC=testcompany,DC=local" } "NY" = @{ DepartmentOUs = @{ "IT" = "OU=IT" "Finance" = "OU=Finance" } BaseOU = "OU=New York (NY),OU=North America,OU=Company Staffing,DC=testcompany,DC=local" DefaultOU = "OU=New York (NY),OU=North America,OU=Company Staffing,DC=testcompany,DC=local" } } # 假设这里已获取用户的Office和Department变量(示例值) $Office = "NY" $Department = "IT" # 生成OU路径 $locationConfig = $ouMapping[$Office] ?? $ouMapping["LDN"] $departmentOU = $locationConfig.DepartmentOUs[$Department] $OU = if ($departmentOU) { "$departmentOU,$($locationConfig.BaseOU)" } else { $locationConfig.DefaultOU } # 创建AD用户 New-ADUser ` -Department $Department ` -Name "$Firstname $Surname" ` -UserPrincipalName $UPN ` -Path $OU ` -GivenName $FirstName ` -Surname $Surname ` -SamAccountName "$FirstName.$Surname" ` -AccountPassword (Read-Host -AsSecureString "Input User Password") ` -ChangePasswordAtLogon $False ` -Company "Test" ` -Title $JobTitle ` -EmailAddress "$FirstName.$Surname@testcompany.com" ` -State ($Office -eq "LDN" ? "LDN" : "NY") ` -Country ($Office -eq "LDN" ? "GB" : "US") ` -Office $Office ` -City ($Office -eq "LDN" ? "London" : "New York") ` -DisplayName "$FirstName $Surname" ` -Enabled $True
额外优化点
- 可以把
$ouMapping单独存成一个JSON配置文件,脚本运行时加载,实现配置与代码分离 - 添加参数校验,比如当
$Office或$Department为空时抛出提示,避免生成错误的OU路径
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

