동적 사용자의 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<string, string>(); // 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.Created, EventType.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}", smtpAddress, ex.Message, count++); throw; } }
[코드1] Active mode database 사용자 추가
RequestDatabase() 함수에서는 Database에서 사용자 정보를 추출하고, GetRequestNotification() 함수에서는 Exchange에 Push Notification 요청한다.