숙련된 모든 Windows 관리자는 WMI 서비스(Windows Management Instrumentation) 및 해당 구성 요소와 관련된 몇 가지 문제에 직면했습니다. WMI 하위 시스템의 문제는 Windows의 정상적인 작동에 매우 중요하므로 관리자는 가능한 한 빨리 WMI의 기능을 확인하고 복원해야 합니다. 이 기사에서는 Windows 10 및 Windows Server 2016/2019에서 WMI 문제를 해결하고 수정하는 아주 간단한 기술에 대해 설명합니다.
WMI 문제는 광범위한 오류를 나타낼 수 있습니다.
- 시스템 및 애플리케이션 로그의 WMI 쿼리 처리 오류(
0x80041002 - WBEM_E_NOT_FOUND
,WMI: Not Found
,0x80041010 WBEM_E_INVALID_CLASS
); - WMI와 관련된 GPO 처리 오류(그룹 정책의 WMI 필터의 잘못된 작업 등)
- WMI 쿼리가 매우 느림
- SCCM/SCOM 에이전트 설치 또는 작동 중 오류
- WMI 네임스페이스를 사용하는 스크립트(VBS 또는 PowerShell)의 오류(Get-WmiObject가 있는 스크립트 등)
WMI 문제 해결
첫 번째 단계는 Windows Management Instrumentation(Winmgmt
) 서비스가 Windows에 설치되어 실행 중입니다. services.msc
에서 서비스 상태를 확인할 수 있습니다. 콘솔 또는 PowerShell 사용:
Get-Service Winmgmt | Select DisplayName,Status,ServiceName
선택
Winmgmt 서비스가 실행 중인 경우 간단한 WMI 명령으로 쿼리하여 WMI의 상태를 테스트할 수 있습니다. 명령 프롬프트 또는 PowerShell에서 wmi 요청을 실행할 수 있습니다. 예를 들어 다음 명령은 Windows에 설치된 프로그램을 나열합니다.
wmic product get name,version
WMI를 통해 Windows 10의 버전 및 빌드에 대한 정보를 가져오는 가장 간단한 PowerShell 명령은 다음과 같습니다.
get-wmiobject Win32_OperatingSystem
보시다시피 WMI 서비스는 요청에 올바르게 응답했습니다. 이러한 WMI 쿼리를 실행할 때 Windows에서 오류를 반환하면 WMI 서비스가 제대로 작동하지 않거나 WMI 저장소가 손상되었거나 다른 문제가 있을 가능성이 큽니다.
예를 들어 제 경우에는 컴퓨터 관리 스냅인(compmgmt.msc
)에서 WMI 컨트롤 속성을 열 때 ), 다음 메시지가 나타납니다.
Failed to initialize all required WMI classes Win32_Processor. WMI: Invalid namespace Win32_WMISetting. WMI: Invalid namespace Win32_OperationSystem. WMI: Invalid namespace
이전에는 공식 Microsoft 도구 WMIDiag.vbs (Microsoft WMI 진단)을 사용하여 WMI를 진단했습니다. WMIdiag는 다양한 WMI 하위 시스템을 확인하고 수집된 정보를 로그 파일에 기록하는 vbs 스크립트입니다(기본적으로 로그는 %TEMP% 폴더 – C:\USERS\%USERNAME%\APPDATA\LOCAL\TEMP\
). 결과 보고서는 이름이 WMIDIAG-V2.2로 시작하는 파일로 구성되며 다음 파일 형식을 포함합니다.
- LOG 파일에는 WMIDiag 도구의 활동 및 작동에 대한 자세한 보고서 보고서가 포함되어 있습니다.
- TXT 파일에는 주의할 가치가 있는 발견된 오류의 요약 보고서가 포함되어 있습니다.
- CSV 파일에는 WMI 성능의 장기 분석에 필요한 정보가 포함되어 있습니다.
<강한>
c:\windows\System32\cscript.exe wmidiag.vbs
그렇지 않으면 오류가 발생합니다:
WMIDiag must be run from native 64-bit environment. It is not supported in Wow64.
WMIDiag가 작업을 완료한 후 관리자는 로그 파일을 검사하고 발견된 오류를 분석하고 수정해야 합니다.
안타깝게도 최신 버전의 WMIDiag 2.2는 Windows 8.1/Windows Server 2012 R2 이하 버전에서만 올바르게 작동합니다. 이 시점에서 Microsoft는 다운로드 센터에서 WMIDiag를 다운로드하는 링크도 제거했습니다. 하지만 원하는 경우 이 스크립트를 웹에서 찾을 수 있습니다.
WMIDiag는 WMI에서 로컬 오류를 수정하는 방법에 대한 자세한 정보를 제공하지만 대부분의 경우 시간이 많이 소요되는 작업이며 중요한 시스템(일반적으로 프로덕션 서버에서)의 문제에 대한 솔루션을 찾을 때만 시간을 할애할 가치가 있습니다. . 사용자 워크스테이션의 경우 Windows에서 WMI 저장소를 재설정하고 다시 작성하는 것이 훨씬 쉽습니다.
WMI 저장소 복구 및 MOF 파일 재컴파일
Windows 10/Windows Server 2016에서는 다음 명령을 사용하여 WMI 리포지토리의 무결성을 확인할 수 있습니다.
winmgmt /verifyrepository
명령이 WMI 데이터베이스가 일관성 없는 상태(INCONSISTENT
또는 WMI repository verification failed
), WMI 리포지토리 오류의 소프트 픽스를 시도해야 합니다.
Winmgmt /salvagerepository
WMI repository has been salvaged.
이 명령은 WMI 저장소의 일관성을 확인하고 불일치가 발견되면 WMI 데이터베이스를 다시 작성합니다.
WMI 서비스 다시 시작:
net stop Winmgmt
net start Winmgmt
표준 WMI 수정이 작동하지 않으면 다음 스크립트를 시도하십시오. 이 스크립트는 컴퓨터에서 WMI 서비스를 복구하기 위한 "소프트" 옵션입니다(DLL 라이브러리 및 WMI가 다시 등록되고 MOF 파일이 다시 컴파일됨). 이 절차는 안전합니다. 그리고 그 구현은 운영 체제에 더 이상 문제를 일으키지 않아야 합니다.
sc config winmgmt start= disabled
net stop winmgmt
cd %windir%\system32\wbem
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
wmiprvse /regserver
sc config winmgmt start= auto
net start winmgmt
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s
cd %windir%\SysWOW64\wbem
이러한 명령은 단순히 명령 프롬프트에 붙여넣어 실행하거나 스크립트를 BAT 파일(wmi_soft_repair.bat ) 관리자 권한으로 실행합니다. 스크립트가 완료되면 Windows를 다시 시작하고 WMI가 작동하는지 확인합니다.
WMI 저장소 재구축
위에 설명된 방법이 도움이 되지 않으면 WMI 리포지토리의 재생성을 의미하는 WMI 복구의 "하드" 방법을 사용하십시오.
WMI 저장소%windir%\System32\Wbem\Repository
에 있습니다. WMI 클래스의 메타데이터 및 정의에 대한 정보를 포함하는 데이터베이스입니다. 경우에 따라 WMI 리포지토리에 정적 클래스 정보도 포함될 수 있습니다. 리포지토리가 손상되면 WMI 서비스(Winmgmt)의 활동에 오류가 발생합니다. WMI 리포지토리가 손상된 것으로 의심되는 경우 WMI를 복원하는 다른 방법이 효과적이지 않은 경우에만 다시 만들어야 한다는 점에 유의하십시오.
다음 명령은 WMI 데이터베이스를 원래 상태로 재설정합니다(새 Windows 설치 후). salvagerepository 매개변수로 문제가 해결되지 않은 경우 다음 명령을 사용하여 WMI 리포지토리를 하드 리셋합니다.
Winmgmt /resetrepository
두 명령(Winmgmt /salvagerepository
및 Winmgmt /resetrepository
) WMI 데이터베이스의 일관된 상태를 복원하지 못했습니다. 다음 스크립트를 사용하여 WMI 데이터베이스의 하드 리셋을 수행해 보십시오.
sc config winmgmt start= disabled
sc config winmgmt start= disabled
net stop winmgmt
cd %windir%\system32\wbem
winmgmt /resetrepository
winmgmt /resyncperf
if exist Repos_bakup rd Repos_bakup /s /q
rename Repository Repos_bakup
regsvr32 /s %systemroot%\system32\scecli.dll
regsvr32 /s %systemroot%\system32\userenv.dll
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s
sc config winmgmt start= auto
net start winmgmt
wmiprvse /regserver
64비트 버전의 Windows에서는 DLL/EXE를 다시 등록하고 %windir%\sysWOW64\wbem 디렉터리에서 MOF 파일을 다시 컴파일해야 합니다.
이 스크립트는 WMI 리포지토리 폴더를 완전히 제거하고 다시 만듭니다(이전 리포지토리는 Repos_backup 디렉터리에 저장됨). 스크립트가 완료되면 Windows를 다시 시작해야 합니다. 그런 다음 간단한 쿼리로 WMI 서비스를 확인하십시오.
WMI 리포지토리 상태를 확인합니다. 오류가 수정되면 winmgmt /verifyrepository
명령은 다음을 반환해야 합니다.
WMI repository is consistent
이 기사에서는 WMI 서비스 및 리포지토리를 진단하고 문제를 해결하는 기본적인 방법을 보여주었습니다.