반응형

이번에는 EWS API 를 이용해서 사서함의 특정 폴더를 비우는 방법에 대해서 다뤄 보겠습니다.

저는 Exchange Machine이 아닌 AD Join된 Windows 10 Client에서 테스트를 진행하였습니다.

 

아래 글을 참고하여 진행하였습니다.

Applicationimpersonation 역할을 통한 EWS 인증 - scho blog

 

[단계 1] EWS API 설치

현재 MS의 공식 다운로드 링크가 없는 것으로 확인됩니다. 제 아래는 제 구글 드라이브 링크이오니 참고하시기 바랍니다.

EWS API 2.2 Download

 

설치 진행

 

Accept - Next

 

Next

 

Next

 

Close

 

[단계 2] 권한 부여

EWS API 에서 해당 작업을 진행하려면 ApplicationImpersonation 권한이 필요합니다.

ECP -> Permissions -> admin roles -> Organization Management -> ApplicationImpersonation 추가 (해당 Role을 별도로 생성해서 추가하여 진행할 수도 있습니다.)

 

 

[단계 3] Script 테스트

Powershell 을 관리자 권한으로 실행합니다.

 

#EWS API Module 불러오기
Import-Module "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"

 

#Exchange 관리자 계정 입력
$PSCredential = Get-Credential

 

#Service 개체 생성
$Service = [Microsoft.Exchange.WebServices.Data.ExchangeService]::new()

 

#Service 개체에 자격증명 입력
$Service.Credentials = New-Object System.Net.NetworkCredential($PSCredential.UserName.ToString(),$PSCredential.GetNetworkCredential().password.ToString())

 

#Service 개체에 EWS URL 입력
$Service.Url = "https://mail.contoso.kr/EWS/Exchange.asmx"

 

#대상 사서함 지정
$MailboxName ="onprem-1@contoso.kr"

 

#ImpersonatedUserId 입력
$ArgumentList = ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SMTPAddress),$MailboxName
$ImpUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId -ArgumentList $ArgumentList
$service.ImpersonatedUserId = $ImpUserId

 

#FolderId 확인 (Inbox 기준)
$folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::inbox,$MailboxName)

 

#Folder 값 바인딩
$folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)

 

#폴더 비우기 (Folder Empty)
$folder.Empty([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete, $true)

명령어 진행 전

 

명령어 진행 후 -> 하위 폴더까지 삭제되는 것을 확인할 수 있습니다.

 

이번에는 동기화 오류 폴더 비우기를 진행해 보겠습니다.

#Empty SyncIssues 
$folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Syncissues,$MailboxName)
$folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)
$folder.Empty([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete, $true)

순간 하위 폴더가 전부 삭제되고 재생성 되는 것으로 확인됩니다.

 

기본 스크립트는 다음과 같으며, 해당 스크립트를 응용하여 전체 사서함을 대상으로 진행하는 스크립트를 제작할 수 있습니다.

# Import EWS API dll
Import-Module "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
  
# Proivde the mailbox user credentials
$PSCredential = Get-Credential
  
$Service = [Microsoft.Exchange.WebServices.Data.ExchangeService]::new()
# Use Basic Authentication
$Service.Credentials = New-Object System.Net.NetworkCredential($PSCredential.UserName.ToString(),$PSCredential.GetNetworkCredential().password.ToString())
 
# Check EWS connection
$Service.Url = "https:///EWS/Exchange.asmx"

# Proivde the mailbox
$MailboxName =""

$ArgumentList = ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SMTPAddress),$MailboxName
$ImpUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId -ArgumentList $ArgumentList
$service.ImpersonatedUserId = $ImpUserId

$folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::inbox,$MailboxName)
$folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)
$folder.Empty([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete, $true);

 

반응형

+ Recent posts