
ews-scan은 컴파일된 .NET 코드에서 EWS Managed API 호출을 찾아 각 작업이 Microsoft Graph에서 어떤 호출로 대응되는지 보여주는 도구다. Microsoft가 Exchange Online에서 Exchange Web Services(EWS)를 폐지할 예정이어서, Microsoft.Exchange.WebServices를 사용하는 애플리케이션의 이전 범위를 파악할 때 활용할 수 있다.
도구는 컴파일된 어셈블리 폴더나 .dll, .exe 파일을 대상으로 실행하며 하위 폴더도 검색한다. .NET 8 런타임 이상이 필요하다. 설치와 실행 명령은 다음과 같다.
dotnet tool install --global Sunsetless.EwsScan ews-scan C:\path\to\the\application
보고서는 EWS Managed API를 호출하는 어셈블리별로 호출을 EWS 작업 단위로 묶는다. 작업 이름은 Microsoft 365 관리 센터의 EWS 사용량 보고서에 표시되는 SOAP 작업 이름과 같아 두 보고서를 비교할 수 있다. 각 작업에는 호출 코드 위치와 Graph 대응 호출, 주의할 점이 표시된다. 일부 작업에는 Sunsetless의 상용 라이브러리가 처리하는지도 별도 항목으로 나온다.
보고서는 일반 텍스트가 기본이며, --format markdown으로 티켓이나 풀 리퀘스트에 붙여 넣을 표 형식, --format json으로 스크립트용 JSON을 출력할 수 있다. --output <file>은 보고서를 파일에 저장하고, --callers는 호출이 발생한 메서드를 표시한다.
ews-scan은 System.Reflection.Metadata로 어셈블리의 메타데이터와 IL을 읽으며 코드를 로드하거나 실행하지 않고 네트워크 요청도 하지 않는다고 설명한다. C#, VB.NET, F#으로 작성된 코드를 처리할 수 있다. Microsoft의 Microsoft.Exchange.WebServices, .NET Standard 포트인 Microsoft.Exchange.WebServices.NETStandard, Sunsetless EWS를 인식하며 .NET Framework 2.0~4.8, .NET Standard, .NET을 대상으로 빌드된 어셈블리를 지원한다.
다만 리플렉션이나 dynamic을 통한 호출, 라이브러리를 불러오는 PowerShell 스크립트, 원시 SOAP 요청은 찾지 못한다. 필드·설정 파일·분기에서 정해지는 열거형 값도 탐지하지 못하며, 보고서의 호출 수는 코드에 있는 호출 지점 수이지 실제 요청 횟수가 아니다. 저장된 ID로 연 폴더와 항목도 구분할 수 없다. 폴더의 Load() 호출은 GetItem으로 집계되고, 같은 어셈블리의 복사본이 여러 개 있으면 가장 최신 것만 표시한다. obj와 ref 폴더는 검색에서 제외된다.
Graph 대응 내용은 Microsoft의 EWS-Graph 매핑표와 제작자가 Exchange Online에서 진행한 자체 테스트를 정리한 EWS operations in Microsoft Graph를 바탕으로 한다. Graph 항목에 “not in Microsoft's mapping table”이라고 표시되면 Microsoft의 매핑표에 해당 작업이 없고 대체 방법도 테스트하지 않았다는 뜻이다. 제작자는 Graph가 계속 바뀌므로 코드가 의존하는 호출을 확인하라고 안내한다.
Sunsetless 항목은 EWS Managed API 코드를 유지하면서 호출을 Microsoft Graph로 보내는 상용 라이브러리 Sunsetless EWS의 지원 여부를 나타낸다. 직접 Graph로 코드를 다시 작성한다면 이 항목은 건너뛰어도 되며, 나머지 보고서에는 영향을 주지 않는다. 도구의 저장소와 설치 정보는 GitHub 저장소에서 확인할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요