PowerShell

Powershell Active Directory Toplu Kullanıcı Oluşturma

Powershell ile Active Directory üzerinde test için resimli gerçekçi toplu kullanıcı oluşturma, Powershell ile Active Directory bulk user oluşturma, Powershell ile RESTfull web service kullanımı, Powershell ile REST API çağırma, Powershell ile Active Directory ve REST API entegrasyonu, Örnek Powershell Script

Powershell Active Directory Toplu Kullanıcı Oluşturma

Powershell ile Active Directory toplu kullanıcı oluşturma makalesinde Powershell dili kullanımının biraz daha ileri seviyeye taşınması, yeteneklerinin daha iyi anlaşılması hedeflenmektedir. Organizasyon gereksinimlerine göre Active Directory ile diğer uygulamaların (örn. SAP, Microsoft Dynamics vb.) entegrasyonunun Powershell ile yapılabileceği anlaşılacaktır. Bu sayede ileride anlatılması planan Powershell Workflow konusunun daha iyi anlaşılması beklenmektedir.

Ebette bu senaryolar ve kullanılan methodlar sonsuz kere çoğaltılabilir. Bu makale özelinde temel seviyede, Powershell ile bir REST API – RESTfull web service üzerinden anlık oluşturulan kullanıcı listesi alınıp, Active Directory üzerinde toplu olarak kullanıcılar oluşturulacaktır. Kullanıcı oluşturulurken bazı kontrollerden de ayrıca geçirilecektir. 

Powershell ile Active Directory toplu kullanıcı oluşturma hakkında internet üzerinde yüzlerce makale bulunmaktadır. Sitede bulunan Powershell eğitimlerinin ardından; bir csv kullanıcı listesini import-csv komutu ile alabilir, Pipeline komutu ile ayırabilir, ardından dönen toplu (bulk) veriyi Foreach döngüsüne sokabilirsiniz. Dönen her satır veri için de bir Active Directory kullanıcısı oluşturabilirsiniz diye düşünüyoruz. Bu makalede ki asıl amaç Powershell ile entegrasyon senaryolarına giriş yapabilmektir.

Powershell Active Directory Toplu Kullanıcı Oluşturma İşlemi İçin Gerekli Fonksiyonlarının Oluşturulması

Makalenin bu kısmında örnek Powershell script dosyasının içinde durması gereken ancak çalışmadan önce sizlerin karar vermesi gereken bazı Powershell fonksiyonları bulunmaktadır. (Örneğin; kaç adet kullanıcı oluşturulacak? Kullanıcıların bir e-posta adresi olacak mı? Kullanıcının resmi olsun mu? Hangi milliyetten insanlar oluşturmak istiyorsunuz?)

Tüm bu Powershell fonksiyonları sizlere gerçek hayat senaryolarında da oldukça yarar sağlayacaktır. 

Yapınıza göre uzaktan Powershell script çalıştırmak engellenmiş olabilir. Script bu durumlarda hatalar verecektir. Script dosyasının çalıştırıldığı sunucuda ve bağlanılacak olan sunucuda aşağıdaki komutun çalıştırılması sorunları çözebilir.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Powershell ile Rest API – RESTfull Web Service Entegrasyonu

Powershell ile Rest API – RESTfull web service entegrasyonu sağlayacak olan fonksiyon Initialize-DemoUser şeklinde tanımlanmıştır. Initialize-DemoUser Powershell fonksiyonu ile randomuser.me sitesinden sağlanan Rest API web service bağlanıp JSON tipinde kullanıcı listesi alınmaktadır. Site sağladığı datayı cinsiyet, ırk, parola ayarları, lokasyon gibi zengin bir içerikle sağlamaktadır. Fonksiyon parametreleri sadece Active Directory kullanıcısı oluşturmaya yarayacak şekilde azaltılmıştır ancak ihtiyaca göre opsiyonel hale getirilmiştir. Aynı anda maksimum 5000 kullanıcı sağlanabilmektedir. Sitenin sağladığı Rest API yardım dokümanları için tıklayınız. Bu fonksiyondan dönecek olan (return) JSON tipindeki veri, toplu kullanıcı oluşturmak için kullanılacaktır.
 
Function Initialize-DemoUser
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [int] $Count,

        [ Parameter (Mandatory = $false)]  
        [string] $Nationality = "tr",  

        [ Parameter (Mandatory = $false, HelpMessage = "https://randomuser.me/documentation#howto")]  
        [string] $PassSettings = "special,upper,lower,number,8",

        [ Parameter (Mandatory = $false, HelpMessage = "https://randomuser.me/documentation#howto")]  
        [string] $Include = "gender,name,city,country,postcode,email,login,phone,cell,picture,nat"
    )
    Process
    {
        if ($Count -lt 5001) {
            $URL = "https://randomuser.me/api/?nat=" + $Nationality + "&results=" + $Count + "&password=" + $PassSettings + "&inc=" + $Include
        
            $PersonObjects = Invoke-RestMethod -Uri $URL
            return $PersonObjects               
        }else{
            Write-Error -Message "Maximum user count can't be more than 5000." -ErrorAction Continue
        }           
    }
}

Powershell ile Active Directory Sunucuna Bağlanmak

Powershell ile uzaktan Active Directory sunucuna bağlanmak için gerekli Connect-ActiveDirectory fonksiyonu opsiyoneldir. Powershell komutları yada script dosyası Active Directory sunucusu üzerinde de çalıştırılabilir ancak önerilmez. Bu yüzden ayrı bir fonksiyon olarak yazılmıştır. 

Function Connect-ActiveDirectory
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true, HelpMessage = "Active Directory FQDN")]  
        [string] $Server,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Active Directory Username")]  
        [string] $Username,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Active Directory Password")]  
        [string] $Pass
    )
    Process
    {    
        $Password = $Pass | ConvertTo-SecureString -AsPlainText -Force 
        $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $Username, $Password
        
        $Session = New-PSSession -ComputerName $Server -Credential $Credential
        Import-Module -PSSession $Session -Name ActiveDirectory -Global

        Write-Verbose -Message "Successfully imported Active Directory session..." -Verbose
        return $Session
    }
}

Powershell ile Exchange Server Bağlanmak

Powershell ile uzaktan Exchange Server bağlantısı için gerekli Connect-ExchangeServer fonksiyonu Active Directory fonksiyonunda da olduğu şekilde opsiyoneldir. Diğer tüm operasyonlar için Active Directory yada Exchange server bağlantılarından en az birini yapmak gerekir. Eğer kullanıcıya bir email adresi verilecekse bu bağlantının kullanılması, verilmeyecekse Active Directory bağlantısının yapılması önerilir.

Function Connect-ExchangeServer
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true, HelpMessage = "Exchange Server FQDN")]  
        [string] $Server,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Exchange Server Username")]  
        [string] $Username,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Exchange Server Password")]  
        [string] $Pass,

        [Parameter(Mandatory=$false, HelpMessage = "Please choice for using Http or Https")]
        [Switch] $UseHTTPS = $false,

        [ Parameter (Mandatory = $false, HelpMessage = "Authentication type for Exchange Server connection")]  
        [string] $AuthenticationType = "Kerberos"
    )
    Process
    {    
        $Password = $Pass | ConvertTo-SecureString -AsPlainText -Force 
        $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $Username, $Password
        $URI = If ($UseHTTPS) {"https://" + $Server + "/PowerShell/"} Else {"http://" + $Server + "/PowerShell/"}
        $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $URI -Authentication $AuthenticationType -Credential $Credential

        Import-PSSession $Session -DisableNameChecking
        Write-Verbose -Message "Successfully imported Exchange Server session..." -Verbose
        return $Session
    }
}

Powershell ile Açık Olan Session Bilgilerini Sonlandırmak

Connect-ActiveDirectory yada Connect-ExchangeServer fonksiyonları aracılığı bağlandığımız sunuculardan bağlantının koparılması gerekmektedir. Bu durum özellikle Office365 kullanımında da önemli olmaktadır.  Disconnect-Sessions Powershell fonksiyonu açık olan session bilgilerinden istenen bir tanesini id parametresi aracılığı ile sonlandırabilmektedir. Eğer bir parametre verilmezse, tüm session bilgilerini temizlemektedir.

Function Disconnect-Sessions
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $false, HelpMessage = "Session ID")]  
        [int] $Id = $null
    )
    if ($Id) {
        Remove-PSSession -Id $Id
        Write-Verbose -Message "Successfully removed specified session." -Verbose    
    }else {
        Get-PSSession | Remove-PSSession
        Write-Verbose -Message "Successfully removed all sessions." -Verbose        
    }    
}

Powershell ile Türkçe Karakter Değişimi (Powershell Replace Turkish Characters)

Powershell Replace Turkish Characters işlemi yani Powershell ile Türkçe karakter değişimi işlemi için gerekli olacak olan Convert-TurkishCharacters fonksiyonu yine opsiyoneldir. İsim ve soyisimden username yada email adresi oluşturma işlemleri yapılırken gerekli olabileceği düşünülmüştür.

Function Convert-TurkishCharacters
{  
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $Data  
    )
    Begin
    {
        Write-Verbose -Message "Replacing Turkish characters..." -Verbose
    } 
    Process  
    {  
        $Data = $Data.Replace('ü', 'u')
        $Data = $Data.Replace('ı', 'i')
        $Data = $Data.Replace('ö', 'o')
        $Data = $Data.Replace('ş', 's')
        $Data = $Data.Replace('ğ', 'g')
        $Data = $Data.Replace('ç', 'c')
        $Data = $Data.Replace('Ü', 'U')
        $Data = $Data.Replace('İ', 'I')
        $Data = $Data.Replace('Ö', 'O')
        $Data = $Data.Replace('Ş', 'S')
        $Data = $Data.Replace('Ğ', 'G')
        $Data = $Data.Replace('Ç', 'C')        
    }
    End
    {
        Write-Verbose -Message "Successfully replaced Turkish characters." -Verbose
        return $Data
    } 
}

Powershell ile Active Directory Kullanıcısının Var Olup Olmadığının Kontrolü

Powershell ile bir Actice Directory kullanıcısının var olup olmadığının kontrolü, varsa şu işlemi gerçekleştir, yoksa şu işlemi yap denilebilecek bir fonksiyon ihtiyacı bulunmaktadır. Aşağıdaki Get-UserIsExist fonksiyonu ile Active Directory kullanıcısı varsa $true, yoksa $false sonucu alınabilir. Fonksiyon oldukça kullanışlıdır ve diğer metodlardan çok daha hızlı yanıt dönebilmektedir.

Function Get-UserIsExist {
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $User
    )

    $Result = $true

    if(([ADSISearcher] "(sAMAccountName=$User)").FindOne()){
        $Result = $true
    }
    else {
        $Result = $false
    }         

    return $Result
}

Powershell ile Dosya ve Resim İndirmek

Powershell ile internet üzerinden dosya veya resim indirmek ve indirilen dosya üzerinde yapılabilecek işlemler için aşağıdaki Export-PictureDataFromUrl Powershell fonksiyonu örnek olabilir. Bu Powershell fonksiyonu Rest API üzerinden dönecek olan kullanıcı resimini indirip byte tipinde geri döndürmektedir.

Function Export-PictureDataFromUrl
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $Url  
    )
    Begin
    {
        $tmpFileName = $Url.Split('/')
        $FileName = $tmpFileName[6]
        Invoke-WebRequest $Url -OutFile "$env:TEMP\$FileName"
    } 
    Process  
    {  
        $PhotoData = [byte[]](Get-Content "$env:TEMP\$FileName" -Encoding byte)
        Remove-Item -Path "$env:TEMP\$FileName" -Force
    }
    End
    {
        return $PhotoData
    } 
}

Powershell ile Active Directory Kullanıcı Resiminin Değiştirilmesi

Powershell ile Active Directory kullanıcılarının resimleri değiştirilebilir. Aşağıdaki Set-UserPicture fonksiyonu $Username, $Photo ve $DC şeklinde 3 adet parametre almaktadır. Burada dikkat edilmesi gereken konu Photo parametresi Export-PictureDataFromUrl fonksiyonundan dönen bir byte array olarak veri alabilir.

Function Set-UserPicture {
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $Username,
        [ Parameter (Mandatory = $true)]  
        [byte[]] $Photo,
        [ Parameter (Mandatory = $false)]  
        [string] $DC
    )

    Process {
        Set-ADUser $Username -Server $DC -Replace @{thumbnailPhoto=$Photo}
    }
}

Powershell Active Directory Toplu Kullanıcı Oluşturma İşlemi İçin Gerekli Komutlar

Yukarıda Active Directory toplu kullanıcı oluşturma işlemi için gerekli tüm örnek Powershell fonksiyonları tanımlanmıştır. Aşağıdaki komutlar ile artık örnek Powershell script dosyası tamamlanabilir ve REST API – RESTfull web service aracılığı ile toplu kullanıcı açma işlemi tamamlanabilir. 

# Active Directory sunucusu FQDN adresi
$ADServerFQDN = "dc01.aktifdizin.com"

# Exchange Server FQDN adresi
$ExchangeServerFQDN = "exc01.aktifdizin.com"

# Sunucu bağlantısını yapmaya ve kullanıcı açmaya yetkili kullanıcı hesabı
$AdminUsername = "Administrator"

# Sunucu bağlantısını yapmaya ve kullanıcı açmaya yetkili kullanıcı parolası
$AdminPassword = "SuperGizliParolaniz"

# Kullanıcıların açılacağı Organizational Unit objesi için Distinguished Name
$OU = "OU=Article,OU=Accounts,DC=aktifdizin,DC=com"

# Active Directory Domain Suffix
$DomainSuffix = "@aktifdizin.com"

# Sadece kaç adet kullanıcı istendiğini belirttik. 
# Fonksiyon parametreleri değiştirilerek daha fazla tipte kullanıcı nesnesi oluşturulabilir.
# Fonksiyon JSON objesi döndürür
$tmpUsers = Initialize-DemoUser -Count 20

# Kullanıcılara email adreside tanımlanacağı için Exchange Server ile bağlantı kurulacaktır.
$session = Connect-ExchangeServer -Server $ExchangeServerFQDN -Username $AdminUsername -Pass $AdminPassword

# Foreach döngüsü ile yukarıda alınan kullanıcılar objesinin içinden 
# her bir döngüde bir kullanıcı çekip üzerinde işlem yapılacaktır.
Foreach($employee in $tmpUsers.results){
    # Kullanıcı adı oluşturulacaktır. Türkçe karakterler Convert-TurkishCharacters temizlenecek,
    # Karakterler ToLower() ile küçük harfe dönüştürülecek,
    # Karakterlerden sonra varsa boşluklar Trim() ile temizlenecektir.
    $username =  ((Convert-TurkishCharacters -Data $employee.name.first).ToLower()).Trim() + ((Convert-TurkishCharacters -Data $employee.name.last).ToLower()).Trim()

    # Kullanıcı için gerekli Active Directory parolası oluşturulacaktır. 
    # ConvertTo-SecureString fonksiyonu ile clear text olan password verisi securestring tipine çevirilecektir.
    # Tüm bulk kullanıcılar için statik bir password üretilebilir. Bunun için $employee.login.password yerine "Parola123" 
    # şeklinde yazılması yeterli olacaktır. Bazen webservis düzgün parola üretmemektedir. Bu durumda kullanıcıya yeniden
    # parola verilmesi ve disable durumdaysa enable edilmesi gerekecektir.
    $userPassword = $employee.login.password | ConvertTo-SecureString -AsPlainText -Force
    
    # Kullanıcı için Active Directory UPN Suffix oluşturulacaktır.
    $upn = $username + $DomainSuffix

    # Kullanıcı için Active Directory Display Name oluşturulacaktır.
    $displayName = $employee.name.first + " " + $employee.name.last

    # Veri bilinmeyen bir kaynaktan alındığı için var olan bir kullanıcının tekrar gönderilip gönderilmediği
    # kontrol edilmelidir. Bu örnekte kullanıcı yoksa açılacak ancak varsa herhangi bir işlem yapılmayacaktır.
    # Gerçek ortam senaryolarında "else" bloğu içinde kullanıcı varsa yapılacak işlemler tanımlanabilir.
    if ((Get-UserIsExist -User $username) -eq $false) {        
        # Actice Directory kullanıcı oluşturulacaktır.
        New-ADUser -Name $displayName -GivenName $employee.name.first -Surname $employee.name.last -SamAccountName $username -UserPrincipalName $upn -Path $OU -AccountPassword $userPassword -Enabled $true -MobilePhone $employee.cell -OfficePhone $employee.phone -Server $ADServerFQDN

        # Export-PictureDataFromUrl ile byte array cinsinden kullanıcı resimi alınır.
        $photo = Export-PictureDataFromUrl -Url $employee.picture.large

        # Alınan resim kullanıcıya atanır.
        Set-UserPicture -Username $username -DC $ADServerFQDN -Photo $photo

        # Kullanıcıya bir email adresi verilecektir.
        Enable-Mailbox -Identity $username -DomainController $ADServerFQDN
    } else {
        Write-Verbose -Message "This user already exists!" -Verbose
    }
}

# Açılan Session silinecektir.
Disconnect-Sessions -Id $session.Id

 

Powershell Active Directory Toplu Kullanıcı Oluşturma

Powershell Script dosyasının son versiyonu aşağıdaki şekilde olmalıdır:

Function Connect-ActiveDirectory
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true, HelpMessage = "Active Directory FQDN")]  
        [string] $Server,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Active Directory Username")]  
        [string] $Username,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Active Directory Password")]  
        [string] $Pass
    )
    Process
    {    
        $Password = $Pass | ConvertTo-SecureString -AsPlainText -Force 
        $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $Username, $Password
        
        $Session = New-PSSession -ComputerName $Server -Credential $Credential
        Import-Module -PSSession $Session -Name ActiveDirectory -Global

        Write-Verbose -Message "Successfully imported Active Directory session..." -Verbose
        return $Session
    }
}

Function Connect-ExchangeServer
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true, HelpMessage = "Exchange Server FQDN")]  
        [string] $Server,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Exchange Server Username")]  
        [string] $Username,
        
        [ Parameter (Mandatory = $true, HelpMessage = "Exchange Server Password")]  
        [string] $Pass,

        [Parameter(Mandatory=$false, HelpMessage = "Please choice for using Http or Https")]
        [Switch] $UseHTTPS = $false,

        [ Parameter (Mandatory = $false, HelpMessage = "Authentication type for Exchange Server connection")]  
        [string] $AuthenticationType = "Kerberos"
    )
    Process
    {    
        $Password = $Pass | ConvertTo-SecureString -AsPlainText -Force 
        $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $Username, $Password
        $URI = If ($UseHTTPS) {"https://" + $Server + "/PowerShell/"} Else {"http://" + $Server + "/PowerShell/"}
        $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $URI -Authentication $AuthenticationType -Credential $Credential

        Import-PSSession $Session -DisableNameChecking
        Write-Verbose -Message "Successfully imported Exchange Server session..." -Verbose
        return $Session
    }
}

Function Disconnect-Sessions
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $false, HelpMessage = "Session ID")]  
        [int] $Id = $null
    )
    if ($Id) {
        Remove-PSSession -Id $Id
        Write-Verbose -Message "Successfully removed specified session." -Verbose    
    }else {
        Get-PSSession | Remove-PSSession
        Write-Verbose -Message "Successfully removed all sessions." -Verbose        
    }    
}

Function Initialize-DemoUser
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [int] $Count,

        [ Parameter (Mandatory = $false)]  
        [string] $Nationality = "tr",  

        [ Parameter (Mandatory = $false, HelpMessage = "https://randomuser.me/documentation#howto")]  
        [string] $PassSettings = "special,upper,lower,number,8",

        [ Parameter (Mandatory = $false, HelpMessage = "https://randomuser.me/documentation#howto")]  
        [string] $Include = "gender,name,city,country,postcode,email,login,phone,cell,picture,nat"
    )
    Process
    {
        if ($Count -lt 5001) {
            $URL = "https://randomuser.me/api/?nat=" + $Nationality + "&results=" + $Count + "&password=" + $PassSettings + "&inc=" + $Include
        
            $PersonObjects = Invoke-RestMethod -Uri $URL
            return $PersonObjects               
        }else{
            Write-Error -Message "Maximum user count can't be more than 5000." -ErrorAction Continue
        }           
    }
}

Function Convert-TurkishCharacters
{  
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $Data  
    )
    Begin
    {
        Write-Verbose -Message "Replacing Turkish characters..." -Verbose
    } 
    Process  
    {  
        $Data = $Data.Replace('ü', 'u')
        $Data = $Data.Replace('ı', 'i')
        $Data = $Data.Replace('ö', 'o')
        $Data = $Data.Replace('ş', 's')
        $Data = $Data.Replace('ğ', 'g')
        $Data = $Data.Replace('ç', 'c')
        $Data = $Data.Replace('Ü', 'U')
        $Data = $Data.Replace('İ', 'I')
        $Data = $Data.Replace('Ö', 'O')
        $Data = $Data.Replace('Ş', 'S')
        $Data = $Data.Replace('Ğ', 'G')
        $Data = $Data.Replace('Ç', 'C')        
    }
    End
    {
        Write-Verbose -Message "Successfully replaced Turkish characters." -Verbose
        return $Data
    } 
}

Function Export-PictureDataFromUrl
{
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $Url  
    )
    Begin
    {
        $tmpFileName = $Url.Split('/')
        $FileName = $tmpFileName[6]
        Invoke-WebRequest $Url -OutFile "$env:TEMP\$FileName"
    } 
    Process  
    {  
        $PhotoData = [byte[]](Get-Content "$env:TEMP\$FileName" -Encoding byte)
        Remove-Item -Path "$env:TEMP\$FileName" -Force
    }
    End
    {
        return $PhotoData
    } 
}

Function Get-UserIsExist {
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $User
    )

    $Result = $true

    if(([ADSISearcher] "(sAMAccountName=$User)").FindOne()){
        $Result = $true
    }
    else {
        $Result = $false
    }         

    return $Result
}

Function Set-UserPicture {
    [CmdletBinding()]  
    Param (  
        [ Parameter (Mandatory = $true)]  
        [string] $Username,
        [ Parameter (Mandatory = $true)]  
        [byte[]] $Photo,
        [ Parameter (Mandatory = $false)]  
        [string] $DC
    )

    Process {
        Set-ADUser $Username -Server $DC -Replace @{thumbnailPhoto=$Photo}
    }
}

# Active Directory sunucusu FQDN adresi
$ADServerFQDN = "dc01.aktifdizin.com"

# Exchange Server FQDN adresi
$ExchangeServerFQDN = "exc01.aktifdizin.com"

# Sunucu bağlantısını yapmaya ve kullanıcı açmaya yetkili kullanıcı hesabı
$AdminUsername = "Administrator"

# Sunucu bağlantısını yapmaya ve kullanıcı açmaya yetkili kullanıcı parolası
$AdminPassword = "SuperGizliParolaniz"

# Kullanıcıların açılacağı Organizational Unit objesi için Distinguished Name
$OU = "OU=Article,OU=Accounts,DC=aktifdizin,DC=com"

# Active Directory Domain Suffix
$DomainSuffix = "@aktifdizin.com"

# Sadece kaç adet kullanıcı istendiğini belirttik. 
# Fonksiyon parametreleri değiştirilerek daha fazla tipte kullanıcı nesnesi oluşturulabilir.
# Fonksiyon JSON objesi döndürür
$tmpUsers = Initialize-DemoUser -Count 20

# Kullanıcılara email adreside tanımlanacağı için Exchange Server ile bağlantı kurulacaktır.
$session = Connect-ExchangeServer -Server $ExchangeServerFQDN -Username $AdminUsername -Pass $AdminPassword

# Foreach döngüsü ile yukarıda alınan kullanıcılar objesinin içinden 
# her bir döngüde bir kullanıcı çekip üzerinde işlem yapılacaktır.
Foreach($employee in $tmpUsers.results){
    # Kullanıcı adı oluşturulacaktır. Türkçe karakterler Convert-TurkishCharacters temizlenecek,
    # Karakterler ToLower() ile küçük harfe dönüştürülecek,
    # Karakterlerden sonra varsa boşluklar Trim() ile temizlenecektir.
    $username =  ((Convert-TurkishCharacters -Data $employee.name.first).ToLower()).Trim() + ((Convert-TurkishCharacters -Data $employee.name.last).ToLower()).Trim()

    # Kullanıcı için gerekli Active Directory parolası oluşturulacaktır. 
    # ConvertTo-SecureString fonksiyonu ile clear text olan password verisi securestring tipine çevirilecektir.
    # Tüm bulk kullanıcılar için statik bir password üretilebilir. Bunun için $employee.login.password yerine "Parola123" 
    # şeklinde yazılması yeterli olacaktır. Bazen webservis düzgün parola üretmemektedir. Bu durumda kullanıcıya yeniden
    # parola verilmesi ve disable durumdaysa enable edilmesi gerekecektir.
    $userPassword = $employee.login.password | ConvertTo-SecureString -AsPlainText -Force
    
    # Kullanıcı için Active Directory UPN Suffix oluşturulacaktır.
    $upn = $username + $DomainSuffix

    # Kullanıcı için Active Directory Display Name oluşturulacaktır.
    $displayName = $employee.name.first + " " + $employee.name.last

    # Veri bilinmeyen bir kaynaktan alındığı için var olan bir kullanıcının tekrar gönderilip gönderilmediği
    # kontrol edilmelidir. Bu örnekte kullanıcı yoksa açılacak ancak varsa herhangi bir işlem yapılmayacaktır.
    # Gerçek ortam senaryolarında "else" bloğu içinde kullanıcı varsa yapılacak işlemler tanımlanabilir.
    if ((Get-UserIsExist -User $username) -eq $false) {        
        # Actice Directory kullanıcı oluşturulacaktır.
        New-ADUser -Name $displayName -GivenName $employee.name.first -Surname $employee.name.last -SamAccountName $username -UserPrincipalName $upn -Path $OU -AccountPassword $userPassword -Enabled $true -MobilePhone $employee.cell -OfficePhone $employee.phone -Server $ADServerFQDN

        # Export-PictureDataFromUrl ile byte array cinsinden kullanıcı resimi alınır.
        $photo = Export-PictureDataFromUrl -Url $employee.picture.large

        # Alınan resim kullanıcıya atanır.
        Set-UserPicture -Username $username -DC $ADServerFQDN -Photo $photo

        # Kullanıcıya bir email adresi verilecektir.
        Enable-Mailbox -Identity $username -DomainController $ADServerFQDN
    } else {
        Write-Verbose -Message "This user already exists!" -Verbose
    }
}

# Açılan Session silinecektir.
Disconnect-Sessions -Id $session.Id
 

Eğer herşey olunda gittiyse sizinde Exchange webmail ekranında aşağıdaki şekilde kullanıcıları görebilmeniz gerekir:

Powershell Active Directory Toplu Kullanıcı Oluşturma

Test ortamında yapılan bir geliştirme olduğu için PowerShell Try Catch blokları kullanılmamıştır.

Bonus:

Powershell ile Active Directory kullanıcı resim değiştirme

$fileName = "C:\ahmetelibol.jpg"
$photo = [byte[]](Get-Content $fileName -Encoding byte)            
Set-ADUser $username -Server "dc01.aktifdizin.com" -Replace @{thumbnailPhoto=$photo}

Powershell ile bir Active Directory kullanıcısının herhangi bir alanını değiştirmek (Attribute-Value değiştirme)

Set-ADUser "username" -Server "dc.fqdn" -Replace @{attribute=value}

Örnek:

Set-ADUser "alibolatli" -Server "dc01.aktifdizin.com" -Replace @{givenName="Ali Veli"}

 


Powershell Active Directory Toplu Kullanıcı Oluşturma

Vakit ayırdığınız için teşekkür ederiz. Yazılan tüm kod sitemize aittir ve izinsiz başka sitelerde yayınlanamaz ve ticari olarak kullanılamaz. Soru, görüş ve önerilerinizi aşağıdaki formu kullanarak bize iletebilirsiniz.

Daha Fazla Göster

Ahmet Elibol

Üniversite eğitimini Kimya ve İşletme bölümlerinde tamamlayan Ahmet Elibol, yüksek lisans eğitimini de İşletme (Master of Business Administration - MBA) üzerinde tamamlamıştır. 1999 yılından bu yana bilişim sektöründe bulunmaktadır.  Ahmet Elibol, profesyonel kariyerine aldığı pascal ve delphi ile yazılım mühendisliği eğitimiyle başlamıştır. 2004 yılından sonra ilgi ve uzmanlık alanlarını Microsoft Sunucu Sistemleri, Sistem Programlama ve Bilgi Güvenliği konularında güncellemiştir. Yazar 4 yıl kadar bir akademide Sistem Mühendisliği eğitimleri de vermiştir. Yazar hobi amaçlı programlama, yapay zeka, makine öğrenmesi, yapay sinir ağları, görüntü işleme ve nesnelerin interneti konularında çalışmaktadır. İngilizce, Rusça dillerini bilen Ahmet Elibol MCT, MCITP, MCTS, MCSE, MCSA vb. uzmanlık sertifikalarına sahiptir ve Bilgisayar Mühendisliği yüksek lisansına devam etmektedir.

İlgili Makaleler

6 Yorum

  1. Harika bir makale olmuş hocam, bir önceki belirtmiş olduğunuz powershell makelelerinizde ki komutları, döngülerin çoğunu harika bir şekilde işlemişsiniz.

    Teşekkürler tekrardan,

  2. elinize sağlık, neredeyse akademik yayın sayılabilecek bir kaynak olmuş; duamızı aldınız.

Bir yanıt yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu