원격 컴퓨터에서 WMI에 연결

WMI를 사용하여 원격 컴퓨터에서 WMI 데이터를 관리하고 액세스할 수 있습니다. WMI의 원격 연결은 Windows 방화벽 및 DCOM 설정의 영향을 받습니다. UAC(사용자 계정 컨트롤)에 따라 일부 설정을 변경해야 할 수도 있습니다. 일단 설정을 올바르게 구성했다면 원격 시스템에 대한 호출은 로컬 WMI 호출과 매우 유사합니다. 다른 자격 증명, 대체 인증 프로토콜 및 기타 보안 기능을 사용하여 더 복잡한 호출을 만들 수도 있습니다.

원격 연결을 위해 컴퓨터 구성

WMI를 사용하여 원격 시스템에 액세스하려면 먼저 몇 가지 보안 설정을 검토하여 액세스 권한이 있는지 확인해야 할 수 있습니다. 특히 다음 사항에 주의하세요.

  • Windows에는 원격 시스템의 스크립트에 대한 액세스를 차단할 수 있는 여러 보안 기능이 있습니다. 따라서 WMI 호출을 진행하려면 먼저 시스템의 Active Directory 및 Windows 방화벽 설정을 수정해야 할 수 있습니다. 자세한 내용은 원격 WMI 연결 설정원격 WMI 연결 문제 해결을 참조하세요.

  • 원격 연결이 작동하려면 올바른 DCOM 설정을 적용해야 합니다. DCOM 설정을 변경하면 낮은 권한을 갖는 사용자가 원격 연결을 위해 컴퓨터에 액세스하는 것이 가능해질 수 있습니다. 자세한 내용은 원격 WMI 연결 보안을 참조하세요.

고정 포트를 통해 WMI를 실행하려는 경우도 있을 수 있습니다. 이렇게 하려면 설정을 변경해야 합니다. 자세한 내용은 WMI에 대한 고정 포트 설정을 참조하세요.

원격 컴퓨터에 연결

WMI를 사용하여 원격 시스템에 연결하려면 시스템에 액세스하기 위한 적절한 권한이 있고 연결이 올바르게 구성되었는지 확인해야 합니다. 이 두 가지 작업을 마쳤다면 연결 자체는 비교적 간단합니다. 예를 들어, 기본 보안 자격 증명을 사용하는 경우 다음 코드를 사용하여 원격 시스템의 WMI에 액세스할 수 있습니다.

PowerShell을 사용하여 원격으로 WMI에 연결

Get-WmiObject와 같은 대부분의 WMI cmdlet이 공통으로 갖고 있는 -ComputerName 매개 변수를 사용합니다.

$strComputer = "Computer_B"
$colSettings = Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer

VBScript를 사용하여 원격으로 WMI에 연결

GetObject 호출에서 원격 시스템의 이름을 포함하는 모니커를 사용합니다.

strComputer = "Computer_B"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

C#을 사용하여 원격으로 WMI에 연결

최신 버전 WMI 관리형 인터페이스(Microsoft.Management.Infrastructure)의 경우 CimSession 개체를 사용하여 원격 호스트에 대한 연결을 나타냅니다.

using Microsoft.Management.Infrastructure;
...
string Namespace = @"root\cimv2";
string OSQuery = "SELECT * FROM Win32_OperatingSystem";
CimSession mySession = CimSession.Create("Computer_B");
IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", OSQuery);

C#을 사용하여 원격으로 WMI에 연결

WMI 관리형 인터페이스의 v1 버전(System.Management)의 경우 ManagementScope 개체를 사용하여 원격 호스트에 대한 연결을 나타냅니다.

using System.Management;
...
ManagementScope scope = new ManagementScope("\\\\Computer_B\\root\\cimv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

예: 원격 컴퓨터에서 WMI 데이터 가져오기(C++)

IWbemLocator::ConnectServer 메서드를 사용하여 strNetworkResource 매개 변수에 원격 컴퓨터의 이름을 지정합니다.

    hres = pLoc->ConnectServer(
        _bstr_t(L"\\\\COMPUTER_B\\root\\cimv2"),
        _bstr_t(useToken?NULL:pszName),    // User name
        _bstr_t(useToken?NULL:pszPwd),     // User password
        NULL,                              // Locale             
        NULL,                              // Security flags
        _bstr_t(useNTLM?NULL:pszAuthority),// Authority        
        NULL,                              // Context object 
        &pSvc                              // IWbemServices proxy
        );

위에 나온 여러 코드 샘플은 WMI를 사용하여 수행할 수 있는 가장 기본적인 원격 연결이라고 할 수 있습니다. 위의 여러 샘플에서는 다음을 가정합니다.

  • 사용자가 원격 머신의 관리자입니다. 사용자 계정 컨트롤로 인해, 원격 시스템의 계정은 관리자 그룹에 속한 도메인 계정이어야 합니다. 자세한 내용은 사용자 계정 컨트롤 및 WMI를 참조하세요.
  • 현재 로컬 컴퓨터의 암호가 비어 있지 않습니다. 이는 암호를 사용하여 시스템에 로그온해야 한다는 Windows 보안 요구 사항입니다.
  • 로컬 컴퓨터와 원격 컴퓨터가 모두 동일한 도메인에 있습니다. 도메인 경계를 넘어야 하는 경우 추가 정보를 제공하거나 약간 다른 프로그래밍 모델을 사용해야 합니다.
  • 사용자 자체 계정을 사용하여 원격 머신에 액세스하고 있습니다. 다른 계정에 액세스하려면 추가 자격 증명을 제공해야 합니다. (현재 계정과 다른 자격 증명을 사용하여 WMI에 로컬로 액세스하는 것은 허용되지 않습니다.)
  • 두 컴퓨터 모두 IPv6을 실행하고 있습니다. WMI는 IPv6을 실행하는 컴퓨터에 대한 연결을 지원합니다. 단, 로컬 컴퓨터와 “Computer_B”가 모두 IPv6을 실행해야 합니다. 동시에 IPv4를 실행하고 있을 수도 있습니다. 자세한 내용은 WMI의 IPv6 및 IPv4 지원을 참조하세요.
  • 스크립트는 위임할 필요가 없습니다. 즉, 대상 원격 컴퓨터를 통해 추가 원격 컴퓨터에 액세스할 필요가 없습니다. 자세한 내용은 WMI를 사용하여 위임을 참조하세요.
  • 원격 프로세스를 만드는 것이 아니라 특정 호출을 수행하려고 합니다. 자세한 내용은 WMI를 사용하여 원격으로 프로세스 만들기를 참조하세요.

이와 같은 제한 사항을 염두에 두었다면 원격 WMI 호출은 로컬 WMI 호출과 매우 유사합니다. 유일한 차이점은 원격 시스템의 이름을 지정해야 한다는 것입니다. 원하는 경우 다른 자격 증명을 사용하거나, 타사 컴퓨터를 통과하도록 호출을 라우팅하거나, 다른 도메인에 액세스하는 등 여러 기능을 변경할 수 있습니다.