Exchange’te CSV ile Toplu Mailbox Oluşturma (İlk Girişte Şifre Değiştirme Zorunlu)

Kurumsal ortamlarda yeni kullanıcı açılışlarını tek tek yapmak hem zaman kaybıdır hem de hata riskini artırır. Bu yazıda, Excel/CSV listesi üzerinden Exchange (On-Prem) ortamında AD kullanıcı + mailbox oluşturmayı ve tüm kullanıcılara aynı ilk şifreyi verip ilk girişte şifre değiştirme zorunluluğu koymayı adım adım anlatıyorum.

Bu yöntem özellikle yeni domain kurulumları, tenant geçişleri, departman genişlemeleri ve hızlı onboarding senaryolarında işinizi ciddi anlamda kolaylaştırır.


Ön Koşullar

Not: Bu işlem On-Prem Exchange içindir. Exchange Online (M365) tarafında yaklaşım ve cmdlet’ler farklıdır.


CSV Formatı Nasıl Olmalı?

Benim kullandığım CSV’de iki sütun var:

Örnek:

Ad Soyad / Birim E-posta
Atalay Aktaş Hukuk atalay.aktas@firma.com
Kerem Karakoç Risk kerem.karakoc@firma.com

CSV’nin encoding’i UTF-8 olursa Türkçe karakterlerde daha az sürpriz yaşarsın.


Şifre Politikası: İlk Şifre Sabit, İlk Girişte Değiştirme Zorunlu

Senaryomuz:

Bu sayede tek şifre verilir ama güvenlik açısından ilk girişte kişiselleştirilir.


Ortam Bilgilerini Hazırla

Aşağıdaki değişkenleri kendi ortamına göre güncelle:

Örnek DB adların:


PowerShell Script: CSV’den Toplu Kullanıcı + Mailbox Oluşturma

Aşağıdaki script, CSV’yi okuyup her satır için:

$csvPath = “C:\Temp\*******_kullanicilar.csv”
$plainPwd = “********”
$securePwd = ConvertTo-SecureString $plainPwd -AsPlainText -Force

$OU = “OU=******** Users,DC=dinamikpay,DC=local”
$DB = “DP-DB01”

Import-Csv $csvPath | ForEach-Object {

$displayName = ($_.’Ad Soyad / Birim’ + “”).Trim()
$email = ($_.’E-posta’ + “”).Trim().ToLower()
if ([string]::IsNullOrWhiteSpace($email)) { return }

$alias = ($email.Split(“@”)[0]).Trim()

# 1) AD user var mı?
$adUser = Get-ADUser -Filter “SamAccountName -eq ‘$alias'” -ErrorAction SilentlyContinue

# 2) Exchange recipient var mı? (Mailbox/RemoteMailbox/UserMailbox vs)
$recipient = Get-Recipient -Identity $email -ErrorAction SilentlyContinue

try {
if (-not $adUser) {
# AD user yok -> New-Mailbox ile komple oluştur
New-Mailbox `
-Name $displayName `
-DisplayName $displayName `
-Alias $alias `
-UserPrincipalName $email `
-PrimarySmtpAddress $email `
-OrganizationalUnit $OU `
-Database $DB `
-Password $securePwd `
-ResetPasswordOnNextLogon $true

Write-Host “CREATED: $email” -ForegroundColor Green
return
}

# AD user var -> şifreyi resetle + ilk girişte değiştir
Set-ADAccountPassword -Identity $adUser.DistinguishedName -Reset -NewPassword $securePwd
Set-ADUser -Identity $adUser.DistinguishedName -ChangePasswordAtLogon $true
Enable-ADAccount -Identity $adUser.DistinguishedName

if (-not $recipient) {
# Mailbox yok -> mailbox enable et
Enable-Mailbox -Identity $adUser.SamAccountName -Database $DB -PrimarySmtpAddress $email
Write-Host “ENABLED MAILBOX + RESET PWD: $email” -ForegroundColor Yellow
}
else {
# Mailbox zaten var -> sadece password policy işini yaptık
Write-Host “EXISTS (MAILBOX) + RESET PWD: $email” -ForegroundColor Cyan
}
}
catch {
Write-Host “ERROR: $email -> $($_.Exception.Message)” -ForegroundColor Red
}
}

 


Script Sonucu Nasıl Kontrol Edilir?

1) Mailbox oluştu mu?

Get-Mailbox -ResultSize Unlimited | Select DisplayName,PrimarySmtpAddress,Database

2) Kullanıcıların DB dağılımı

Get-Mailbox -ResultSize Unlimited | Group-Object Database | Select Name,Count

3) Bir kullanıcının ilk girişte şifre değiştirme durumu

Get-ADUser -Identity atalay.aktas -Properties ChangePasswordAtLogon | Select SamAccountName,ChangePasswordAtLogon

Sık Görülen Hatalar ve Çözümleri

“AD object already exists” hatası

Bu hata, kullanıcı AD’de zaten varsa New-Mailbox yeni bir AD objesi yaratmaya çalıştığı için çıkar.
Bu durumda çözüm:

İstersen buna uygun “varsa geç, yoksa oluştur” mantığında daha gelişmiş bir script de kurgulanır.

UPN suffix hatası

$DomainUPN AD’de tanımlı değilse kullanıcı UPN hatası alabilirsin.
Çözüm: AD’de UPN suffix ekle veya ***********.local gibi mevcut suffix kullan.