PowerShell Script’leri ve Görev Zamanlayıcı (Task Scheduler)
Office 365, Exchange gibi ürün ve hizmetleri yönetirken, belli bir rutin dahilinde yaptığınız kontroller ve işlemler, çektiğiniz raporlar, sıklıkla çalıştırdığınız script’ler olması kaçınılmazdır. PowerShell script’lerini Windows Görev Zamanlayıcı (Task Scheduler) ile otomatize etmek ve zamanlamak, hem teknik açıdan yönetimi kolaylaştırıp yapılan işi daha profesyonel hale getirir hem de zamandan ve efordan ciddi anlamda tasarruf sağlar. Bunlara ek olarak muhtemel kullanıcı hataları riskini minimize eder. Office 365’te lisans sayılarının takibi, işe yeni başlayan kullanıcılara lisans atanması, Exchange’de mailbox’ların boyut ve doluluk oranlarının raporlanması, ActiveSync log’larının çekilmesi gibi size, işinize, ekibinize, organizasyonunuza özgü gereksinimler doğrultusunda sayısız işlem için bu yönteme başvurabilirsiniz.
Script’i Çalıştıracak Zamanlanmış Bir Görev Oluşturmak
Aşağıda, zamanlanmış bir görev oluşturmak için takip edilmesi gereken adımları görebilirsiniz. Burada “C:\Scripts” klasörü altında bulunan “Get-O365LicenseReport.ps1” isimli bir script’i örnek olarak kullanıyorum.
1. Öncelikle yazdığınız script’in doğru ve istediğiniz şekilde çalıştığından emin olun. Bunun için yönetici olarak çalıştırıp açtığınız bir PowerShell penceresinde script’i basitçe test edin. İlgili modüller import ediliyor, doğru yetki seviyesindeki kullanıcılarla gerekli ortamlara bağlanılıyor (Exchange Online, MSOnline vb.) ve asıl işi yapan script kısmı da sorunsuz işliyorsa, yüksek olasılıkla zamanlanmış bir görev içinde de sorunsuz çalışacaktır.
2. Görev Zamanlayıcıyı (taskschd.msc) çalıştırın, üst şeritte “Action > Create Basic Task…” veya sağ menüdeki “Create Basic Task…” ile ilerleyerek bir “basic task” oluşturun.

3. Açılacak pencerede, “Create a Basic Task” aşamasında göreve anlaşılır bir isim verip tercihen bir açıklama girin. Next butonuna tıklayarak devam edin.

4. Bir sonraki “Task Trigger” aşamasında görevin çalışması için tercih ettiğiniz sıklığı ve zamanlamayı seçin. Yine Next ile ilerleyin.


5. “Action” aşamasında “Start a program” seçeneğini işaretleyerek devam edin.

6. Gelecek ekranda “Program/Script” alanına PowerShell.exe’nin konumunu girin:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
7. “Add arguments” alanına aşağıdaki metni, ‘script konumu’ bölümünde söz konusu script’in konumu olacak şekilde ve tırnak işaretlerine dikkat ederek girin:
-NonInteractive -WindowStyle Hidden -Command ".'script konumu'"
Örnek:
-NonInteractive -WindowStyle Hidden -Command ".'C:\Scripts\Get-O365LicenseReport.ps1'"

8. Son aşamada “Open the Properties dialog for this task when I click Finish” kutucuğunu işaretledikten sonra Finish butonuna tıklayın. Ek ayarlamaları yapabilmek adına bu işlem önemlidir.

9. Açılacak yeni ekrandaki “General” sekmesinde “Run whether user is logged on or not” ve “Run with the highest privileges” seçeneklerini işaretleyin. Bunun da RBAC ve UAC açısından önemli olduğunu belirtmekte fayda var. Ek olarak, “Change User” butonuna tıklayarak, görevi çalıştırırken kullanılacak kullanıcıyı da değiştirebilirsiniz.

10. Aynı pencerede “Triggers” sekmesinde, görevin çalışma sıklığını değiştirebilir ve/veya yeni zamanlamalar ekleyebilirsiniz.

11. Tüm işlemler ve ayarların tamamlanmasının ardından OK butonuna bastığınızda, 9. adımda görevin çalıştırılması için belirttiğiniz kullanıcının oturum açma bilgilerinin isteneceği bir ekran gelecektir. Burada belirtilen kullanıcı yalnızca görevin yönetici olarak çalıştırılması için kullanılır. Script’in içindeki işlemler için ise gereken bağlantıları ve ilgili oturum açma bilgilerini yine script’te belirtmiş olmanız gerekir.

12- OK butonunu tıklayarak işlemleri tamamlayın.
Script’in İçinde Oturum Açma Bilgilerini Güvenli Şekilde Çağırmak
Daha önce bahsettiğim üzere, script’in yapacağı işlemler için yine script’in içinde ilgili oturum açma bilgilerinin de kullanılması gerekir. Bu kısımlarda, bu bilgilerin güvenliğini ve şifrelenmesini sağlamak kritik önem arz eder. Script’e erişebilecek herhangi bir kullanıcının script’i açıp içindeki “admin” hesaplarının bilgilerini görebilmesini herhalde istemezsiniz. Bunun için faydalanılabilecek farklı yöntemler mevcut; en basitlerinden biri de ilgili bilgileri şifrelenmiş bir XML dosyasında tutmak ve script’in içinde gerektiği yerlerde o dosyadan çağırmak. Bunun için aşağıdaki işlemleri takip edebilirsiniz:
– PowerShell’de aşağıdaki komutu çalıştırın ve “prompt” geldiğinde script’in içinde kullanacağınız Office 365 Global Admin, Exchange Admin gibi ilgili kullanıcının bilgilerini girin. “-Path” parametresiyle birlikte ilgili XML dosyasının bulunmasını tercih ettiğiniz konumu ve dosya adını belirtebilirsiniz. Bu konumu, işlemleri yaptığınız cihaz, ona erişebilecek kullanıcılar, kullanıcıların yetkileri vb. faktörleri göz önünde bulundurarak ve gerekli izinleri de planlayarak belirlemeniz gerekir.
Get-Credential | Export-Clixml -Path 'C:\Scripts\O365Cred.xml'
– Sonrasında dosyayı açarsanız kullanıcı adının göründüğünü, ancak parolanın şifrelendiğini teyit edebilirsiniz. Script’in içinde oturum açma bilgilerini aşağıdaki gibi çağırarak bir değişkene atayabilir ve o değişkeni gerekli bloklarda kullanabilirsiniz:
$cred = Import-Clixml -Path 'C:\Scripts\O365Cred.xml'
Zamanlanmış Görevlerin Log’ları
Oluşturduğunuz görevlerin durumunu yine Görev Zamanlayıcı üzerinde, her bir görevin “History” bölümünde gözlemleyebilirsiniz. Olası sorunlar için Event Viewer‘da “Applications and Services Log > Microsoft > Windows > Task Scheduler > Operational” alanındaki olayları ve log’ları da takip edebilirsiniz.
PowerShell ve Task Scheduler ile İlgili Ayrıca Bakınız
- https://docs.microsoft.com/en-us/powershell/
- https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-task-scheduler
Burak Varol
burakvarol.net