C# ile Exchange Mail Queue Sorgulama
Merhaba,
Geçtiğimiz günlerde bir problem ile karşılaştık. Mail Server’ımız içeriye mail gönderiyor ancak dışarıya mail göndermiyordu. Problem olduğunu anladıktan sonra problemi çözdük ancak biz problem olduğunu anlayana kadar epey bir süre geçmişti. Bu tarz bir problem ile karşılaşmamak adına dedim ki bir yazılım yazayım belli aralıklarla mail server’da sırada bekleyen mail sayısını alsın. Biz bunun üzerine eğer bu sayı 20 nin üzerinde ise bana mail atsın, yok şuraya loglasın, yok gitsin şunu yazsın vs gibi kontrolleri yazabilelim. O işin kolay kısmı, biz power shell komutlarını çalıştırmaya odaklanalım. Bu günkü yazımızda bu yazılımı yazacağız.
Bu işlemi yapabilmek için ms exchange power shell komutlarını kullanacağız. Uzaktan bağlantı kurabilmemiz için using System.Management.Automation; kutuphanesini kullanmamız gerekecek. Bu kutuphane varsayılan olarak visual studio 2010 içerisinde yok. Bizim bunu dışarıdan dahil etmemiz icap etmekte. Bunu yapabilmek içinde nuget manager kullanacağız. Nasıl mı ? Aşağıda…
Visual Studio 2010 u açtık. Bir winform projesi başlattık. Buraya kadar herşey tamam. Yukarıda Tools diye bir kısayolumuz bulunmaktadır. Buna tıkladıktan sonra Extension Manager sekmesine tıklayalım.
Bu işlemi yaptıktan sonra karşımıza extension manager ekranı gelecektir. Internete bağlı olan bilgisayarımızda sol taraftan Online Galery sekmesine tıklayalım ve Sağ üstte bulunan Arama alanına Nuget Package Manager yazalım (default olarak en üstte gelecektir eğer gelmezi ise). Karşımıza gelen toolun üzerine tıklayıp önce download sonra ise install sekmesine basalım. Bu işlem bir kaç dakika sürebilir. Sonuna kadar bekleyelim. İşlem hakkında bilgi ekranın sol alt kısmında yazıyor olacaktır. Şimdiye kadarki kısımda Nuget Package Manager install yapısını gördük. İşlem bittikten sonra yukarıda Tools sekmesine Nuget Package Manager sekmesi eklenecektir. Eğer yok ise bir restart herşeyi çözer…
Tools > Nuget Package Manager > Package Manager Console
Sekmelerine tıklıyoruz. Hemen altta console açılıyor oraya şu komutu yazıyoruz.
1 |
Install-Package System.Management.Automation |
Sonra install işlemi başlıyor ve bitiyor. Artık System.Management.Automation sınıfını kullanabilir durumdayız.
Önce yapacağımız işlemi kısaca özetleyelim sonrada kodlamamıza başlayalım.
Bir adet method oluşturacağız. Bu method ile exchange serverımıza bağlanıp sırada bekleyen mesajları ve bunların sayısını alacağız. Haydi başlayalım.
İlk olarak methodumuzu yazmaya başlayalım açıklamaları method içerisinde yorum satırı olarak eklemek daha güzel duracaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Security; namespace extest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string kullaniciadi = "Administrator"; string sifre = "sifreolarakburakyazdim"; string domain = "buraksenturkdomaini"; string uri = "http://EXCH.BURAKSENTURKDOMAINI.LOCAL/powershell"; string shelluri ="http://schemas.microsoft.com/powershell/Microsoft.Exchange"; exchangeBaglantiveSonucGetir(@kullaniciadi, sifre, domain, uri,shelluri); } public SecureString secureStringDonustur(string strPassword) { var secureStr = new SecureString(); if (strPassword.Length > 0) { foreach (var c in strPassword.ToCharArray()) secureStr.AppendChar(c); //Burada password olarak belirttiğim stringi char tipinden bir arraya sıra ile atıyoruz.. } return secureStr; //geriyede securestring tipinde bir property döndürüyoruz. } public void exchangeBaglantiveSonucGetir(string kullaniciAdi, string sifre, string domain, string uri, string shelluri) { SecureString securePwd = new SecureString(); //pscredential sınıfından nesne oluştururken parametre olarak bizden securestring classından bir nesne isteyecektir. Bu nesne enteresan bir nesnedir. //bizim belirttiğimiz şifreyi char tipinde bir array içerisinde tutmaktadır. //Dolayısı ile bizim sırf bu işlemi kolaylaştırabilmek için ufak bir method yazmamız gerekmekte. secureStringDonustur methodunu bu yüzden yazdım. securePwd = secureStringDonustur(sifre); //methoddan dönen sonucu securePwd propertymize ekledim. (Az sonra kullanacağız) PSCredential credential = new PSCredential(domain + "\\" + kullaniciAdi, securePwd); //Bağlantı esnasında kullanacağımız tanımlamamızı oluşturduk. WSManConnectionInfo conBilgi = new WSManConnectionInfo(new Uri(uri), shelluri, credential); //Bağlantı bilgilerini tanımlıyoruz. Burada uri olarak tanımlanan yapı exchange server ınızın bilgisayar ismidir. (Computer propertyde gördüğünüz Full Computer Name) //shell uri default bir tanımlamadır. Exchange power shelline bağlanacağımızı belirtiyoruz. Her yerde aynıdır. conBilgi.MaximumConnectionRedirectionCount = 5; conBilgi.SkipCACheck = true; try { Runspace remoteRunspace = RunspaceFactory.CreateRunspace(conBilgi); remoteRunspace.Open(); //İşlem yapacağımız runspace'i tanımladık ve bağlantımızı açtık. var command = new Command("Get-Message"); command.Parameters.Add("-IncludeRecipientInfo"); command.Parameters.Add("Filter", "Status -eq \"Retry\""); //Burada command ve parametre olarak exchange power shell komutlarını kullanıyoruz. Dilerseniz bu komutları istediğiniz şekilde değiştirip başka işlemlerde yapabilirsiniz. // Size önerim parametreleri ayrı ayrı yukarıda gözüktüğü gibi yazın. Her ne kadar bu yapı stabil çalışsada sonuçta biz powershellde yazmıyoruz. Burası .net :) var pipeline = remoteRunspace.CreatePipeline(); pipeline.Commands.Add(command); var results = pipeline.Invoke(); //İşlem yapısını oluşturduk komut çalıştırmasını başlattık şimdi geldi sıra sonuçları almaya..., MessageBox.Show(results.Count.ToString()); //Burada ilk olarak çalıştırdığım komut sonucunda kaç data dönecek ona bakıyorum. foreach (var sonuc in results) { MessageBox.Show(sonuc.Members["Subject"].Value.ToString()); //Burada ise bana dönen sonuçların Subject kısmında yazan verileri ekrana yazdırıyorum. Burayı özellikle ekledim. Siz Subject kısmında olduğu gibi //kolon isimlerini buraya yazıp farklı kolon değerlerinide gösterebilirsiniz. } remoteRunspace.Dispose(); //her zaman olduğu gibi gc nin işini kolaylaştırıp bu runspace'i uçuruyoruz... } catch (Exception ex) { } } } } |
Form1 in cs dosyasını tamamen buraya yapıştırdım. Dizayn kısmına hiç eğilmedim siz dilediğiniz gibi dizayn yapabilirsiniz.
İyi Günler Dilerim,