[Exchange] Exchange의 EWS에서 일정관련 연계 작업시 GlobalObjectId를 이용해 일정 찾기


일정을 사용자가 작성하면 ItemId와 GlobalObjectId가 생성이 된다. 

ItemId는 Exchange에서 Item을 인식하는 Unique 값으로 유일한 값을 나타낸다. 그리고 다른 사용자와의 일정에서 공통적인 값을 GlobalObjectId를 사용하여 같은 일정인지를 알아 낼 수 있다.


사용자A가 일정을 만들 때 사용자B를 참조인으로 입력 후 생성하면


사용자A : ItemId : aa1, GlobalObjectId : abcdef

사용자B : ItemId : bb1, GlobalObjectId : abcdef


와 같이 생성이 되게 된다.



그러면 타 시스템에서 EWS를 사용하여 정보를 알아 내기 위해서 아래와 같은 코드로 GlobalObjectId를 가져올 수 있다.


Appointment exItem = null;
 
// GlobalObjectId
ExtendedPropertyDefinition globalObjectId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Meeting0x03MapiPropertyType.Binary);
 
//하나의 객체에 대해서만 바인딩
exItem = Item.Bind(service.Servicenotification.ItemIdnew PropertySet(
            ItemSchema.Id,
            ItemSchema.Subject,
            AppointmentSchema.ICalUid,
            globalObjectId)) as Appointment;

[코드1] GlobalObjectId의 값을 가져오는 코드


위 코드에서 ExtendedPropertyDefinition으로 확장 프로퍼티를 사용해서 가져와야 하며 선언 시 '0x03'을 입력하고 Binary를 선택해야 한다. 이제 넘겨진 값을 '코드2'에서와 같이 스트링으로 변환해서 사용 할 수 있다.


Convert.ToBase64String((byte[])exItem.ExtendedProperties[0].Value);

[코드2] Binary 형식을 스트링으로 변환하는 코드



이와 같은 코드로 다른 시스템과 연계하여 여러사람에 관계된 같은 일정을 찾아서 변경 해 줄 수 있을 것이다. 그렇지만 예외 케이스가 있다. 반복 일정에서 특정 항목만 편집하여 참조인을 추가 하는 케이스에서는 GlobalObjectId가 변경이 일어 나게 된다. 아래 글에서 설명이 나와 있다.



Using GlobalObjectId poses a problem however…If you were to create a recurring appointment and invite one attendee for only one instance of that recurring appointment that attendee ends up with only the one exception instance of the parent recurring appointment in their calendar.  This is called an “orphaned” appointment.  This type of appointment’s GlobalObjectId has additional information in it related to the exception date (for more information look at PidLidGlobalObjectId in MS-OXOCAL).  The bottom line here is that this orphaned instance in this one attendee’s calendar will have a GlobalObjectId, and therefore UID, which doesn’t match the related appointments in the other attendee’s and organizer’s calendar.  Henning’s code won’t work in this specific scenario…


참조 URL : http://blogs.msdn.com/b/mstehle/archive/2009/09/02/ews-uid-not-always-the-same-for-orphaned-instances-of-the-same-meeting.aspx


 


그래서 위의 문제점과 관련하여 CleanGlobalObjectId 라는 것이 존재하고 이는 위의 같은 CASE일때도 Id가 달라 지지 않는 프로퍼티를 사용해야 할 것이다.


The format of this property is the same as that of LID_GLOBAL_OBJID (PidLidGlobalObjectId). The value of this property must be equal to the value of LID_GLOBAL_OBJID, except the YH, YL, M, and D fields must be zero. All objects that refer to an Instance of a recurring series (including an orphan instance), as well as the recurring series itself, will have the same value for this property.


참고 URL : http://msdn.microsoft.com/en-us/library/cc839502.aspx



그래서 결론 적으로 아래 코드처럼 ClearnGlobalObjectId를 사용해서 값을 가져와서 연계 하면 변하지 않는 값으로 외부 시스템과 연동할 수 있을 것이다.


// GlobalObjectId
// ExtendedPropertyDefinition globalObjectId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Meeting, 0x03, MapiPropertyType.Binary);
 
// LID_GLOBAL_OBJID 
ExtendedPropertyDefinition globalObjectId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Meeting0x23MapiPropertyType.Binary);

[코드3] ClearnGlobalObjectId로 변경한 코드








일정에 따르는 내부 이벤트 정보

( Item, GlobalObjectId 추적 )



 반복 일정에서 ItemId와 GlobalObjectId의 상관 관계 그리고 수정에 대해서 알아 보고자 한다. 일정 관련 개발시 또는 연동 때문에 여러가지 케이스에 대해서 밑에와 같이 정리해 보았다. 익스체인지 일정은 과거 일정과 미래 일정이 현재 일을 포함 할 경우 이전 일정에 대해서는 새로 생성을 하고 기존 일정을 수정하여 처리하고 있다. 이렇게 변경되는 사항들을 잘 정리해서 쉽게 일정 연동을 할 수 있기를 바라겠다.



밑에서 나온 분석 자료에서 'Uid'가 익스체인지의 ItemId임을 주지 하기 바랍니다.



1. 현재일 보다 미래 일정에 대해서 수정
 
8월 12일 반복 시작일

1.1  화요일 반복 일정 생성
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpB3AAA=","EMail":"test@test.com","Tstamp":"635116401739714845","Title":"반복 테스트 #1 화요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAABqFxwHnpTOAQAAAAAAAAAAEAAAAErmMOMEWQpJoohCYDFvDhU=","EventType":"Created"}

1.2 화요일 반복 일정 생성 전체 일정 수정
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpB3AAA=","EMail":"test@test.com","Tstamp":"635116403135292644","Title":"반복 테스트 #1 화요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAABqFxwHnpTOAQAAAAAAAAAAEAAAAErmMOMEWQpJoohCYDFvDhU=","EventType":"Modified"}

1.3 화요일 반복 일정 한 항목만 수정 - 날짜 수정 없음
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpB3AAA=","EMail":"test@test.com","Tstamp":"635116432690946758","Title":"반복 테스트 #1 화요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAABqFxwHnpTOAQAAAAAAAAAAEAAAAErmMOMEWQpJoohCYDFvDhU=","EventType":"Modified"}

1.4 화요일 반복 일정 한 항목만 수정 - 날짜 수정 있음
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpB3AAA=","EMail":"test@test.com","Tstamp":"635116433589856729","Title":"반복 테스트 #1 화요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAABqFxwHnpTOAQAAAAAAAAAAEAAAAErmMOMEWQpJoohCYDFvDhU=","EventType":"Modified"}

1.5 화요일 반복 일정 - 모든 반복 일정 삭제
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpB3AAA=","EMail":"test@test.com","Tstamp":null,"Title":null,"GlobalObjectId":null,"EventType":"Deleted"}
 
1.6 반복 일정중에서 한 항목에 대해서만 삭제
2013-08-09 11:29:29,239 [ 116] INFO Default - SonicMQ send : {"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpBzAAA=","EMail":"test@test.com","Tstamp":"635116445692231978","Title":"토요 반복 일정","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAADuh2SPJZTOAQAAAAAAAAAAEAAAAK8400lwUDdGhrjVUfWxnmQ=","EventType":"Modified"}
2013-08-09 11:29:34,066 [ 116] INFO Default - SonicMQ send : {"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpBzAAA=","EMail":"test@test.com","Tstamp":"635116445740518419","Title":"토요 반복 일정","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAADuh2SPJZTOAQAAAAAAAAAAEAAAAK8400lwUDdGhrjVUfWxnmQ=","EventType":"Modified"}
2013-08-09 11:29:44,145 [ 105] INFO Default - SonicMQ send : {"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpBzAAA=","EMail":"test@test.com","Tstamp":"635116445840891818","Title":"토요 반복 일정","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAADuh2SPJZTOAQAAAAAAAAAAEAAAAK8400lwUDdGhrjVUfWxnmQ=","EventType":"Modified"}
 
1.7 반복일정의 최종 삭제
2013-08-09 11:29:49,043 [ 133] INFO Default - SonicMQ send : {"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpBzAAA=","EMail":"test@test.com","Tstamp":null,"Title":null,"GlobalObjectId":null,"EventType":"Deleted"}
 
 
 금일(오늘)을 포함하지 않는 미래의 일정은 ItemId와 GlobalObjectId가 변경되지 않고 예상되로 반복 일정 수정이 일어 나고 있다. 



 
2. 과거일에서 현재일 포함 미래일 범위의 일정에 대해서 수정
 
 
8월 1일 반복 시작일

2.1 과거 목요일 반복 일정 생성
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpCDAAA=","EMail":"test@test.com","Tstamp":"635116536408209382","Title":"반복일정 테스트 #3 - 목요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAADIsGZkvZTOAQAAAAAAAAAAEAAAAL7jcbkKvu5CkiLigoQ5+PI=","EventType":"Created"}

2.2 과거 목요일 반복 일정 변경 - 범위만 변경
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpCDAAA=","EMail":"test@test.com","Tstamp":"635116536652862034","Title":"반복일정 테스트 #3 - 목요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAADIsGZkvZTOAQAAAAAAAAAAEAAAAL7jcbkKvu5CkiLigoQ5+PI=","EventType":"Modified"}
 
2.3 과거 목요일 반복 일정 변경 - 반복일을 금요일로 날짜 변경

2.3.1 과거 목요일 반복 일정 변경 - 금요일로 날짜 변경 - 8월 9일 이전의 일정이 새로 생성 됨
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpCEAAA=","EMail":"test@test.com","Tstamp":"635116537102912102","Title":"반복일정 테스트 #3 - 목요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAADIsGZkvZTOAQAAAAAAAAAAEAAAAL7jcbkKvu5CkiLigoQ5+PI=","EventType":"Created"}

2.3.2 과거 목요일 반복 일정 변경 - 금요일로 날짜 변경 - 8월 9일 이후의 일정만 수정 됨{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpCDAAA=","EMail":"test@test.com","Tstamp":"635116537103422167","Title":"반복일정 테스트 #3 - 목요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAAAouLOLvZTOAQAAAAAAAAAAEAAAAKD44Bwh7SFNoqxBurnSKYk=","EventType":"Modified"}
 
 
과거일 포함 수정이 일어나면
 - 이전 날짜는 새로 생성이 되고 GlobalObjectID는 이전과 동일 합니다. ( 새로 생성이 되어 ItemID는 다름 )
 - 이때 이후 날짜는 수정이 되며 ItemId는 같지만 GlobalObjectID는 다르게 변경 됨
 
 
 
2.4 목요일 반복 일정 전체 삭제 - 8월 9일 이전일 삭제 진행 - 삭제시 Exchange에 Item이 없기 때문에 GlobalObjectID를 알아 낼 수 없음
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpCEAAA=","EMail":"test@test.com","Tstamp":null,"Title":null,"GlobalObjectId":null,"EventType":"Deleted"}
 
2. 5 금요일 반복 일정 전체 삭제 - 8월 9일 이후일 삭제 진행 - 삭제시 Exchange에 Item이 없기 때문에 GlobalObjectID를 알아 낼 수 없음
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpCDAAA=","EMail":"test@test.com","Tstamp":null,"Title":null,"GlobalObjectId":null,"EventType":"Deleted"}
 
 
 
 
-- 새로 일정 생성해서 진행 함 
 
2.6 금일 이전 한 항목만 일자 변경은 저장을 할 수 없어서 수행 하지 못함
 
2.7 금일 이후 한 항목만 일자 변경
{"Uid":"AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAA2tpCFAAA=","EMail":"test@test.com","Tstamp":"635116547854317040","Title":"반복일정 테스트 #4 - 목요일","GlobalObjectId":"BAAAAIIA4AB0xbcQGoLgCAAAAADVpTb8v5TOAQAAAAAAAAAAEAAAAFO0GqAx2KxCu43J1ILBwSw=","EventType":"Modified"}




 

 금일(오늘)을 포함한 반복 일정은 ItemId와 GlobalObjectId가 변경된다. 금일 이전 일정은 새롭게 생성되어 ItemId가 생성되지만 GlobalObjectId는 동일한다. 그러지만 수정된 반복 일정은 ItemId는 동일하지만 GlobalObjectId가 변경된다. 이 규칙을 잘 이해해야 익스체인지의 일정과 연계 개발을 쉽게 할 수 있을 것이다. 










Exchange 개발에 유용한 파워쉘 PowerShell




특정 유저의 메일박스 정보

Get-Mailbox -identity email



특정 유저의 메일박스 정보 Database

Get-Mailbox -identity email| fl Database



특정 유저의 메일박스 이동 정보

Get-MoveRequest -Identity email



특정 유저의 메일박스 이동 요청

New-MoveRequest -identity email-TargetDatabase EDBNAME01











Push Notification을 통해 Exchange가 보내주는 XML 메시지 - Push Notification XML Message



구독 메시지

<?xml version="1.0" encoding="utf-8"?>

<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">

<soap11:Header>

<t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" Version="Exchange2007_SP1" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" />

</soap11:Header>

<soap11:Body>

<m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">

<m:ResponseMessages>

<m:SendNotificationResponseMessage ResponseClass="Error">

<m:MessageText>이 구독의 이벤트를 검색할 수 없습니다. 구독을 다시 만들어야 합니다.</m:MessageText>

<m:ResponseCode>ErrorReadEventsFailed</m:ResponseCode>

<m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>

<m:MessageXml>

<t:Value Name="SubscriptionId">HwBlaGRldjAaLm15c2luZ2alZGV2LnNhbXNabmcuY29tEAaAAEDzY414aNRHmaqvPaxcOC6bMacSPTbQCA==</t:Value>

</m:MessageXml>

</m:SendNotificationResponseMessage>

</m:ResponseMessages>

</m:SendNotification>

</soap11:Body>

</soap11:Envelope>

 

Timeout 체크 메시지

<?xml version="1.0" encoding="utf-8"?>

<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">

<soap11:Header>

<t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" Version="Exchange2013" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" />

</soap11:Header>

<soap11:Body>

<m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">

<m:ResponseMessages>

<m:SendNotificationResponseMessage ResponseClass="Success">

<m:ResponseCode>NoError</m:ResponseCode>

<m:Notification>

<t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAFeOaj2lZuZOi1N+1rkdEZQeygpQxzbQCA==</t:SubscriptionId>

<t:PreviousWatermark>AQAAABEyGxfwZ9dAopfl5usy5gfLCx0AAAAAAAE=</t:PreviousWatermark>

<t:MoreEvents>false</t:MoreEvents>

<t:StatusEvent>

<t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gfLCx0AAAAAAAE=</t:Watermark>

</t:StatusEvent>

</m:Notification>

</m:SendNotificationResponseMessage>

</m:ResponseMessages>

</m:SendNotification>

</soap11:Body>

</soap11:Envelope>

 

Push Notification 발생 이벤트

<?xml version="1.0" encoding="utf-8"?>

<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">

<soap11:Header>

<t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" Version="Exchange2013" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" />

</soap11:Header>

<soap11:Body>

<m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">

<m:ResponseMessages>

<m:SendNotificationResponseMessage ResponseClass="Success">

<m:ResponseCode>NoError</m:ResponseCode>

<m:Notification>

<t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAMJY03Vah5BOmkEOETcGXxHnvIm82TbQCA==</t:SubscriptionId>

<t:PreviousWatermark>AQAAABEyGxfwZ9dAopfl5usy5gdZDR0AAAAAAAE=</t:PreviousWatermark>

<t:MoreEvents>false</t:MoreEvents>

<t:CreatedEvent>

<t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gdnDR0AAAAAAAE=</t:Watermark>

<t:TimeStamp>2013-06-14T05:49:19Z</t:TimeStamp>

<t:ItemId Id="AAMkAGZhOGI2YjNjLWRlMWQtNDQxMi04MWM3LWIzMDZjMDc2ZTc5NwBGAAAAAABC/TlGf1b9QpWxGGDPuxf9BwBOIPGUO6e0TpHwZ1Cf8EPSAAAAAAAOAABOIPGUO6e0TpHwZ1Cf8EPSAAAtT/yAAAA=" ChangeKey="FwAAAA==" />

<t:ParentFolderId Id="AQMkAGZhOGI2YjNjLWRlMWQtNDQAMTItODFjNy1iMzA2YzA3NmU3OTcALgAAA0L9OUZ/Vv1ClbEYYM+7F/0BAE4g8ZQ7p7ROkfBnUJ/wQ9IAAAMOAAAA" ChangeKey="AQAAAA==" />

</t:CreatedEvent>

</m:Notification>

</m:SendNotificationResponseMessage>

</m:ResponseMessages>

</m:SendNotification>

</soap11:Body>

</soap11:Envelope>








Dynamic Push Notification Subscription

Exchange개발에 필요한 Powershell 모음




Active EDB 알아내기

Get-MailboxDatabaseCopyStatus -Active -Local | select-object DatabaseName


 각 익스체인지 서버에는 Active모드인 EDB와 Passive 모드인 EDB가 있다. 

한쪽 서버가 잘못 되었을 때 Passive모드의 EDB가 Active가 되면서 전체적인 서버단위의 failover가 되도록 한다.그러나 평시에는 Active 모드이 EDB에 속해 있는 사용자 계정을 가져오기 위해 Active 모드의 EDB만 가져올 때 사용할 수 있다.

DatabaseName : EDB 명




 

사용자의 정보

Get-Mailbox -identity useremailid | select-object ServerName, Database, MailboxMoveStatus


메일 박스의 사용자에 속해 있는 서버명과 EDB명 그리고 현재 어떤 상태인지를 조회 한다.

- ServerName : 여러개의 익스체인지 서버 팜에서 특정 서버를 찾을 수 있다.

- Database : EDB명이다. 사용자가 속해 있는 EDB를 알 수 있다.

- MailboxMoveStatus : 관리자의 명령에 의해 다른 서버나 EDB로 이동할 때 상태가 Move, Completed로 바뀐다. 




 

데이터 베이스에서 사용자 알아 내기

Get-Mailbox -Database "HADB01" -ResultSize unlimited | select-object WindowsEmailAddress


익스체인지 데이터 베이스에 속해 있는 사용자 리스트를 가져와 이메일 계정을 출력한다.

- WindowsEmailAddress : 윈도우 이메일 주소를 나타낸다. 





이 세가지를 통해서 동적으로 사용자를 Subscription을 할 수 있다.













[Exchange] Push Notification xml message from Exchange 2013 - Calendar case #2




 - 기본 캘린더에서 일정 만들기 이벤트 정보

 - 기본 캘린더 이외에 일정 만들기 이벤트 정보

 - 추가 캘린더 생성 이벤트 정보


// 기본 캘린더에서 일정 만들기
<?xml version="1.0" encoding="utf-8"?>
<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
  <soap11:Header>
    <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>
  </soap11:Header>

  <soap11:Body>
    <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
      <m:ResponseMessages>
        <m:SendNotificationResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>

          <m:Notification>
            <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAPUpvAp05DBHuSco6cBcV3VXMbPEc0fQCA==</t:SubscriptionId>

            <t:PreviousWatermark>AQAAABEyGxfwZ9dAopfl5usy5gc/DVAAAAAAAAE=</t:PreviousWatermark>

            <t:MoreEvents>false</t:MoreEvents>

            <t:CreatedEvent>
              <t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gffEVAAAAAAAAE=</t:Watermark>

              <t:TimeStamp>2013-07-05T09:18:40Z</t:TimeStamp>

              <t:ItemId Id="AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgBGAAAAAAD14fnht2jpSpaypawvJwO3BwA2K3ZCpui2TKCftY0IT00tAAAAAAAPAAA2K3ZCpui2TKCftY0IT00tAAAisAnnAAA=" ChangeKey="DwAAAA=="/>
              <t:ParentFolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADDwAAAA==" ChangeKey="AQAAAA=="/>
            </t:CreatedEvent>

            <t:ModifiedEvent>
              <t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gfhEVAAAAAAAAE=</t:Watermark>

              <t:TimeStamp>2013-07-05T09:18:40Z</t:TimeStamp>

              <t:FolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADDwAAAA==" ChangeKey="AgAAAA=="/>
              <t:ParentFolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADCgAAAA==" ChangeKey="AQAAAA=="/>
            </t:ModifiedEvent>

          </m:Notification>

        </m:SendNotificationResponseMessage>

      </m:ResponseMessages>

    </m:SendNotification>

  </soap11:Body>

</soap11:Envelope>

 
 
 
// 기본 캘린더 외에서 일정 만들기
<?xml version="1.0" encoding="utf-8"?>
<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
  <soap11:Header>
    <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>
  </soap11:Header>

  <soap11:Body>
    <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
      <m:ResponseMessages>
        <m:SendNotificationResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>

          <m:Notification>
            <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAPUpvAp05DBHuSco6cBcV3VXMbPEc0fQCA==</t:SubscriptionId>

            <t:PreviousWatermark>AQAAABEyGxfwZ9dAopfl5usy5gfJ9k8AAAAAAAE=</t:PreviousWatermark>

            <t:MoreEvents>false</t:MoreEvents>

            <t:ModifiedEvent>
              <t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gcO+08AAAAAAAE=</t:Watermark>

              <t:TimeStamp>2013-07-05T09:17:12Z</t:TimeStamp>

              <t:FolderId Id="AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgAuAAAAAAD14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAAisA3KAAA=" ChangeKey="AgAAAA=="/>
              <t:ParentFolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADDwAAAA==" ChangeKey="AQAAAA=="/>
            </t:ModifiedEvent>

          </m:Notification>

        </m:SendNotificationResponseMessage>

      </m:ResponseMessages>

    </m:SendNotification>

  </soap11:Body>

</soap11:Envelope>

 
 
 
// 새로운 캘린더를 만들 때
<?xml version="1.0" encoding="utf-8"?>
<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
  <soap11:Header>
    <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>
  </soap11:Header>

  <soap11:Body>
    <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
      <m:ResponseMessages>
        <m:SendNotificationResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>

          <m:Notification>
            <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAPUpvAp05DBHuSco6cBcV3VXMbPEc0fQCA==</t:SubscriptionId>

            <t:PreviousWatermark>AQAAABEyGxfwZ9dAopfl5usy5gfhEVAAAAAAAAE=</t:PreviousWatermark>

            <t:MoreEvents>false</t:MoreEvents>

            <t:CreatedEvent>
              <t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gfkI1AAAAAAAAE=</t:Watermark>

              <t:TimeStamp>2013-07-05T09:19:39Z</t:TimeStamp>

              <t:FolderId Id="AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgAuAAAAAAD14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAAisBGzAAA=" ChangeKey="AQAAAA=="/>
              <t:ParentFolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADDwAAAA==" ChangeKey="AQAAAA=="/>
            </t:CreatedEvent>

            <t:ModifiedEvent>
              <t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gflI1AAAAAAAAE=</t:Watermark>

              <t:TimeStamp>2013-07-05T09:19:39Z</t:TimeStamp>

              <t:FolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADDwAAAA==" ChangeKey="AgAAAA=="/>
              <t:ParentFolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADCgAAAA==" ChangeKey="AQAAAA=="/>
            </t:ModifiedEvent>

            <t:ModifiedEvent>
              <t:Watermark>AQAAABEyGxfwZ9dAopfl5usy5gfnI1AAAAAAAAE=</t:Watermark>

              <t:TimeStamp>2013-07-05T09:19:39Z</t:TimeStamp>

              <t:FolderId Id="AAMkAGM2NmM0MDFhLTMxMDItNGEzNC04MjQ5LTdmNTcyMmNlYmY0MgAuAAAAAAD14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAAisBGzAAA=" ChangeKey="AgAAAA=="/>
              <t:ParentFolderId Id="AQMkAGM2NgBjNDAxYS0zMTAyLTRhMzQtODI0OS03ZjU3MjIAY2ViZjQyAC4AAAP14fnht2jpSpaypawvJwO3AQA2K3ZCpui2TKCftY0IT00tAAADDwAAAA==" ChangeKey="AQAAAA=="/>
            </t:ModifiedEvent>

          </m:Notification>

        </m:SendNotificationResponseMessage>

      </m:ResponseMessages>

    </m:SendNotification>

  </soap11:Body>

</soap11:Envelope>







Exchange 개발 관련 파워쉘 명령어 모음



/// <summary>
/// 메일박스에서 사용자 정보 가져오기
/// </summary>
/// <param name="dbhId">DB의 UniqueId</param>
/// <returns></returns>
private IList<string> GetUserIdFromMailBox(string dbhId)
{
    IList<string> list = new List<string>();
 
    using (var ems = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig()))
    {
        var results = ems.PipelineScriptInvoke("Get-MailboxDatabase \"" + dbhId + "\" | Get-Mailbox");
        foreach (PSObject item in results)
        {
            list.Add(item.Members["WindowsEmailAddress"].Value.ToString());
        }
    }
 
    return list;
}

[코드1] 특정 EDB안에 있는 사용자 추출 코드




//// MBX Worker process가 시작할 때 이벤트 처리
ManagementEventWatcher startWatcherProcess;
startWatcherProcess = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName = '" + monitoringProcessName + "'"));   // WHERE ProcessName = 'microsoft.exchange.store.worker.exe'
startWatcherProcess.EventArrived += startWatcher_EventArrived;
startWatcherProcess.Start();
 
//// MBX Worker process가 종료될 때 이벤트 처리
ManagementEventWatcher stopWatcherProcess;
stopWatcherProcess = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace WHERE ProcessName = '" + monitoringProcessName + "'")); // WHERE ProcessName = 'microsoft.exchange.store.worker.exe'
stopWatcherProcess.EventArrived += stopWatcher_EventArrived;
stopWatcherProcess.Start();

[코드2] ManagementEventWatcher로 프로세스의 시작과 종료 이벤트를 처리



/// <summary>
/// 현재 서버의 데이터 베이스를 가져온다.
/// </summary>
/// <returns></returns>
private List<string> GetMailboxActiveDatabaseNames()
{
    var list = new List<string>();
 
    using (var ems = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig()))
    {
        var psScript = "Get-MailboxDatabaseCopyStatus -Active -Local | select-object DatabaseName";
        var results = ems.PipelineScriptInvoke(psScript);
        foreach (PSObject item in results)
        {
            list.Add(item.Members["DatabaseName"].Value.ToString());
        }
    }
 
    return list;
}

[코드3] 현재 서버의 Active EDB를 가져온다.




/// <summary>
/// 동적으로 사용자 추가
/// </summary>
/// <param name="emaillist"></param>
/// <returns></returns>
private Dictionary<stringstring> DynamicUserListAdd(Dictionary<stringstring> requestList)
{
    dynamicAddedDate = previousDynamicAddedDate;
    previousDynamicAddedDate = DateTime.Now.AddSeconds(-1); // 현재 시간을 포함하기 위해 1초를 뺀다.
            
    // 파워쉘 명렁으로 알아 내기
    using (var powershellInvoker = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig()))
    {
        foreach (var databaseName in GetMailboxActiveDatabaseNames())
        {
            // 파워쉘 실행
            //var psScript = "Get-Mailbox -Database \"" + databaseName + "\" -Filter {(WhenChanged -gt \"" + dynamicAddedDate.ToString("yyyy-MM-dd HH:mm:ss") + "\")} -ResultSize unlimited | select-object WindowsEmailAddress";
 
            // 파워쉘의 WhenChanged 필터를 통해 수정된 일자를 바탕으로 이메일 사용자 계정을 검색한다.
            log.Info(string.Format("{0} database에서 사용자를 추출하는 중입니다..."databaseName));
            Collection<Command> listCommand = new Collection<Command>();
 
            var command = new Command("Get-Mailbox");
            command.Parameters.Add("Database"databaseName);
            command.Parameters.Add("Filter""WhenChanged -gt \"" + dynamicAddedDate.ToString("yyyy-MM-dd HH:mm:ss"+ "\"");
            //command.Parameters.Add("Filter", "WhenChanged -gt \"2013-06-10 17:00:00\"");
            command.Parameters.Add("ResultSize""unlimited");
            listCommand.Add(command);
 
            var props = new string[] { "WindowsEmailAddress" };
            Command CommandSelect = new Command("Select-Object");
            CommandSelect.Parameters.Add("Property"props);
            listCommand.Add(CommandSelect);
 
            var results = powershellInvoker.PipelineInvoke(listCommand);
            log.Info(string.Format("{0} database에서 사용자 계정 {1}개 추출 하였습니다."databaseNameresults.Count));
            foreach (var user in results)
            {
                // 사용자의 이메일 주소
                var windowsEmailAddress = user.Members["WindowsEmailAddress"].Value.ToString();
 
                // 새로운 사용자만 추가
                if (!requestList.ContainsKey(windowsEmailAddress))
                {
                    requestList.Add(windowsEmailAddressdatabaseName);
                }
            }
        }
    }
 
    return requestList;
}

[코드4] 최근에 변경된 사용자만 알아내어 기존 리스트에 추가하는 코드



/// <summary>
/// 데이터베이스 명으로 사용자 리스트 가져오기
/// </summary>
/// <param name="databaseName"></param>
/// <returns></returns>
public Dictionary<stringstring> GetMailboxbyDatabaseNames(string databaseName)
{
    // 요청자 사용자 리스트
    var requestList = new Dictionary<stringstring>();
 
    // 파워쉘 명렁으로 알아 내기
    using (var powershellInvoker = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig()))
    {
        int mailUserCount = 0;
        var psScript = "Get-Mailbox -Database \"" + databaseName + "\" -ResultSize unlimited | select-object WindowsEmailAddress";
        foreach (var user in powershellInvoker.PipelineScriptInvoke(psScript))
        {
            // 사용자의 이메일 주소
            var windowsEmailAddress = user.Members["WindowsEmailAddress"].Value.ToString();
            var databaseNameTemp = databaseName;
 
            requestList.Add(windowsEmailAddressdatabaseName);
            mailUserCount++;
        }
 
        log.Info(string.Format("{0} database에서 {1}개의 사용자 계정이 추가 되었습니다."databaseNamemailUserCount));
    }
 
    return requestList;
}

[코드5] 데이터베이스 명으로 사용자 리스트 가져오기






Remote powershell 연결


참조 URL
  1. http://binarytree.com/Blog/Blog/April-2011/Provisioning-Exchange-2010-Users.aspx

  


1. Exchange 서버에서 리모트로 연결할 수 있도록 Enable-PSRemoting 명령으로 활성화 시켜 준다.

2. 별도의 PC에서 파워쉘로 "Enter-PSSession -ConnectionURI http://epdev04/powershell -ConfigurationName Microsoft.Exchange" 입력한다.

3. 바뀐 프롬포터를 확인하고 "Get-MailBox" cmdlet가 동작하는 지 확인한다.


 위와 같이 확인이 되면 정상적으로 세팅이 된 것이다. 하지만 이렇게 remote powershell로 접속하면 익스체인지에서 제공하는 명령어만 동작이 된다. 말하자면 기본으로 제공하는 파워쉘을 사용할 수 없고 오직 익스체인지 관련 명령만 사용할 수 있다.







Push Notification xml message from Exchange 2013

- Calendar case #1 -





 Exchagne 관련 개발을 하다가 보면 Notification 관련해서 개발해야 하는 상황이 생기게 된다. 그 중에서 Push Notification 개발을 할 때 익스체인지에 Subscription 등록을 하면 익스체인지의 내부에서 특정 이벤트가 발생하면 등록된 Uri로 관련 정보를 보내주게 되어 있다. 이때 익스체인지에서는 XML 형식으로 정보를 보내 주는데 케이스 바이 케이스로 분석해서 사용해야 한다. 이 XML에 대한 정보를 구글링을 해 보아도 쉽게 알수 없어서 직접 발로 뛰며 정리를 하여 포스팅을 하게 되었다.


 정리 내용은 아래와 같다. 각 케이스는 같이 포함되어 있으니 참고 하면 되겠다.


// 자신이 일정 생성 - 반복일정 없음, 참여자 없음 <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAHsBYodizMxHq8smOasMhWv0W1xkrDrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcDllSYAAAAAAAA=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:CreatedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDllSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T02:38:29Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAXXsDkAAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:CreatedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDolSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T02:38:29Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body> </soap11:Envelope> // 자신이 일정 수정 - 반복일정 없음, 참여자 없음 <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAGKYGZ8qyiJGnGb/ZxvT7sUFCYYpvjrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcBInyYAAAAAAAE=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcCInyYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T04:48:08Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAXXsDjAAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcCLnyYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T04:48:08Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body> </soap11:Envelope> // 자신이 일정 삭제 - 반복일정 없음, 참여자 없음 <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAElYgCvT16VJugE9QEtytFTOB0LlwTrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcDPoSYAAAAAAAA=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDToSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T05:06:52Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAXXsDkAAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDdoSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T05:06:52Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAXXsDkAAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDgoSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T05:06:52Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body> </soap11:Envelope> // 자신이 일정 생성 - 무한 반복일정, 참여자 없음 <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAPPxWcQ+oj1OhLpxCLY8oqfLxZh/zDrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcDCtiYAAAAAAAE=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:CreatedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDDtiYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:33:34Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAbsKN7AAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:CreatedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDHtiYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:33:34Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body> </soap11:Envelope> // 자신이 일정 생성 - 무한 반복일정, 참여자 없음, 무한 일정 중에서 한 항목만 수정 <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAAPPxWcQ+oj1OhLpxCLY8oqfLxZh/zDrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcDHtiYAAAAAAAE=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDPtiYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:34:28Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAbsKN7AAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcDTtiYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:34:28Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body> </soap11:Envelope> // 자신이 일정 생성 - 무한 반복일정, 참여자 없음, 무한 일정 중에서 한 항목만 수정 -> 전체 되풀이 수정 ( 한 항목만 수정된 케이스는 무시 됨 - 일괄 통일 ) <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAALa9b4YzhX5PpKtRqXhcWi6eGNshzzrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcB3uCYAAAAAAAE=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcB8uCYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:43:53Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAbsKN7AAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcCAuCYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:43:53Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body> </soap11:Envelope> // 자신이 일정 생성 - 무한 반복일정, 참여자 없음, 무한 일정 중에서 한 항목만 삭제 <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAALa9b4YzhX5PpKtRqXhcWi6eGNshzzrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcDzuCYAAAAAAAE=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcD4uCYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:47:23Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAbsKN7AAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcAEuSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:47:23Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAbsKN7AAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcAIuSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:47:23Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body> </soap11:Envelope> // 자신이 일정 생성 - 무한 반복일정, 참여자 없음, 무한 일정 -> 전체 되풀이 삭제 <?xml version="1.0" encoding="utf-8"?> <soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">   <soap11:Header>     <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Version="Exchange2013"/>   </soap11:Header>   <soap11:Body>     <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">       <m:ResponseMessages>         <m:SendNotificationResponseMessage ResponseClass="Success">           <m:ResponseCode>NoError</m:ResponseCode>           <m:Notification>             <t:SubscriptionId>HwBlcGRldjA0Lm15c2luZ2xlZGV2LnNhbXN1bmcuY29tEAAAALa9b4YzhX5PpKtRqXhcWi6eGNshzzrQCA==</t:SubscriptionId>             <t:PreviousWatermark>AQAAALMr+Kv/fENCqdxOTY18DcA0uSYAAAAAAAE=</t:PreviousWatermark>             <t:MoreEvents>false</t:MoreEvents>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcBBuSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:49:15Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAbsKN7AAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcBNuSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:49:15Z</t:TimeStamp>               <t:ItemId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwBGAAAAAACgwvh6d71RT67CyZYo1BbgBwDRsMKrxK8zQK977VpakMDFAAAAAAAPAADRsMKrxK8zQK977VpakMDFAAAbsKN7AAA=" ChangeKey="DwAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>             <t:ModifiedEvent>               <t:Watermark>AQAAALMr+Kv/fENCqdxOTY18DcBcuSYAAAAAAAE=</t:Watermark>               <t:TimeStamp>2013-06-19T06:49:15Z</t:TimeStamp>               <t:FolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAPAAA=" ChangeKey="AgAAAA=="/>               <t:ParentFolderId Id="AAMkAGUzZmI3MDUzLTdjMzctNGQ0Yi1iYjBiLWM4NTljZmY4YmQ2NwAuAAAAAACgwvh6d71RT67CyZYo1BbgAQDRsMKrxK8zQK977VpakMDFAAAAAAAKAAA=" ChangeKey="AQAAAA=="/>             </t:ModifiedEvent>           </m:Notification>         </m:SendNotificationResponseMessage>       </m:ResponseMessages>     </m:SendNotification>   </soap11:Body>

</soap11:Envelope>

[코드1] Exchange에서 보내주는 XML 메시지






OWA 로그인시 이전 암호로 로그인 되는 문제

( An old password still works after you change it in Outlook Web Access )

참조 URL
  1. http://support.microsoft.com/kb/267568/en-us
  2. http://support.microsoft.com/kb/152526/en-us



 프로젝트를 한참 진행중에 암호 변경에 대한 싱크를 맞춰야 하는 사안이 있었다. 테스트를 하면서 AD까지는 실시간 동기화가 되어 정상적으로 변경이 되었으나 OWA를 로그인 하는 과정에서 이전 암호를 입력해도 정상적으로 진입이 되는 오류가 있게 되었다. 몇번의 암호 변경을 진행해도 이전 암호와 현재 수정된 암호를 입력하면 로그인이 되었다. 팀 내에서 이 이슈에 대해 고민 하다가 팀장님게서 해당 문제에 대해 기억을 해내셔서 해당 이슈에 대한 자료를 찾을 수가 있었다. 그 이유는 성능 이슈 때문에 익스체인지 2000부터 IIS에서 캐시를 사용하여 성능 향상을 도모하였던 것이다. 기본 세팅 시간을 15분이므로 이 시간동안은 이전 암호를 입력해도 로그인이 되었다. 이와 같은 일로 해매지 않기 위해 공유하고자 이 글을 올린다. 


해결 방법은 위 '참조 URL'에서 나온 방법으로 


레지스트리를 편집하면 된다.


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo\Parameters


Add Value, and then add the following registry value:

Value Name: UserTokenTTL (Note This is case-sensitive!)

Data Type: REG_DWORD

Value Range: 0 - 0x7FFFFFFF (Note This unit is in seconds.)



IIS 재시작을 하면 된다.










+ Recent posts