混合环境下基于Exchange脚本实现符合命名规则的本地用户创建
完善混合环境下创建本地Exchange用户的PowerShell脚本
需求说明
- SamAccountName格式为「姓氏+名字首字母」,若该账号已存在,则在末尾添加数字(例如King, John对应SamAccountName为KingJ1,若已存在则为KingJ2……)
- UPN格式为「名字.姓氏@contoso.com」,若该UPN已存在,则在姓氏后添加数字(例如King, John对应UPN为john.king1@contoso.com,若已存在则为john.king2@contoso.com……)
完善后的完整脚本
# 连接Exchange Online(若无需连接可注释此行) Connect-ExchangeOnline # 获取本地Exchange凭据 $UserCredential = Get-Credential # 建立本地Exchange 2016会话(替换<Exchange2016服务器FQDN>为实际服务器地址) $SessionEX2016 = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://<Exchange2016服务器FQDN>/PowerShell/ -Authentication Kerberos -Credential $UserCredential Import-PSSession $SessionEX2016 -DisableNameChecking # 获取用户基本信息 $FirstName = Read-Host "请输入名字" $LastName = Read-Host "请输入姓氏" $Manager = Read-Host "请输入经理的登录ID" $Name = "$LastName, $FirstName" $DisplayName = $Name $PW = "Welcome$(Get-Random -Minimum 0001 -Maximum 9999)!" $defaultOU = "OU=Users,OU=Accounts,DC=contoso,DC=com" # 默认用户创建OU # -------------------------- # 自动生成符合规则的SamAccountName # -------------------------- $baseSam = "$LastName$($FirstName[0])" $samCounter = 1 $samAccountName = "$baseSam$samCounter" # 循环检查AD中是否存在同名账号,存在则递增数字 while (Get-ADUser -Filter "SamAccountName -eq '$samAccountName'" -ErrorAction SilentlyContinue) { $samCounter++ $samAccountName = "$baseSam$samCounter" } # -------------------------- # 自动生成符合规则的UPN # -------------------------- $baseUpnPrefix = "$FirstName.$LastName" $upnCounter = 1 $upn = "$baseUpnPrefix$upnCounter@contoso.com" # 循环检查AD中是否存在相同UPN,存在则递增数字 while (Get-ADUser -Filter "UserPrincipalName -eq '$upn'" -ErrorAction SilentlyContinue) { $upnCounter++ $upn = "$baseUpnPrefix$upnCounter@contoso.com" } # -------------------------- # 创建本地远程邮箱用户 # -------------------------- New-RemoteMailbox -Name $Name -FirstName $FirstName -LastName $LastName ` -SamAccountName $samAccountName -OnPremisesOrganizationalUnit $defaultOU ` -UserPrincipalName $upn -Password (ConvertTo-SecureString -AsPlainText $PW -Force) ` -ResetPasswordOnNextLogon:$true -Archive # -------------------------- # 将用户移动到经理所在OU # -------------------------- if ($Manager) { try { $managerADObj = Get-ADUser -Identity $Manager -ErrorAction Stop $managerOU = ($managerADObj.DistinguishedName -split '(?<!\\),', 2)[-1] $newUserADObj = Get-ADUser -Identity $samAccountName -ErrorAction Stop $newUserADObj | Move-ADObject -TargetPath $managerOU -ErrorAction Stop Write-Host "用户已成功移动到经理所在OU: $managerOU" } catch { Write-Warning "移动用户到经理OU失败: $_" } } # 清理本地Exchange会话 Remove-PSSession $SessionEX2016
关键逻辑说明
- 自动生成账号与UPN:取消手动输入登录ID的步骤,脚本根据姓氏+名字首字母生成初始SamAccountName,根据「名字.姓氏」生成初始UPN前缀
- 存在性检查与递增:通过循环查询AD对象,若目标账号或UPN已存在,则自动在末尾添加递增数字,直到生成唯一值
- OU迁移容错处理:添加try-catch块处理经理ID无效、用户查询失败等异常,避免脚本直接中断
- 会话资源清理:脚本末尾添加本地Exchange会话的清理操作,避免残留会话占用系统资源
内容的提问来源于stack exchange,提问作者ak2595
相关产品推荐
相关产品推荐

