C# ile ExChange Calendar İşlemleri

Merhabalar;

Exchange ile Active Directory bilindiği gibi birlikte çalışabilmektedir. Bu örneğimizde active directoryden alınan kullanıcılarında SID (AD tarafındaki idleri) bilgisi ile exchange üzerinden kullanıcının calendar listesini alacağız.

Öncelikle Credential işlemimizi yapabilmek için aşağıdaki metodlara ihtiyacımız vardır, bu metodu bir class içerisine alabilirsiniz:


public static bool CertificateValidationCallBack(object sender, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
{
return true;
}

if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
{
if (chain != null && chain.ChainStatus != null)
{
foreach (X509ChainStatus status in chain.ChainStatus)
{
if ((certificate.Subject == certificate.Issuer) && (status.Status == X509ChainStatusFlags.UntrustedRoot))
{
continue;
}
else
{
if (status.Status != X509ChainStatusFlags.NoError)
{
return true;
}
}
}
}
return true;
}
else
{
return true;
}
}

 

SSL sayfaları için SSL sertifikasını otomatik onaylamamız için aşağıda ki blok işimizi görecektir :


public static bool RedirectionUrlValidationCallback(string redirectionUrl)
{
bool result = false;

Uri redirectionUri = new Uri(redirectionUrl);

if (redirectionUri.Scheme == "https")
{
result = true;
}
return result;
}

 

Şimdi Exchange’den gelecek olaran Appointment’larımız için ben aşağıdaki gibi bir class oluşturdum. Bu class üzerinden bir List<> oluşturarak liste halinde datalarımızı alıyorum. Kendinize göre değiştirebilirsiniz.


public class AppointmentList
{
public string UserName { get; set; } //Calendar kullanıcısı
public DateTime StartDate { get; set; } //Appointment'ın başlangıç tarihi
public TimeSpan StartTime { get; set; } //Appointment'ın başlangıç saati
public DateTime EndDate { get; set; } //Appointment'ın bitiş tarihi
public TimeSpan EndTime { get; set; } //Appointment'ın bitiş saati
public string Subject { get; set; } //Başlığı
public string Location { get; set; } //lokasyonu
public bool AllDay { get; set; } //Tüm gün mü? seçeneği
}

Veri çekme işlemine geçmeden önce impersonation hatası almamak için BT biriminizin aşağıdaki linki incelemesi gerekmekte. Çünkü bir admin account lazım olacak.

http://msdn.microsoft.com/en-us/library/bb204095%28v=EXCHG.140%29.aspx

Şimdi sayfa içerisindeki kod bloklarına geçiyoruz. Buradaki metod günlük bazda seçilen tarihin appointment listesini vermektedir.
Kendinize göre değiştirerek günlük, haftalık, aylık veya iki tarih arası liste alabilirsiniz.


//Get User CalendarList
public List<AppointmentList> DayCalendarList(string UserSID, string UserName, DateTime date)
{
<pre>    //Exchange Const.
    static ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010); //ExChange versiyonu
    string mail = WebConfigurationManager.AppSettings["DomainName"], 
           parola = WebConfigurationManager.AppSettings["DomainParola"];
    // Üst kısımdaki mail ve parola, yazılımımız kullanacağı bir active directory kullanıcısıdır.
    // BT biriminizle görüşüp bu kullanıcızın tam olarak yetkilendirilmesini istemelisiniz yoksa Impersonation hatası alırsınız.
    // Impersonation hatası kimlik bürünme hatasıdır. Kimlik bürünme ise herhangi bir kullanıcının bilgisini istediğinizde o kullanıcı gibi davranıp istediğiniz yanıtı vermesini sağlar. Bir nevi Admin accounttur.
    //ExChange WebService Url
    Uri url = new Uri("https://domain.com/EWS/Exchange.asmx");
    //ExChange'imizin web servis yolu.</pre>
ServicePointManager.ServerCertificateValidationCallback = ExChangeValidate.CertificateValidationCallBack; //Buradaki ExChangeValidate.CertificateValidationCallBack metodu yukarıda belirttiğim CertificateValidationCallBack metotudur. Credential oluşturmamızı sağlar. ExChangeValidate ise classımın adıdır.
service.Url = url;
service.TraceEnabled = true;
service.TraceFlags = TraceFlags.All;
service.Credentials = new WebCredentials(mail, parola);
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SID, UserSID); //UserSID değerini active directory kullanıcından aldım. Bağlantı tipi olarak PrincipalName, SID veya SmtpAdress kullanabilirsiniz. Seçenek size kalmıştır.

DateTime PreviousStartDate = date; //istenilen tarih
DateTime PreviousEndDate = date.AddDays(1); //bitiş tarihi. ben günlük liste alacağım için 1 gün verdim. isterseniz 2. tarih değeri alıp iki tarih arası işlem yapabilirsiniz.
CalendarView calView = new CalendarView(PreviousStartDate, PreviousEndDate);

calView.PropertySet = new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.IsRecurring, AppointmentSchema.AppointmentType);

List<AppointmentList> items = new List<AppointmentList>();
//Active Directory hesabinda Exchange mail account'u tanımlı değilse exception fırlatır.
try
{
FindItemsResults<Appointment> findResults = service.FindAppointments(WellKnownFolderName.Calendar, calView); //Arama yapacak ExChange hizmeti ve parametresini veriyoruz ve gelen sonuçları bir listede topluyoruz.
foreach (Appointment appt in findResults.Items)
{
appt.Load();
items.Add(new AppointmentList() { EndDate = appt.End, EndTime = appt.End.TimeOfDay, Location = appt.Location, StartDate = appt.Start, StartTime = appt.Start.TimeOfDay, Subject = appt.Subject, UserName = UserName, AllDay = appt.IsAllDayEvent });
}
}catch{}
return items;
}

 

Yukarıda ki metodlarla sanırım calendar işlemlerinde yapmak istediklerimizi gerçekleştirmiş bulunuyoruz.

Bol kodlu günler..

3,831 total views, 2 views today

No Comments

Leave a Comment

Ulaşım için: Facebook: /ganigani Twitter: @abdulgani_demir


*

%d blogcu bunu beğendi: