다음을 통해 공유


원격 컴퓨터에서 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를 사용하여 수행할 수 있는 가장 기본적인 원격 연결입니다. 특히 샘플에서는 다음을 가정합니다.

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

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