Microsoft 365 라이선스 최적화 및 감사 자동화
By Mirko Peters ·
팟캐스트 블로그에 다시 오신 것을 환영합니다! 매달 받는 Microsoft 365 소프트웨어 청구서를 보면서 6개월 동안 아무도 사용하지 않은 좌석에 왜 비용을 내고 있는지 궁금해 본 적이 있다면, 여러분만 그런 것이 아닙니다.
Automatically translated with AI from the original post. Read the English original
팟캐스트 블로그에 다시 오신 것을 환영합니다! 매달 받는 Microsoft 365 소프트웨어 청구서를 보면서 6개월 동안 아무도 사용하지 않은 좌석에 왜 비용을 내고 있는지 궁금해 본 적이 있다면, 여러분만 그런 것이 아닙니다. 라이선스 관리는 조용히 IT 예산을 소진시키는 숨은 운영 부담 중 하나이며, 동시에 불필요한 규정 준수 및 보안 문제를 만들어 냅니다. 다행히도 이를 해결할 강력한 자동화 도구가 바로 손닿는 곳에 있습니다. 이 종합 가이드에서는 PowerShell을 사용해 Microsoft 365 라이선스를 추적, 할당, 회수하는 방법을 살펴보겠습니다. 이를 통해 비용을 통제하고, 온보딩을 간소화하며, 테넌트 전반의 엄격한 규정 준수를 보장할 수 있습니다. 기술 자동화 전략을 깊이 있게 다루는 내용에 관심이 있다면, 개발자 워크플로와 도구에 대한 더 많은 인사이트를 위해 관련 에피소드인 Run Your Full Stack Locally with .NET Aspire도 꼭 확인해 보시기 바랍니다.
라이선스 최적화 및 감사 자동화 소개
Microsoft 365 테넌트를 수동으로 관리하는 것은 번아웃과 사람의 실수를 부르는 지름길입니다. 조직이 성장하고, 직원이 교체되고, 부서가 재편되며, 소프트웨어 요구 사항은 크게 변동합니다. 이를 방치하면 관리자는 라이선스를 쌓아 두거나, 이전 계약직 직원의 비용을 계속 지불하거나, 비활성 계정에 E5 같은 고급 라이선스를 그대로 할당해 두게 됩니다. 라이선스 최적화 전략에 자동화를 도입하면 추측에 의존하지 않아도 됩니다. PowerShell을 사용하면 테넌트 데이터를 조회하고, 사용 패턴을 분석하고, 미사용 자산을 프로그래밍 방식으로 회수할 수 있습니다. 이를 통해 사후 대응형 관리 업무를 선제적인 재무 보호 장치로 바꿀 수 있습니다.
사전 요구 사항 및 환경 설정
라이선스 회수 코드를 한 줄이라도 작성하기 전에 환경을 준비해야 합니다. 제대로 준비해야 스크립트가 권한 문제나 모듈 어셈블리 충돌 없이 원활하게 실행됩니다.
지원되는 시스템
Microsoft 365 관리 스크립트는 Windows와 macOS 시스템 모두에서 실행할 수 있습니다. 대부분의 관리자는 Windows 10 이상을 선호하며, Mac 사용자는 PowerShell Core를 활용할 수 있습니다. 운영 체제가 최신 모듈식 패키지를 지원하는지 항상 확인하십시오. 서비스에 연결할 때 WAM(Web Account Manager) 통합 오류나 어셈블리 종속성 충돌이 발생하면, DisableWAM 스위치 같은 임시 해결 방법을 사용해 스크립트를 계속 실행할 수 있습니다.
권한 및 역할
보안이 가장 중요합니다. 일반 사용자 계정으로 관리 스크립트를 실행하지 마십시오. 실행 주체에 전역 관리자, 사용자 관리자, 라이선스 관리자 같은 적절한 역할이 있는지 확인하십시오. 최소 권한 원칙을 지키면 관리자 자격 증명이 라이선스 감사와 할당을 수행하는 데 꼭 필요한 권한만 갖게 됩니다.
환경 설정 체크리스트
- 관리자 권한으로 Windows PowerShell을 여십시오.
- PowerShell 갤러리를 신뢰할 수 있는 리포지토리로 설정하십시오.
Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted - 메시지가 표시되면 필요한 NuGet 공급자를 설치하십시오.
- 스크립트 실행 정책을 구성하십시오.
Set-ExecutionPolicy RemoteSigned
필수 Microsoft 365 PowerShell 모듈 설치
사용자와 라이선스를 효과적으로 관리하려면 필요한 도구 세트를 로컬에 설치해야 합니다. Microsoft 생태계는 통합 SDK 쪽으로 크게 전환되었지만, 일상적인 관리 작업에는 여전히 중요한 기본 모듈이 몇 가지 있습니다.
모듈 개요
- Microsoft.Graph: MSOnline 및 AzureAD 같은 레거시 도구를 대체하는 최신 통합 모듈입니다.
- ExchangeOnlineManagement: 사서함 거버넌스, 공유 사서함 전환, 메일 흐름 추적에 필수적입니다.
- MicrosoftTeams: 협업 워크로드와 모임 정책을 관리하는 데 필수적입니다.
설치 단계
권한 상승된 PowerShell 프롬프트에서 다음 명령을 실행하여 핵심 최신 모듈을 설치할 수 있습니다.
Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -Force
Install-Module -Name MicrosoftTeams -Scope CurrentUser -Force설치를 항상 Get-InstalledModule로 확인하여 충돌하는 버전이 자동화 런북을 방해하지 않도록 하십시오.
PowerShell을 Microsoft 365 테넌트에 연결
테넌트에 안전하고 안정적으로 연결하는 것이 다음으로 중요한 단계입니다. 최신 인증 표준에서는 특히 무인 또는 예약된 스크립트를 실행할 때 견고한 방식이 필요합니다.
인증 옵션
대화형 로그인은 간단한 관리 작업에는 편리하지만, 자동화된 백그라운드 스크립트에는 더 안전한 방법이 필요합니다. 인증서 기반 인증이나 관리 ID를 활용하면 스크립트 파일에 비밀번호를 평문으로 하드코딩하지 않고도 안전하게 연결할 수 있습니다.
Graph 및 서비스에 연결하기
사용자와 라이선스를 관리하기 위해 Microsoft Graph 백엔드에 연결하려면 다음을 사용합니다.
Connect-MgGraph -Scopes "User.ReadWrite.All", "Organization.Read.All"Exchange 전용 워크로드와 사서함 구성을 다루려면 다음을 사용해 세션을 설정합니다.
Connect-ExchangeOnline스크립트가 일괄 작업을 마치면 Disconnect-ExchangeOnline 또는 Disconnect-MgGraph를 실행해 세션을 정리하는 것을 잊지 마세요.
미사용 시트 및 라이선스 인벤토리 감사
라이선스 최적화는 가시성 확보에서 시작합니다. 누가 라이선스를 사용하고 있고 누가 방치하고 있는지 알지 못하면 시트를 회수할 수 없습니다. PowerShell을 사용하면 할당된 SKU와 마지막 로그온 시간을 포함한 종합 인벤토리 보고서를 추출할 수 있습니다.
구독된 SKU 확인하기
테넌트에서 구매한 전체 라이선스 풀과 사용 가능한 수량을 확인하려면 다음 명령을 실행합니다.
Get-MgSubscribedSku | Select-Object SkuId, SkuPartNumber, @{Name="Total";Expression={$_.ConsolidatedStatus}}, @{Name="Assigned";Expression={$_.AssignedUnits}}비활성 사용자 찾기
90일이 넘도록 인증하지 않은 계정을 식별하는 것이 불필요한 클라우드 비용을 줄이는 가장 빠른 방법입니다. 사용자 목록을 필터링하여 휴면 계정을 찾을 수 있습니다.
$Threshold = (Get-Date).AddDays(-90)
Get-MgGet-MgUser -All -Property Id, DisplayName, UserPrincipalName, SignInActivity | Where-Object { $_.SignInActivity.LastSignInDateTime -lt $Threshold }이 데이터를 CSV 파일로 내보내면 대량 라이선스 제거를 실행하기 전에 IT 리더십에 명확한 비용 절감 지표를 제시할 수 있습니다.
Set-MgUserLicense로 라이선스 할당 및 회수하기
활용도가 낮은 시트나 온보딩이 필요한 신규 입사자를 파악했다면, Set-MgUserLicense cmdlet이 조정을 위한 기본 수단이 됩니다.
라이선스를 프로그래밍 방식으로 할당하기
신규 사용자에게 특정 제품 SKU를 할당하려면 대상 SkuId를 포함한 라이선스 할당 개체를 구성합니다.
$Params = @{
AddLicenses = @(
@{
SkuId = "your-sku-guid-here"
}
)
RemoveLicenses = @()
}
Set-MgUserLicense -UserId "alex.johnson@contoso.com" -BodyParameter $Params미사용 라이선스 회수하기
휴면 계정이나 퇴사한 직원의 라이선스를 회수할 때는 SKU 식별자를 RemoveLicenses 배열 매개 변수에 전달하여 작업을 반대로 수행합니다. 이렇게 하면 사용하지 않는 클라우드 용량에 대해 조직이 비용을 지불하는 상황을 즉시 막을 수 있습니다.
온보딩 및 오프보딩 라이선스 워크플로 자동화하기
수동 사용자 프로비저닝과 디프로비저닝은 상당한 지연과 보안 위험을 초래합니다. 온보딩 및 오프보딩 워크플로를 스크립트로 구성하면 직원이 입사하는 순간 라이선스가 프로비저닝되고, 퇴사일에 바로 회수되도록 보장할 수 있습니다.
자동화된 오프보딩 스크립트는 사용자 계정을 비활성화하고, 할당된 라이선스를 제거하고, 사서함을 공유 사서함으로 변환하고, 감사 추적 기록을 안전한 저장소로 내보내는 작업을 하나의 연속 실행 블록에서 수행할 수 있습니다. 이 수준의 동기화는 라이선스 낭비를 없애고 조직의 보안 상태를 유지하는 데 도움이 됩니다.
보안 모범 사례와 최소 권한 원칙
자동화는 막대한 권한을 부여하므로 엄격하게 관리해야 합니다. 엄격한 보안 원칙을 준수하면 실수로 인한 잘못된 구성과 악성 스크립트 실행으로부터 테넌트를 보호할 수 있습니다.
- 최소 권한 액세스: 자동화된 서비스 계정에 전역 관리자 권한을 절대 부여하지 마세요. 스크립트에 실제로 필요한 권한만 엄격하게 범위를 지정하세요.
- 자격 증명 보안: 스크립트 안에 평문 비밀번호를 절대 저장하지 마세요. Azure Key Vault, 관리 ID 또는 인증서 인증을 사용하세요.
- 포괄적인 로깅: 견고한 try/catch 블록을 구현하고, 완전한 추적성을 위해 스크립트 실행 단계를 로컬 또는 클라우드 로그에 기록하세요.
라이선스 및 연결 관련 일반 오류 해결하기
숙련된 관리자도 Microsoft 365 자동화 스크립트를 실행할 때 가끔 장애물에 부딪힙니다. 이러한 오류를 처리하는 방법을 이해하면 몇 시간의 수고를 덜 수 있습니다.
- 권한 거부 오류: 스크립트를 실행하는 계정에 필요한 Azure AD 디렉터리 역할이 있는지, 그리고 Graph 연결이 올바른 동의 범위를 요청했는지 확인하세요.
- 라이선스 할당 실패: 대상 사용자에게 지정된 "사용 위치"가 구성되어 있는지 확인하세요. 사용자의 국가 위치가 비어 있으면 Microsoft 365는 라이선스 할당을 거부합니다.
- 모듈 충돌: 충돌하는 모듈 버전 때문에 cmdlet이 실패하면 MSOnline과 같은 레거시 모듈을 완전히 제거하고, 환경을 최신 Microsoft Graph SDK로 표준화하세요.
결론
Microsoft 365에서 라이선스 최적화와 감사를 자동화하면 효율적인 IT 관리와 똑똑한 재무 관리를 함께 달성할 수 있습니다. PowerShell과 Set-MgUserLicense 같은 cmdlet을 활용하면 낭비되는 소프트웨어 지출을 없애고, 엄격한 보안 규정 준수를 적용하며, 엔터프라이즈 전반의 사용자 관리 워크플로를 간소화할 수 있습니다. 최신 도구와 인프라 관리로 기술 역량을 더 넓히고 싶다면, .NET Aspire로 전체 스택을 로컬에서 실행하는 방법을 다룬 관련 에피소드도 꼭 확인해 보시기 바랍니다. 항상 선제적으로 대응하고, 스크립트를 안전하게 관리하며, Microsoft 365 테넌트를 비용 효율이 높고 원활하게 돌아가는 엔진으로 만들어 보시기 바랍니다!