동적 사용자의 Push Notification 등록


목차
  1. 파워쉘로 사용자 정보 알아내기
  2. Push Notification 등록 요청


 이전 포스트에서 파워쉘로 Active 사용자를 알아 내는 방법을 살펴 보았다. ( 2013/05/03 - [기타] - [Exchange] 동적 사용자의 Push Notification 등록 #1 ) 이제 이번 포스트에서는 Push Notification을 신청하도록 하자.


아래 '코드1'을 통해 Active mode의 Database에서 사용자를 가져와 Push Notification을 요청하는 코드이다.

/// <summary> /// Active Database를 이용해서 사용자 알아 내기 /// </summary> private static void RequestDatabase() {     // 요청자 사용자 리스트     var requestList = new List<string>();     // 요청된 사용자의 SubscriptionId 리스트     var subscriptionIdList = new ConcurrentDictionary<stringstring>();     // Task 리스트     var taskList = new List<System.Threading.Tasks.Task>();     // 파워쉘 명령으로 알아 내기     using (var powershellInvoker = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig()))     {         // 파워쉘 실행         foreach (var databaseItem in powershellInvoker.PipelineScriptInvoke("Get-MailboxDatabaseCopyStatus -active | select-object DatabaseName"))         {             // DatabaseName을 추출한다.             var databaseName = databaseItem.Members["DatabaseName"].Value.ToString();             // Get-Mailbox 파워쉘을 실행하여 사용자의 WindowsEmailAddress를 알아 낸다.             foreach (var user in powershellInvoker.PipelineScriptInvoke("Get-Mailbox -Database \"" + databaseName + "\" | select-object WindowsEmailAddress"))             {                 // 사용자의 이메일 주소                 var windowsEmailAddress = user.Members["WindowsEmailAddress"].Value.ToString();                 var databaseNameTemp = databaseName;                 var temp = System.Threading.Tasks.Task.Factory.StartNew(() =>                 {                     //GetRequest(databaseNameTemp, windowsEmailAddress);                     // List에 관리가 되도록 추가 한다.                     subscriptionIdList.TryAdd(GetRequestNotification(windowsEmailAddress), windowsEmailAddress);                 });                 // waiting 하기 위해 리스트에 넣어 둔다.                 taskList.Add(temp);             }         }     }     // 작업이 완료 될 때까지 대기 하도록 한다.     System.Threading.Tasks.Task.WaitAll(taskList.ToArray()); } /// <summary> /// 웹 서비스로 Subscription 신청 /// </summary> /// <param name="smtpAddress">메일 주소</param> private static string GetRequestNotification(string smtpAddress) {     try     {         string subscriptionId = null;         PushSubscription pushSubscription = null;         var ewsService = new ExchangeService(Microsoft.Exchange.WebServices.Data.ExchangeVersion.Exchange2013)         {             // 인증 정보 세팅             Credentials = new NetworkCredential("domain\\id""password")         };         // 이벤트 종류         var events = new List<EventType>() { EventType.CreatedEventType.Deleted };         // 폴더 범위         var folders = new List<FolderId>() { new FolderId(WellKnownFolderName.Inbox) };         pushSubscription = ewsService.SubscribeToPushNotifications(folders.ToArray(),                                                     new Uri("https://owa.mail.com/ews/exchange.asmx"),                                                     1,                                                     null,                                                     events.ToArray());         // Push Notification 요청하면 관리가 되도록 uniqueId를 반환한다.         subscriptionId = pushSubscription.Id;         return subscriptionId;     }     catch (Exception ex)     {         Console.WriteLine("{0}, {1}, {2}"smtpAddressex.Messagecount++);         throw;     } }

[코드1] Active mode database 사용자 추가


  RequestDatabase() 함수에서는 Database에서 사용자 정보를 추출하고, GetRequestNotification() 함수에서는 Exchange에 Push Notification 요청한다.






동적 사용자의 Push Notification 등록


목차
  1. 파워쉘로 사용자 정보 알아내기
  2. Push Notification 등록 요청


 여러 익스체인지 서버가 동시에 서비스가 되고 있고 Active Db, Passive Db가 서로간의 서버간에 복제가 되도록 구성이 되었을 때 Push Notification을 어떻게 등록할 것인지에 대한 한정된 주제에 대해서만 언급하도록 하겠다. 이 제한된 구성은 수 많은 MBX서버가 고 가용성을 위해 다른 서버에게 복제가 되도록 구성이 된 구조에서 파워쉘을 이용해 Active 된 Database 사용자만을 가져와 Push notification을 요청 하도록 한다.


 이제 진행해 보도록 하자. MBX 서버에는 내부적으로 Active mode Database가 있고 Passive mode Database가 존재하고 있다. 그중에서 메일을 직접적으로 받고 있는 사용자는 Active mode Database에 있는 사용자만이 익스체인지 MBX에서 메일을 받고 처리하며 받은 메일에 대해서 다른 서버에 복제되도록 구성된 Database에 복사가 된다. 그렇다면 현재 서버에서 Active mode의 Database를 가져오는 방법을 우선 알아야 할 것이다. 아래 '코드1'과 같은 방법으로 활성화된 Database를 가져올 수가 있다.

Get-MailboxDatabaseCopyStatus -active | select-object DatabaseName

[코드1] Active mode Database


 이 코드를 수행하면 현재 서버에서 활성화된 Database를 알수가 있다. ( DatabaseName만 필요하기에 Select-Object를 통해 필터링을 하였다 )



[그림1] '코드1'의 수행 결과


 이렇게 알아낸 DatabaseName중에 'HADB01' 사용자의 정보를 알아 내는 구문은 '코드2'와 같이 실행하면 나온다.


Get-Mailbox -Database "HADB01"

[코드2] 사용자 알아 내기




[그림2] 사용자 알아내기 수행 결과 화면


 위와 같은 방법으로 현 서버에서 작업이 되는 사용자의 정보를 알아 낼 수 있게 되었다. 이 정보를 가지고 Push Notification 하는 방법은 다음 포스트에서 이어 가도록 하겠다.





Impersonation by Powershell


참조 URL
  1. Configuring Exchange Impersonation
  2. Configure Exchange Server 2010 Impersonation

 

 Exchange를 이용한 관련 프로그램을 개발하기 위해 EWS를 이용하게 될때 Impersonation 기능을 이용해 일반 사용자 계정으로 가장을 하여 사서함에 접근하도록 개발해야 한다. 가장을 하기 위해서는 해당 계정이 가장(Impersonation)을 할 수 있는 권한을 할당해 줘야 에러가 발생하지 않고 가장을 할 수 있다. 이 권한이 할당되어 있지 않으면 'ImpersonateionId = new ...' 할 때 에러가 발생한다. 이럴 때 아래와 같이 익스체인지 파워쉘에서 아래와 같이 입력해  가장 권한을 할당해 주면 에러 없이 개인 사서함에 접근해 정보에 접근할 수 있다.


New-ManagementRoleAssignment –Name:impersonationAssignmentName –Role:ApplicationImpersonation –User:serviceAccount 

[표1] 가장 권한 할당 예제


 위와 같이 설정을 하면 아래와 같은 코드에서 에러없이 가장을 할 수 있을 것이다.

_service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddressaddress);

[코드1] C# 코드에서 가장하기


위 코드와 같이 가장이 완성이 되면 개인 계정에 접근하여 읽기 및 메일 발송, 일정, 그룹등 아이템 생성 및 수정을 할 수 있다.

+ Recent posts