Office 365 ve Windows Azure Entegrasyonu 2 – MS Online Module for PowerShell

Önceki makalelerde Windows Azure üzerinde bir bulut uygulamasının en basit haliyle nasıl yapılandırıldığını, bu uygulamanın SQL Azure altyapısını kullanan bir bulut veritabanı ile nasıl ilişkilendirildiğini gördük. Diğer yandan da Office 365’in temel ayarlarını ve özelliklerini inceledik. Windows Azure-Office 365 entegrasyonu konusunu inceleyen ilk makalemizde Exchange Management Shell’in kullanımını gördük. O makalede anlatılan yöntem beta dönemi için kullanabileceğiniz tek seçenek gibiydi. Dolayısıyla işinizi bir yere kadar görüyordu. Örneğin yaratılan bu kullanıcıya O365 tarafında otomatik lisans atayamıyorsunuz. Belki uygulamanız içine O365 yönetim adresinin linkini verip, kullanıcıyı yaratan kişiyi oraya yönlendirip lisans atama işini manüel yapmasını söyleyebilirsiniz (Lisans atama için ilgili yazıma bakabilirsiniz).

İşin güzel tarafı, O365’in tam sürümü çıktığında, beraberinde bütün bu işlemler ve daha fazlası için faydalı araçlarla geldi: Microsoft Online Services Module for Windows PowerShell. PowerShell için MS Online Modülü ile birlikte PowerShell’i çalıştırarak uzaktan Office 365 hesabınızla ilgili olarak yönetim panelinin grafik arayüzünden yapabildiklerinizin neredeyse tamamını yapabilirsiniz ve altını çizmemiz gereken nokta da güncelleme ve geliştirmelerin sürekli olarak devam ettiği!

Aslında tahmin edersiniz ki bu modül, ev ya da çalışma ofisinizdeki dizüstü veya sunucuya kurulan client ya da server işletim sistemlerine kurulup manüel olarak iş görmeniz için tasarlanmış. Ancak bizim entegrasyon senaryolarımız gereği, bu modülü Windows Azure uygulamamızı barındırdığımız buluttaki sanal makineye kuracağız. Bu yüzden öncelikli olarak Windows Azure bulut uygulamamıza uzaktan masaüstü bağlantısının nasıl gerçekleştirildiğini önceki yazımdan öğrenebilirsiniz.

Uzaktan Masaüstü Bağlantısı ile bağlı olduğumuz Windows Azure uygulamamızın barındırıldığı sanal Windows Server 2008 R2 SP1 işletim sistemimize aşağıdaki ayarları yapmalıyız:

1. PowerShell için MS Online Modülü kullanmaya başlamadan önce sistemde Microsoft Online Services Sign-in Assistant’ın kurulu olması gerekir:

32-bit işletim sistemi için: http://g.microsoftonline.com/0BX00en/500
64-bit işletim sistemi için: http://g.microsoftonline.com/0BX00en/501

2. Sonrasında artık Microsoft Online Services Module for Windows PowerShell’i kurabiliriz:

32-bit işletim sistemi için: http://g.microsoftonline.com/0BD00en-US/85
64-bit işletim sistemi için: http://g.microsoftonline.com/0BD00en-US/126

3. Windows PowerShell’in hem 32 bit hem 64 bit exe’lerini çalıştırarak Set-ExecutionPolicy RemoteSigned komutunu girip Y diyoruz.

4. Uygulamamızın fiziksel olarak tutulduğu E sürücüsündeki approot ve siteroot klasörlerinde Network Service, Everyone, IUSR ve IIS USERS’a Write yetkisi veriyoruz.

5. IIS Manager’a girip Application Pool’dan uygulamanın kullandığı uzun-anlamsız-gibi-görünen isme sahip Application Pool’u seçip Advanced Settings’ten, Identity’sini değiştirelim. Normalde varsayılan olarak Network Service seçilidir, ancak bu birtakım erişim hatalarına yol açacağından uzaktan masaüstü bağlantısı yaptığınız kullanıcı adı ve şifresi neyse o bilgileri yeni Application Pool identity’si olarak giriyoruz (Uzaktan bağlandığınız kullanıcı tüm sistemde yazma yetkisine sahip olduğundan herhangi bir yetki sorunu yaşamamayı böylece garantilemiş oluyoruz).

Artık Visual Studio’ya dönüp tek WebRole’lü Windows Azure uygulamamızda C# ile PowerShell scripti yaratıp okumak için gereken kodları yazabiliriz.

Oluşturacağımız yeni bir sayfanın codebehind’ının başına aşağıdaki kütüphaneleri eklemeyi unutmayalım:

using System.IO;

using System.Management;

using System.Management.Automation;

using System.Management.Automation.Host;

using System.Management.Automation.Runspaces;

Ayrıca önceden alınmış O365 hesabınızın admin yetkisine sahip kullanıcının adını ve şifresini bir yere not edin. Sitenizin tasarımına göre ister textbox’lardan alıp parametre olarak göndererek ister doğrudan kodun içine gömerek bu bilgileri aşağıdaki metotta kullanacağız:

public bool CreateUserOn365(string userPrincipalName, string displayName, string firstName, string lastName, string newPassword, string exactDomain, string companyName)

            {

                try

                {

                    string credentialID = “admin@pavelslavov.onmicrosoft.com”;

                    string credentialPW = “Passw0rd”;

 

                    string planType = GetO365PlanType(credentialID,credentialPW);

                                     

                      string[] psScript = { @"$pass = convertto-securestring -asplaintext """ + credentialPW + @""" -force",

                                    @"$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist """ + credentialID + @""", $pass",

                                    @"Import-Module MSOnline",

                                    @"Connect-MsolService -Credential $credential",

                                    @"New-MsolUser -UserPrincipalName " + userPrincipalName + @" -DisplayName """ + displayName + @""" -FirstName """ + firstName + @""" -LastName """ + lastName + @""" -Password """ + newPassword + @""" -PasswordNeverExpires $true -ForceChangePassword $false -UsageLocation ""US""",

                                    @"Set-MsolUserLicense -UserPrincipalName " + userPrincipalName + @" -AddLicenses """ + planType + "\"",

                                    ""};

                    if (File.Exists(common.getPath("scriptNewUser.ps1")))

                        File.Delete(common.getPath("scriptNewUser.ps1"));

                    System.IO.File.WriteAllLines(common.getPath("scriptNewUser.ps1"), psScript);

                    RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();

                    Runspace myRunspace = RunspaceFactory.CreateRunspace(rsConfig);

                    myRunspace.Open();

                    Command command = new Command(common.getPath("scriptNewUser.ps1"));

                    Pipeline pipeline = myRunspace.CreatePipeline();

                    pipeline.Commands.Add(command);                 

                    StringBuilder stringBuilder = new StringBuilder();

                    Collection<PSObject> results = pipeline.Invoke();

                    // check for errors (non-terminating) 

                    if (pipeline.Error.Count > 0)

                    {

                        //iterate over Error PipeLine until end 

                        while (!pipeline.Error.EndOfPipeline)

                        {

                            //read one PSObject off the pipeline 

                            var value = pipeline.Error.Read() as PSObject;

                            if (value != null)

                            {

                                //get the ErrorRecord 

                                var r = value.BaseObject as ErrorRecord;

                                if (r != null)

                                {

                                    //build whatever kind of message your want 

                                    stringBuilder.AppendLine(r.InvocationInfo.MyCommand.Name + " : " + r.Exception.Message);

                                    stringBuilder.AppendLine(r.InvocationInfo.PositionMessage);

                                    stringBuilder.AppendLine(string.Format("+ CategoryInfo: {0}", r.CategoryInfo));

                                    stringBuilder.AppendLine(

                                    string.Format("+ FullyQualifiedErrorId: {0}", r.FullyQualifiedErrorId));

                                }

                            }

                        }

                        pipeline.Dispose();

                        myRunspace.Close();

                        myRunspace.Dispose();

                        rsConfig = null;

                        db.Dispose();

                        //if pipeline has any errors, not exceptions, the user will be created and must be deleted because of the errors

                        //the following script deletes the user from Office 365

                        try

                        {                           

                            string[] script = { @"$pass = convertto-securestring -asplaintext """ + credentialPW + @""" -force",

                                        @"$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist """ + credentialID + @""", $pass",

                                        @"Import-Module MSOnline",

                                        @"Connect-MsolService -Credential $credential",

                                        @"Remove-MsolUser -UserPrincipalName " + userPrincipalName + " -force",

                                        ""};

                            if (File.Exists(common.getPath("scriptDeleteUser.ps1")))

                                File.Delete(common.getPath("scriptDeleteUser.ps1"));

                            System.IO.File.WriteAllLines(common.getPath("scriptDeleteUser.ps1"), script);

                            RunspaceConfiguration config = RunspaceConfiguration.Create();

                            Runspace runspace = RunspaceFactory.CreateRunspace(config);

                            runspace.Open();

                            Command cmd = new Command(common.getPath("scriptDeleteUser.ps1"));

                            Pipeline pipe = runspace.CreatePipeline();

                            pipe.Commands.Add(cmd);

                            pipe.Invoke();

                            pipe.Dispose();

                            runspace.Close();

                            runspace.Dispose();

                            config = null;

                        }

                        catch (Exception ex)

                        {

                            common.CreateLog(ex.ToString());

                        }

 

                        return false;

                    } 

                    pipeline.Dispose();

                    myRunspace.Close();

                    myRunspace.Dispose();

                    rsConfig = null;

                    db.Dispose();

 

                    return true;

                }

                catch (Exception e)

                {

                    return false;

                }           

            }

Bu metot ile, bir string array içine satır satır PowerShell komutları giriyoruz. İlk önce O365 şifremizi SecureString’e çeviriyor ve kullanıcı adımızla beraber credential değişkenine atıyoruz. Sonrasında ise yukarıdaki adımlarda yüklediğimiz MS Online modülünü üzerimize import ediyoruz ve Connect-MsolUser cmdlet’iyle kullanıcı ve şifremizi doğrulatarak hesabımıza bağlanıyoruz. New-MsolUser cmdlet’i otomatik olarak kullanıcımızın O365 tarafında girdiğimiz çeşitli parametrelerdeki bilgilerle yaratılmasını sağlıyor. Set-MsolUserLicense cmdlet’i ise önceki adımda yaratılan kullanıcıya lisans atanmasını sağlıyor. Bunun otomatik olması için metodun en başlarında aşağıdaki koda sahip metot çağırılıyor:

public string GetO365PlanType(string credentialID, string credentialPW)

            {

                try

                {

                    string[] psScript = { @"$pass = convertto-securestring -asplaintext """ + credentialPW + @""" -force",

                                    @"$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist """ + credentialID + @""", $pass",

                                    @"Import-Module MSOnline",

                                    @"Connect-MsolService -Credential $credential",

                                    @"Get-MsolAccountSku",

                                    ""};

 

                    if (File.Exists(common.getPath("scriptGetPlan.ps1")))

                        File.Delete(common.getPath("scriptGetPlan.ps1"));

                    System.IO.File.WriteAllLines(common.getPath("scriptGetPlan.ps1"), psScript);

                    RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();

                    Runspace myRunspace = RunspaceFactory.CreateRunspace(rsConfig);

                    myRunspace.Open();

                    Command command = new Command(common.getPath("scriptGetPlan.ps1"));

                    Pipeline pipeline = myRunspace.CreatePipeline();

                    pipeline.Commands.Add(command);

                    StringBuilder stringBuilder = new StringBuilder();

                    Collection<PSObject> results = pipeline.Invoke();

                    // check for errors (non-terminating) 

                    if (pipeline.Error.Count > 0)

                    {

                        //iterate over Error PipeLine until end 

                        while (!pipeline.Error.EndOfPipeline)

                        {

                            //read one PSObject off the pipeline 

                            var value = pipeline.Error.Read() as PSObject;

                            if (value != null)

                            {

                                //get the ErrorRecord 

                                var r = value.BaseObject as ErrorRecord;

                                if (r != null)

                                {

                                    //build whatever kind of message your want 

                                    stringBuilder.AppendLine(r.InvocationInfo.MyCommand.Name + " : " + r.Exception.Message);

                                    stringBuilder.AppendLine(r.InvocationInfo.PositionMessage);

                                    stringBuilder.AppendLine(string.Format("+ CategoryInfo: {0}", r.CategoryInfo));

                                    stringBuilder.AppendLine(

                                    string.Format("+ FullyQualifiedErrorId: {0}", r.FullyQualifiedErrorId));

                                }

                            }

                        }

                        pipeline.Dispose();

                        myRunspace.Close();

                        myRunspace.Dispose();

                        rsConfig = null;

                        return "false";

                    }

 

                    if (results.Count > 0)

                    {

                        stringBuilder = new StringBuilder();

                        foreach (PSObject obj in results)

                        {

                            foreach (PSPropertyInfo psPropertyInfo in obj.Properties)

                            {

                                //get the value of plan type for the given account sku

                                if (psPropertyInfo.Name == "AccountSkuId")

                                    stringBuilder.AppendLine(psPropertyInfo.Value.ToString().Trim());

                            }

                        }

                        pipeline.Dispose();

                        myRunspace.Close();

                        myRunspace.Dispose();

                        rsConfig = null;

 

                        string output = stringBuilder.ToString().Trim();

 

 

                        return output;

                    }

                    else

                        return "false";

                }

 

                catch (Exception e)

                {

                    common.CreateLog(e.ToString());

                    return "false";

                }

            }

Bu metot ile O365 hesabınıza giriş yapıp Get-MsolAccountSku cmdlet’iyle hesabınızda hangi lisans planını kullandığınızın bilgisi öğreniliyor ve bu bilgi, işlemi yaptıran üstteki metoda gönderiliyor.

İşlemler başarıyla tamamlanırsa, O365 hesabınızın kullanıcı adı ve şifresi ile yaratacağınız yeni kullanıcının sadece ad ve soyadı bilgileri Windows Azure’daki ASP.NET uygulamanızdan girilerek arka planda otomatik olarak O365 hesabınıza provize edilmesi sağlanmış oluyor.

Kodlara daha dikkatli bakarsanız, PowerShell script’leri çalıştırılırken alınabilecek hata mesajlarını da yakalayabiliyoruz, bunları da dilerseniz kullanıcıya gösterebilirsiniz.

O365’in PowerShell ile yönetimi hakkında daha fazla bilgi ve MS Online Module for PowerShell’in mevcut tüm cmdlet’lerinin listesi için buraya ve buraya tıklayınız.

Windows Azure ve O365’in entegrasyonunu anlatmaya devam edeceğim yazılar için takipte kalın!

Share

Lync Online Web Scheduler’a Hızlı Bir Bakış

Bilindiği üzere Microsoft’un Office 365 Hizmet-olarak-Yazılım (SaaS) ürünü belirli aralıklarla güncelleştirilmekte ve gerek teknik, gerek genel hizmet, gerekse özellik bakımından sürekli geliştirilmektedir. Dilerseniz Aralık 2011’de çıkan güncelleştirmede yayınlanan Lync Online Web Scheduler’a kısa bir göz atalım.

Lync Online Web Scheduler (LOWS), kurumunuz çalışanları, kurumunuz iş ortakları ya da şirket dışında olup iletişime geçme ihtiyacı hissettiğiniz herhangi bir kişi dahil, birden fazla değişik teknik altyapıya sahip birçok farklı seviyedeki kişiyi online olarak sesli, görüntülü, ve anlık mesajla yazılı olarak iletişim ortamında buluşturan bir araçtır.

LOWS, kurum lokalinde bulunan Lync Server veya Office Communications Server ile kurumun dışardan hizmet olarak aldığı Lync Online altyapılarını kullanan kişileri, bu altyapılarla uyumlu çalışan konvansiyonel telefon, Lync Client, Lync Attendant, Office Communicator Client ya da Lync Web App ile birleşik iletişime geçmeleri için online toplantı ayarlama sihirbazı gibi düşünülebilir. Yani LOWS ile organize edilmiş bir toplantıda, farklı, alternatif çözümler kullanan kişiler telekonferans, dosya paylaşma, beyaztahta çalıştırma veya masaüstü paylaşma gibi seçeneklerle her an her yerden bilgi alışverişinde bulunabiliyorlar.

LOWS ile kurum çalışanı bir kişi online toplantı için gerekli bilgileri girer: tarih, saat, katılımcılar, toplantı konusu vb. gibi. Daha sonra katılabilecek kişileri seçerek herkese bir davet gönderir. Daveti alan kişilerden, bir tarafta Lync Desktop Client kullanan, diğer tarafta Lync Web App kullananların neler yapabildiğini görelim.

PowerPoint sunumu paylaşıp onun üzerinde fikir alışverişi yapabilirler:

lync web scheduler 01

Anket hazırlayıp katılımcılar arasında oylama yapabilirler:

lync web scheduler 03

Birisinin paylaştığı masaüstü görüntüsü üzerinde belge ve program hakkında tartışabilirler:

lync web scheduler 04

Telefondan konuşan birisini sohbete dahil edebilirler:

lync web scheduler 05

Farklı şekillerde birlikte çalışma ortamı yaratarak tartışmalarını zenginleştirebilirler:

lync web scheduler 06

Lync Online Web Scheduler’ı test etmek için bir Office 365 hesabına hemen sahip olabilirsiniz!

Durmayın siz de deneyin!

Share

Office 365 ve Windows Azure Entegrasyonu 1 -Exchange Management Shell

Önceki makalelerde Windows Azure üzerinde bir bulut uygulamasının en basit haliyle nasıl yapılandırıldığını, bu uygulamanın SQL Azure altyapısını kullanan bir bulut veritabanı ile nasıl ilişkilendirildiğini gördük. Diğer yandan da Office 365’in temel ayarlarını ve özelliklerini inceleyip farklı ihtiyaçlara nasıl cevap verebildiğini gördük. Şimdi ise, müjdesini verdiğim Windows Azure-Office 365 entegrasyonu konusunu inceleyen ilk makalemize başlayalım.

Bugün itibariyle Microsoft’un Windows Live, Bing, Windows Intune gibi bulut bilişim çözümleri Microsoft verimerkezlerinde kendi platformlarını kullanarak hizmet vermektedir. Office 365 (O365) ve Dynamics CRM Online da keza aynı durumda. Ancak, Microsoft’un kurum içi kullandığı uygulamaları yavaş yavaş Windows Azure Platformu’na aktardığı bilinmektedir. İleriki zamanlarda yukarıda sayılan diğer bulut çözümlerinin de Azure Platformu’nu kullanacak şekilde yenilenmesi söz konusu olabilir. Fakat Aralık 2011 itibariyle Windows Azure ve O365 farklı altyapılarda çalışan farklı platformları temsil ediyorlar (her ne kadar bazı verimerkezlerinde her ikisinin sunucu konteynerleri yan yana durabiliyor olsa da). İhtiyacınız olur da satın aldığınız O365 hizmetini Azure’da barındırdığınız uygulamanızla bir şekilde uyumlu hale getirmek ve ilişkilendirmek istediniz, imdadınıza yetişen çözümler elbette yok değil!

Windows PowerShell komut satırı aracı, ortaya çıktığı 2007 yılından bu yana sürekli gelişim göstermiş ve otomasyon, uzaktan yönetim, hızlı ve katılımsız kurulum konularında sistem yöneticilerinin vazgeçilmezlerinden olmayı başarmıştır. Windows 8 ve System Center 2012 dalgasıyla beraber konumu daha da güçlenecek ve özellikle otomasyon işlemleri gibi bulut kavramının olmazsa olmazı için kullanılan en önemli araçlardan biri olacaktır. O365 için de 2011 başlarındaki beta sürecinden bu yana gittikçe zenginleşen PowerShell cmdlet setleri yayınlanmakta. Öncelikle Haziran 2011 sonunda betadan çıkıp ticari olarak son kullanıcıya açılmadan önce PowerShell ile O365 üzerinde neler yapabildiğimize bakalım. Aslında bunları hala da yapabiliyoruz ancak daha sonra yayınlanan özel PowerShell modülleri ile işler çok çok kolaylaştığı için çok tavsiye edilmez, ancak nelerin mümkün olduğunu bize gösterebilir.

Windows Server Active Directory domain yapısına aşina iseniz, Exchange Server kurulu bir domaininiz varsa Exchange üzerinde yaratılan bir User Mailbox (Kullanıcı Mailkutusu)’ına karşılık Active Directory Users and Computers tarafında otomatik olarak o kullanıcının objesinin yaratıldığını biliyorsunuzdur. Ancak eğer ortamınızda SharePoint Server varsa, portale erişim için muhtemelen özel izinler tanımlandığından fazladan birkaç adımla bu kullanıcıya portalde izin vermeniz gerekiyor. Aynı şey Lync Server için de geçerli, yaratılan yeni kullanıcının Lync üzerinde Enable edilmesi gerekiyor. Benzer bir mantık O365‘te de mevcut.

Yazının gidişatından tahmin edeceğiniz gibi, O365’te Exchange Server’ın karşılığı olan Exchange Online üzerinde bir kullanıcıyı uzaktan yönetim ile yaratacağız. Normal şartlarda Exchange Server kurulu olan bir Windows Server işletim sistemine Exchange Server Management Tools ile birlikte PowerShell için Exchange Management Shell yüklenmektedir. Bu Shell sayesinde, Exchange için genişletilmiş ve özelleştirilmiş PowerShell cmdlet’lerine kavuşuyoruz. Amacımız bu Shell aktive edilmiş PowerShell komutlarını Azure’da barındırılan ASP.NET tabanlı ve arkasında C# olan bir uygulamadan çalıştırmak.

İlk olarak Windows SDK 7 yükleyip “C:\WINDOWS\assembly\GAC_MSIL\System.Management.
Automation\1.0.0.0__31bf3856ad364e35” yolunda bulunan System.Manament.Automation.dll’i Visual Studio’da oluşturduğumuz tek WebRole’lü Azure projemize Referans olarak ekleyelim. PowerShell’i çalıştırarak şu komutu yazalım ve onay istendiğinde Yes diyelim: Set-ExecutionPolicy RemoteSigned. Uygulama içinden cmdlet çalıştırma izni vermiş olduk. Sonrasında Default.aspx.cs ya da oluşturacağımız yeni bir sayfanın codebehind’ının başına aşağıdaki kütüphaneleri ekleyelim:

   1: using System.IO;

   2: using System.Management;

   3: using System.Management.Automation;

   4: using System.Management.Automation.Host;

   5: using System.Management.Automation.Runspaces;

Önceden alınmış O365 hesabınızın admin yetkisine sahip kullanıcının adını ve şifresini bir yere not edin. Sitenizin tasarımına göre ister textbox’lardan alıp parametre olarak göndererek ister doğrudan kodun içine gömerek bu bilgileri aşağıdaki metotta kullanacağız:

   1: private String getPath(String path)

   2: {

   3:     return System.Web.HttpContext.Current.Server.MapPath("~/" + path);

   4: }

   5:  

   6:  

   7: public Boolean CreateUserOnExchangeOnline(string userName, string firstName, string lastName, string password,

   8:                  string phone, string professionTitle)

   9: {

  10:    try

  11:    {

  12:       string alias = firstName + lastName;

  13:       string displayName = firstName + " " + lastName;

  14:       string userPrincipalName = userName + "@pavelslavov.onmicrosoft.com";

  15:       Boolean passExc = false;

  16:  

  17:       string[] remoteScript = { @"$pass = convertto-securestring -asplaintext ""Passw0rd"" -force",

  18:                               @"$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist ""admin@pavelslavov.onmicrosoft.com"" , $pass",

  19:                               @"$s = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $credential -Authentication Basic -AllowRedirection",

  20:                               @"Import-PSSession $s",

  21:                               @"New-Mailbox -Name:""" + userName + @""" -Password (ConvertTo-SecureString -String '" + password + @"' -AsPlainText -Force) -MicrosoftOnlineServicesID " + userPrincipalName + @" -displayName:""" + displayName + @""" -PrimarySmtpAddress:""" + userPrincipalName + @""" -Alias:""" + alias + @""" -FirstName:""" + firstName + @""" -lastName:""" + lastName + @"""",

  22:                               @"Set-User -Identity " + userPrincipalName + @" -Confirm: $False -MobilePhone " + phone + @" -Title " + professionTitle + "",

  23:                               @"Remove-PSSession $s",

  24:                               ""};

  25:        if (File.Exists(getPath("newUserScript.ps1")))

  26:            File.Delete(getPath("newUserScript.ps1"));

  27:        System.IO.File.WriteAllLines(getPath("newUserScript.ps1"), remoteScript);

  28:        RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();

  29:        Runspace myRunspace = RunspaceFactory.CreateRunspace(rsConfig);

  30:        myRunspace.Open();

  31:        Command command = new Command(getPath("newUserScript.ps1"));

  32:        Pipeline pipeline = myRunspace.CreatePipeline();

  33:        pipeline.Commands.Add(command);

  34:        //powershell erroru olursa yakalamak ve yazdırmak için stringbuilder kullanıyoruz

  35:        StringBuilder stringBuilder = new StringBuilder();

  36:        Collection<PSObject> results = pipeline.Invoke();

  37:  

  38:        if (pipeline.Error.Count > 0)

  39:        {

  40:          while (!pipeline.Error.EndOfPipeline)

  41:          {

  42:            var value = pipeline.Error.Read() as PSObject;

  43:            if (value != null)

  44:            {

  45:              var r = value.BaseObject as ErrorRecord;

  46:              if (r != null)

  47:              {

  48:                stringBuilder.AppendLine(r.InvocationInfo.MyCommand.Name + " : " + r.Exception.Message);

  49:                stringBuilder.AppendLine(r.InvocationInfo.PositionMessage);

  50:                stringBuilder.AppendLine(string.Format("+ CategoryInfo: {0}", r.CategoryInfo));

  51:                stringBuilder.AppendLine(

  52:                string.Format("+ FullyQualifiedErrorId: {0}", r.FullyQualifiedErrorId));

  53:              }

  54:            }

  55:          }

  56:        //stringBuilder.ToString() ile aldığınız erroru bir yere yazdırabilirsiniz

  57:        pipeline.Dispose();

  58:        myRunspace.Close();

  59:        myRunspace.Dispose();

  60:        rsConfig = null;

  61:  

  62:        passExc = true;

  63:                             

  64:        if (passExc)

  65:           return true;

  66:        else

  67:           return false;

  68:    

  69:     }

  70:     catch (Exception e)

  71:     {

  72:        return false;

  73:     }

  74: }

Bu metot ile, bir string array içine satır satır PowerShell komutları giriyoruz. İlk önce O365 şifremizi SecureString’e çeviriyor ve kullanıcı adımızla beraber credential değişkenine atıyoruz. Sonrasında ise bu değişkeni kullanarak Exchange Online’ın uzaktan erişim için kullanılan adresinden Exchange Management Shell oturumunu (session) kendi üzerimize import ediyoruz. Artık Exchange’e özel cmdlet’leri çalıştırabilir hale geldik. Yeni kullanıcı yaratmak için New-Mailbox cmdlet’ini kullanıyoruz. New-Mailbox parametreleri ile giremediğimiz Phone ve Title gibi bilgileri ise Set-User ile atıyoruz (Tıpkı Exchange Server cmdlet’leriyle atayamadıklarımızı LDAP çekerek otomatik oluşturulan Active Directory User objesine ek bilgi atadığımız gibi). Oturumu kapattıktan sonra bu array’i bir PowerShell script dosyası (.ps1 uzantılı) olarak uygulamanın olduğu dizine kaydediyoruz. Sonrası ise C#’tan PowerShell script çalıştırmanın rutin işlemleri. Runspace oluşturup script’i commad nesnesi olarak gösterip bunu pipeline’a sokuyorsunuz ve satır satır çalıştırılmasını sağlıyorsunuz. Dikkat ederseniz array’in son elemanı boşluk, bunun sebebi PowerShell komutunu çalıştırmak için komutu yazdıktan sonra Enter’a basmak gerekliliğini simüle etmek.

Her şey yolunda giderse bu komutu çalıştırınca aşağıdakine benzer bir script çalıştırılmış ve Azure uygulamanız üzerinden O365 hesabınızla yeni bir kullanıcı yaratmış olacaksınız:

$pass = convertto-securestring -asplaintext "Passw0rd" -force

$credential = new-object -typename System.Management.Automation.PSCredential -argumentlist "admin@pavelslavov.onmicrosoft.com" , $pass

$s = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $credential -Authentication Basic -AllowRedirection

Import-PSSession $s

New-Mailbox -Name:"pavel.slavov" -Password (ConvertTo-SecureString -String 't3H6Kjw4XB' -AsPlainText -Force) -MicrosoftOnlineServicesID pavel.slavov@pavelslavov.onmicrosoft.com -displayName:"pavel slavov" -PrimarySmtpAddress:"pavel.slavov@pavelslavov.onmicrosoft.com" -Alias:"pavelslavov" -FirstName:"pavel" -lastName:"slavov"

Set-User -Identity pavel.slavov@pavelslavov.onmicrosoft.com -Confirm: $False -MobilePhone 905355555555 -Title CIO

Remove-PSSession $s

 

(Kullanılabilecek diğer Exchange Online cmdlet’leri için buraya bakınız.)

Daha önce bahsettiğim üzere, bu yöntem beta dönemi için kullanabileceğiniz tek seçenek gibiydi. Dolayısıyla işinizi bir yere kadar görüyordu. Örneğin yaratılan bu kullanıcıya O365 tarafında otomatik lisans atayamıyorsunuz. Belki uygulamanız içine O365 yönetim adresinin linkini verip, kullanıcıyı yaratan kişiyi orya yönlendirip lisans atama işini manüel yapmasını söyleyebilirsiniz (Lisans atama için önceki yazıma bakabilirsiniz).

İşin güzel tarafı, O365’in tam sürümü çıktığında, beraberinde bütün bu işlemler ve daha fazlası (otomatik lisans atama dahil) için faydalı araçlarla geldi. Windows Azure ve O365’in entegrasyonunu bu yeni özelliklerle anlatacağım bir sonraki yazım için takipte kalın!

Share