- WMI와 PowerShell의 CIM cmdlet을 사용하면 로컬 및 원격 관리 정보를 효율적으로 조회하고 수정할 수 있습니다.
- WSMan 또는 DCOM을 사용하는 CimSessions는 최신 및 기존 네트워크 장비에 대한 안전하고 호환 가능한 액세스를 제공합니다.
- 고급 함수, 모듈, 작업 및 DSC를 사용하면 PowerShell은 완벽한 인프라 자동화 언어로 활용될 수 있습니다.
- PowerShell은 로컬, 원격, Azure 및 Microsoft 365 관리를 단일 환경으로 통합하여 반복적인 수동 작업을 줄여줍니다.
윈도우 시스템 관리 업무를 하다 보면 언젠가는 PowerShell, WMI, 그리고 고급 자동화 기능을 접하게 될 것입니다. 단순히 몇 가지 명령어를 실행하는 것만으로는 부족합니다. 수십, 수백 대의 서버를 관리할 때는 혼란스럽거나 시스템을 망가뜨리지 않고 정보를 수집하고, 변경 사항을 적용하고, 작업을 반복하는 데 있어 체계적이고 안전한 접근 방식이 필요합니다.
다음에서는 WMI, CIM 및 PowerShell 원격 통신을 활용하여 간단한 쿼리부터 복잡한 인프라 시나리오까지 모든 것을 자동화하는 방법을 차분하지만 철저하게 살펴보겠습니다. 또한 이러한 모든 기능이 모듈, 백그라운드 작업, Azure, Microsoft 365 및 시스템 관리자의 일상 업무에 실질적인 변화를 가져오는 고급 기능과 어떻게 통합되는지 알아보겠습니다.
PowerShell 개선 사항 및 고급 자동화 개요
Windows PowerShell은 초기 버전 이후로 크게 발전했으며 , 이러한 발전의 상당 부분은 Windows Server 2012에서 이루어졌습니다. Windows Server 2012에서는 원격 통신이 개선되고, 사용 가능한 cmdlet이 확장되었으며, 디버깅, 백그라운드 작업 및 제한된 엔드포인트와 같은 기능이 더 쉬워져 보안이 강화되었습니다.
이 환경의 핵심 아이디어 중 하나는 관리자가 고급 기능, 재사용 가능한 모듈 및 포괄적인 도움말 시스템을 활용하여 복잡한 코딩 없이 cmdlet과 유사한 동작을 생성 할 수 있다는 것입니다 . 즉, 서로 다른 그래픽 도구에 의존하는 대신 서버, 네트워크, Active Directory, Azure 또는 Microsoft 365 관리를 위한 프로세스를 자동화하는 일관된 스크립트 및 모듈 세트를 구축할 수 있습니다.
고급 자동화 분야에서는 비동기적으로 작업을 실행하는 Job, 워크플로, PowerShell DSC를 사용한 구성 기반 관리, JEA(Just Enough Administration) 또는 PowerShell Web Access와 같은 보안 옵션과 같은 기능이 두드러지며, 이를 통해 각 사용자가 수행할 수 있는 작업과 작업 위치를 세부적으로 제어할 수 있습니다.
이러한 전체 생태계는 WMI 및 CIM과 특히 잘 어울립니다. 운영 체제에서 노출되는 관리 정보 (하드웨어, 서비스, 프로세스 , 네트워크 구성, 설치된 소프트웨어 등)가 대량 자동화를 위해 설계된 PowerShell 명령을 사용하여 쿼리, 필터링 및 수정할 수 있는 객체 집합이 되기 때문입니다.
WMI와 CIM: 핵심 개념 및 실제 차이점
WMI (Windows Management Instrumentation) 는 PowerShell에 독립적인 기술로, 오랫동안 Windows에 포함되어 왔습니다. WMI는 운영 체제, 하드웨어 및 다양한 응용 프로그램에 대한 관리 정보를 제공하는 저장소입니다. WMI 자체는 PowerShell에 의존하지 않지만, PowerShell은 WMI를 광범위하게 활용하여 작업을 자동화합니다.
PowerShell 생태계에서 WMI의 자연스러운 후계자는 PowerShell 3.0에서 도입된 CIM(Common Information Model) cmdlet 입니다 . 이러한 cmdlet은 CimCmdlets 모듈에 그룹화되어 있으며 Get-CimInstance, Get-CimClass, New-CimInstance, Invoke-CimMethod, Register-CimIndicationEvent, Set-CimInstance, Remove-CimInstance 등의 명령을 포함합니다.
Windows 10 PowerShell 5.1 또는 Windows 11 PowerShell과 같은 이전 버전의 Windows PowerShell에서는 여전히 기존 WMI cmdlet (Get-WmiObject, Invoke-WmiMethod, Register-WmiEvent, Remove-WmiObject, Set-WmiInstance)을 사용할 수 있습니다. 그러나 이러한 cmdlet은 더 이상 사용되지 않으며 PowerShell 6 이상 버전에는 포함되지 않으므로 레거시 스크립트를 유지 관리하거나 이전 코드를 검토하는 용도로만 사용해야 합니다.
누군가 "CIM cmdlet으로 WMI를 쿼리한다"라고 말할 때, 이는 모순되는 표현이 아닙니다. CIM cmdlet도 여전히 WMI 정보에 접근 하지만, WSMan과 같은 최신 프로토콜과 더욱 일관된 API를 사용합니다. 실질적으로 새로운 개발에서는 CIM에 집중하고, 기존 스크립트를 마이그레이션하거나 이해해야 할 때만 WMI cmdlet을 고려해야 합니다.
과거에는 많은 관리자들이 WQL 쿼리 언어를 사용하는 VBScript를 이용하여 WMI를 쿼리했습니다. 예를 들어, root\CIMV2 네임스페이스 에 연결하여 Win32_BIOS와 같은 클래스를 쿼리하는 식이었죠. 오늘날에는 Get-CimInstance 명령에 -Query 매개변수를 전달하여 동일한 WQL 쿼리를 재사용할 수 있습니다. 덕분에 VBScript에서 PowerShell로 전환할 때 로직을 처음부터 다시 작성할 필요 없이 훨씬 간편하게 작업할 수 있습니다.
Get-CimInstance의 실제 사용 및 효율적인 쿼리
일상적인 작업에서 PowerShell을 사용하여 WMI를 쿼리하는 가장 자연스러운 방법은 전체 WQL 쿼리를 작성하는 대신 -ClassName 매개변수와 함께 Get-CimInstance를 사용하는 것입니다 . 예를 들어 BIOS 정보를 얻으려면 Get-CimInstance -ClassName Win32_BIOS를 사용하면 Manufacturer, Name, SerialNumber 또는 SMBIOSBIOSVersion과 같은 속성을 가진 객체를 얻을 수 있습니다.
PowerShell에서는 모든 것이 객체이기 때문에 필요한 부분만 필터링하고 선택하기가 매우 쉽습니다 . 시리얼 번호만 필요한 경우, 결과를 `Select-Object -Property SerialNumber`로 파이프하거나, 속성이 있는 객체 대신 단순 문자열을 출력하려면 `Select-Object -ExpandProperty SerialNumber`를 사용할 수 있습니다. 또 다른 일반적인 방법은 점 구문(`Get-CimInstance ...`).SerialNumber)을 사용하여 값을 직접 액세스하는 것입니다.
기본적으로 WMI 쿼리는 실제로 사용하는 속성보다 더 많은 속성을 반환한다는 점에 유의해야 합니다 . 로컬 컴퓨터에서는 일반적으로 문제가 없지만, 여러 원격 컴퓨터를 쿼리하기 시작하면 처리 시간이 늘어나고 불필요한 네트워크 트래픽이 발생합니다. 이때 `Get-CimInstance`의 `-Property` 매개변수가 유용하게 사용되며, 소스에서 가져올 속성을 제한할 수 있습니다.
예를 들어 `-Property SerialNumber`를 지정하면 전송되는 데이터 양이 줄어들어 특히 대규모 환경에서 쿼리 속도가 향상되고 효율성이 높아집니다 . 이처럼 "필요한 것만 요청"하는 방식은 수십 또는 수백 대의 컴퓨터에서 실행되는 재고 관리 또는 감사 스크립트를 설계할 때 매우 중요합니다.
요약하자면, Get-CimInstance는 구체적인 클래스, 기존 WQL 쿼리 또는 검색 최적화를 원하는 특정 속성 등 어떤 작업을 하든 간에 단순성(단일 명령줄)과 유연성 사이에서 강력한 균형을 제공합니다.
CIM을 이용한 원격 상담, 세션 및 WSMan/DCOM 프로토콜
로컬 컴퓨터를 벗어나 원격 컴퓨터에 액세스할 때는 권한, 통신 프로토콜, 성능 등 여러 요소가 작용합니다 . 많은 사람들이 PowerShell을 "위험하다"고 생각하지만, 사실 PowerShell은 사용자에게 특별한 권한을 부여하는 것이 아닙니다. 그래픽 인터페이스나 다른 도구와 마찬가지로 동일한 권한만 가지며, 그 이상도 이하도 아닙니다.
해당 컴퓨터에서 충분한 권한 없이 `Get-CimInstance -ComputerName Server -ClassName Win32_BIOS` 명령을 실행하려고 하면 "액세스가 거부되었습니다"라는 오류가 발생합니다 . 이는 PowerShell 자체의 오류가 아니라, 해당 세션을 실행하는 사용자에게 WMI의 해당 정보에 접근할 권한이 없기 때문입니다. 물론 도메인 관리자 계정으로 콘솔을 열 수도 있지만, 그렇게 하면 모든 명령이 관리자 권한으로 실행되므로 많은 환경에서 불필요한 위험을 초래할 수 있습니다.
최소 권한 원칙을 적용하고 필요한 경우에만 권한을 상승시키는 것이 좋습니다 . -Credential 매개변수를 지원하는 cmdlet에서는 해당 명령에 대해서만 대체 자격 증명을 지정할 수 있습니다. 하지만 Get-CimInstance는 -Credential 매개변수를 직접 허용하지 않으므로, CimSessions를 사용하는 것이 효과적인 해결책입니다.
CimSession은 New-CimSession 명령어를 사용하여 컴퓨터 이름과 자격 증명(예: New-CimSession -ComputerName dc01 -Credential (Get-Credential))을 전달하여 생성할 수 있는 원격 컴퓨터에 대한 영구 연결입니다. 이 세션은 $CimSession과 같은 변수에 저장되며, Get-CimInstance 명령어에서 -ComputerName 대신 -CimSession 매개변수를 사용하여 재사용할 수 있으므로 여러 쿼리를 단일 연결로 통합할 수 있습니다.
Get-CimInstance는 자격 증명 요구 사항 외에도 기본적으로 WSMan 프로토콜(WinRM 기반)을 사용합니다 . 즉, 원격 컴퓨터에는 WSMan 스택 버전 3.0 이상이 있어야 하며, 이는 일반적으로 PowerShell 3.0 이상에서 찾아볼 수 있습니다. `Test-WSMan -ComputerName RemoteComputer` 명령을 사용하여 원격 컴퓨터의 WSMan 스택 버전을 확인하고 "Stack" 값이 3.0 이상인지 확인하면 이 연결 방법을 사용할 수 있습니다.
DCOM 및 하위 호환성을 사용하는 CIM 세션
Get-WmiObject를 기반으로 하는 기존 WMI cmdlet은 DCOM 프로토콜에 의존하는데, 이 프로토콜은 이전 버전의 Windows에서 여전히 지원됩니다 . 문제는 최신 시스템에서는 방화벽이 기본적으로 DCOM을 차단하는 경우가 많아 DCOM을 그대로 사용하려면 특정 포트를 열어야 하는데, 이는 조직의 보안 정책을 위반할 수 있다는 점입니다.
CIM cmdlet은 강력한 중간 솔루션을 제공합니다. `New-CimSessionOption -Protocol Dcom` 명령으로 세션 옵션을 생성하고 , 이를 변수(예: `$DCOM`)에 저장한 다음, `New-CimSession` 명령과 결합하여 WSMan 대신 DCOM을 사용하는 CimSession을 생성할 수 있습니다. 이를 통해 PowerShell조차 설치되어 있지 않은 Windows Server 2000 이전의 서버를 포함하여 매우 오래된 서버에도 연결할 수 있습니다.
일반적으로 도메인 관리자 자격 증명이나 관리자 권한 계정의 자격 증명을 변수에 저장해 두면(예: $Cred = Get-Credential ) 매번 입력하는 번거로움을 피할 수 있습니다. 그런 다음 New-CimSession -ComputerName sql03 -SessionOption $DCOM -Credential $Cred와 같은 명령어를 사용하여 WSMan은 지원하지 않지만 WMI는 지원하는 구형 서버에 DCOM을 통해 CimSession을 시작할 수 있습니다.
스크립트 작성자 관점에서 가장 큰 장점은 `Get-CimInstance`의 출력 결과가 프로토콜에 따라 변하지 않는다는 것입니다 . WSMan을 사용하든 DCOM을 사용하든 동일한 객체와 속성을 얻을 수 있습니다. 따라서 적절한 프로토콜을 감지하는 부분을 함수로 캡슐화하고 나머지 코드는 CimSessions를 사용하여 항상 투명하게 작동하도록 할 수 있으므로 로직이 크게 단순화됩니다.
실제로 Test-WSMan을 사용하여 WSMan을 테스트하고, 사용할 수 없는 경우 New-CimSessionOption을 사용하여 자동으로 DCOM으로 전환하는 사용자 지정 함수를 만드는 것이 매우 일반적입니다. 이를 통해 모든 스크립트에서 연결 로직을 복제하지 않고도 최신 서버와 레거시 서버가 혼합된 환경에서 CimSession 생성을 표준화 할 수 있습니다.
CimSessions의 관리, 목록 작성 및 정리
CimSession을 광범위하게 사용하기 시작하면 불필요한 연결이 누적되는 것을 방지하기 위해 세션을 추적하는 것이 중요합니다. Get-CimSession 명령을 사용하면 열려 있는 모든 세션을 나열하고 , 각 세션이 가리키는 컴퓨터와 사용 중인 프로토콜(WSMAN 또는 DCOM)을 확인할 수 있습니다. 이는 연결 또는 인증 문제를 진단하는 데 매우 유용합니다.
또한 `$CimSession = Get-CimSession` 과 같이 변수에 기존 세션을 저장하고, `Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS`와 같은 단일 명령으로 여러 컴퓨터를 한 번에 쿼리하여 WSMan 세션과 DCOM 세션을 동일한 작업으로 결합할 수 있습니다.
정보 분석을 마쳤으면 불필요하게 리소스가 열려 있는 것을 방지하기 위해 세션을 닫는 것이 좋습니다. Get-CimSession | Remove-CimSession cmdlet은 현재 프로필에서 활성화된 모든 CimSession을 한 번에 제거합니다. 또는 Remove-CimSession cmdlet에 특정 세션을 전달하여 일부 세션만 닫을 수도 있습니다.
이러한 방식으로 작업하면 연결 및 연결 해제 주기를 제어 할 수 있습니다 . 이는 예약된 작업, 자동화 런북 또는 지속적 통합 파이프라인 내에서 스크립트를 사용할 때 특히 권장됩니다. 이러한 경우 세션이 연결된 상태로 남아 있을 수 있으므로, 연결 해제에 대한 명확한 계획을 세우는 것이 중요합니다.
PowerShell은 포괄적인 자동화 언어입니다.
WMI와 CIM을 넘어, PowerShell은 일반적인 Windows 관리 스크립트를 훨씬 뛰어넘는 범용 자동화 언어로 발전했습니다 . 고급 기능을 다루는 서적과 강좌들이 있으며, Linux 및 Windows 설치부터 NuGet을 통한 배포 모듈 개발, Visual Studio Code와 같은 최신 개발 환경까지 모든 것을 다룹니다.
일반적으로 PowerShell의 고급 기능을 철저히 이해하는 것이 시작점입니다 . 이러한 기능을 사용하면 매개변수를 정의하고, 유효성 검사를 수행하고, 구조화된 출력을 생성하고, 거의 기본 cmdlet 수준에서 통합 도움말에 액세스할 수 있습니다. 그 다음, 코드를 모듈로 구성하면 운영 팀 내 협업이 용이해집니다. 이러한 모듈에 버전을 관리하고 내부 또는 공개 NuGet 기반 리포지토리에 게시할 수 있기 때문입니다.
사용자 정의 개체 및 클래스를 활용하는 것 또한 핵심적인 요소이며 , 이를 통해 일반적인 선형 스크립트보다 훨씬 풍부한 데이터 모델을 구현할 수 있습니다. PowerShell 엔진을 기반으로 비즈니스 로직을 캡슐화하고, 구조를 재사용하며, 관리팀을 위한 내부 API를 설계할 수 있습니다.
고급 자동화 영역에서 백그라운드 작업과 워크플로는 중요한 역할을 합니다 . 이를 통해 비동기 작업을 관리하고, 콘솔을 차단하지 않고 시간이 오래 걸리는 작업을 실행하며, 여러 시스템에 걸쳐 복잡한 시퀀스를 오케스트레이션할 수 있습니다. 이러한 기능은 WMI/CIM에 대한 대량 쿼리 및 원격 관리 시나리오에 매우 적합합니다. 이러한 시나리오에서는 시스템이 변경 사항을 적용하거나 데이터를 반환할 때까지 기다려야 하는 경우가 많기 때문입니다.
또 다른 핵심 구성 요소는 PowerShell DSC(Desired State Configuration)입니다. 이를 통해 인프라 (역할, 기능, 서비스, 파일, 보안 설정 등)의 원하는 구성을 정의하고 해당 상태를 반복적으로 적용할 수 있습니다. WMI/CIM을 통해 얻은 정보와 결합하면 편차를 감지하고 사전에 수정하여 수동 작업을 줄이면서 일관된 환경을 유지할 수 있습니다.
PowerShell을 이용한 로컬, 원격 및 클라우드 관리
로컬 수준에서 PowerShell은 Active Directory 도메인 서비스 관리 , 네트워크 구성 및 서버 관리를 위한 cmdlet을 제공합니다. Windows 10 이상 버전에서는 통합이 더욱 강화되어 웹 사이트 생성부터 Active Directory 개체 관리 및 네트워크 어댑터 구성에 이르기까지 모든 작업을 자동화할 수 있습니다.
덜 알려져 있지만 매우 유용한 구성 요소로는 PSProviders와 PSDrives가 있습니다 . 이를 통해 파일 시스템, 레지스트리, Active Directory 등 다양한 저장 위치를 마치 탐색 가능한 드라이브처럼 다룰 수 있습니다. 예를 들어, 하드 드라이브를 탐색할 때 사용하는 것과 동일한 구문을 사용하여 원격 컴퓨터에 Active Directory 그룹, 레지스트리 키 또는 폴더 구조를 생성할 수 있습니다.
원격 관리와 관련하여 PowerShell은 하나 이상의 컴퓨터에 연결하고 사용자를 대신하여 명령을 실행할 수 있는 강력한 기능 세트를 제공합니다 . 영구적인 PSSession 세션, 고급 원격 접속 기술, 다대일 시나리오(여러 서버를 동시에 관리), 또는 특정 문제 디버깅을 위한 일대일 시나리오를 사용할 수 있습니다. 물론 이 모든 것은 원격 액세스의 아키텍처 및 보안 모델을 준수하면서 이루어져야 합니다.
오늘날 클라우드는 매우 중요한 역할을 합니다. Azure PowerShell과 Azure Cloud Shell을 사용하면 명령줄에서 직접 가상 머신, 스토리지 및 구독을 관리할 수 있습니다. 하이브리드 환경이나 완전히 Azure에서 호스팅되는 환경을 관리하는 경우 Azure PowerShell 모듈을 설치하고 익숙해지는 것은 거의 필수적입니다.
한편, PowerShell은 Microsoft 365(Exchange Online, SharePoint Online, Teams, 사용자 및 라이선스) 관리를 위한 핵심 도구 로 자리매김했습니다 . 계정 생성 및 관리부터 그룹, SharePoint 사이트, Microsoft Teams를 포함한 Exchange Online 리소스 관리까지 모든 작업을 스크립트를 통해 자동화할 수 있어 웹 포털에서의 수동 작업을 획기적으로 줄일 수 있습니다.
스크립팅, 파이프라인 및 모범 사례
WMI와 CIM을 활용한 고급 자동화를 최대한 활용하려면 PowerShell의 파이프라인 모델을 숙달하는 것이 필수적입니다 . 다른 셸과 달리 일반 텍스트가 아닌 완전한 객체를 전달하므로 정보를 매우 정밀하게 선택, 정렬, 측정, 필터링, 열거 및 변환할 수 있습니다.
파이프라인을 다루는 법을 배우려면 선택 및 필터링 cmdlet을 올바르게 사용하고 , 복잡한 객체를 열거하는 방법을 이해하고, 정보 손실 없이 명령과 스크립트 간에 데이터를 전달하는 방법을 익혀야 합니다. 이러한 과정은 변수, 배열, 해시 테이블과 같은 임시 데이터 구조를 체계적으로 활용하여 더욱 정교한 논리를 구축하는 방식으로 강화됩니다.
다음 단계는 스크립팅 자체입니다. 명령어를 재사용 가능한 스크립트로 패키징하고, 흐름 제어(if, for, foreach)를 사용하고, CSV 파일이나 다른 형식의 데이터를 가져오고, 사용자 입력을 처리하고, 오류를 처리하고, 이벤트 로깅을 수행하는 것입니다. 이 모든 과정을 통해 개별 명령어에서 벗어나 더욱 강력한 내장 도구를 사용할 수 있게 됩니다.
WMI/CIM을 사용하는 대규모 자동화 환경에서는 문제 해결 및 오류 처리가 특히 중요합니다. 네트워크 장애, 잘못된 권한 설정 또는 누락된 클래스와 같은 문제가 제대로 관리되지 않으면 프로세스가 중단될 수 있기 때문입니다. try/catch 블록, 구성 가능한 오류 처리, 그리고 상세한 로깅 기능을 활용하면 이러한 상황을 예측하고 더욱 효과적으로 대응할 수 있습니다.
마지막으로, 함수와 모듈 관련 모든 작업은 전체적인 순환 구조를 완성합니다 . 스크립트에 서명하여 무결성을 보장하고, 함수를 모듈로 패키징하고, 이러한 모듈을 내부 또는 공개 저장소에 배포하고, 조직 내에서 공유 도구 생태계를 구축합니다. 이러한 방식으로 WMI, CIM 또는 원격 통신 관련 모든 새로운 개발 사항은 일관성 있고 유지 관리가 용이한 제품군에 통합됩니다.
위에서 언급한 모든 요소(WMI/CIM, 원격 세션, 스크립팅, 비동기 작업, DSC, Azure, Microsoft 365)를 결합하면 PowerShell을 활용한 고급 자동화가 관리의 핵심이 되는 환경을 구축할 수 있습니다. 모범 사례에 대한 탄탄한 기반, CimSessions(WSMan 및 DCOM 모두 사용)의 지능적인 활용, 그리고 모듈식 스크립트 설계를 통해 그래픽 마법사나 개별 도구에만 의존하는 것보다 훨씬 효율적이고 안전하며 일관적인 방식으로 이기종 인프라를 관리할 수 있습니다.


