다음을 통해 공유


동기적 쿼리 호출

동기적 쿼리는 쿼리 기간 동안 응용 프로그램 프로세스를 제어하는 쿼리입니다. 동기적 쿼리에는 단일 인터페이스 호출이 필요하므로 비동기적 호출보다 더 간단합니다. 그러나 동기적 쿼리는 네트워크를 통해 대규모 쿼리 또는 쿼리에 대한 응용 프로그램을 잠글 가능성이 있습니다.

다음 절차에서는 PowerShell을 사용하여 동기적 데이터 쿼리를 실행하는 방법을 설명합니다.

PowerShell에서 동기적 데이터 쿼리 실행

  • WMI Get-WmiObject cmdlet 및 -query 매개 변수를 사용하여 WMI에 대한 쿼리를 설명합니다. cmdlet은 쿼리에 맞는 개체 수에 따라 단일 개체 또는 개체 컬렉션을 반환합니다.

    Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
    

다음 절차에서는 C#을 사용하여 동기적 데이터 쿼리를 실행하는 방법을 설명합니다.

C#에서 동기 데이터 쿼리 실행(Microsoft.Management.Infrastructure)

  1. CimSession.QueryInstances를 사용하여 WMI에 대한 쿼리를 설명합니다. 이 메서드는 CimInstance 개체의 컬렉션을 반환합니다.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM Win32_LogicalDisk";
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstances = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    
  2. 표준 C# 언어 컬렉션 기술을 사용하여 반환된 각 개체에 액세스합니다.

    foreach (CimInstance drive in queryInstances)
    {
       Console.WriteLine(drive.CimInstanceProperties["DeviceID"]);
    }
    

다음 절차에서는 C#을 사용하여 동기적 데이터 쿼리를 실행하는 방법을 설명합니다.

C#에서 동기적 데이터 쿼리 실행(System.Management)

  1. ManagementObjectSearcher 개체를 사용해 쿼리를 만들고 ManagementObjectSearcher.Get을 호출해 정보를 검색합니다.

    이 메서드는 ManagementObjectCollection 개체를 반환합니다.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. 표준 C# 언어 컬렉션 기술을 사용하여 반환된 각 개체에 액세스합니다.

    foreach (ManagementObject drive in objCol)
    {
       Console.WriteLine(drive["DeviceID"]);
    }
    

다음 절차에서는 VBScript를 사용하여 동기적 데이터 쿼리를 실행하는 방법을 설명합니다.

VBScript에서 동기적 데이터 쿼리 실행

  1. SWbemServices.ExecQuery를 사용하여 WMI에 대한 쿼리를 설명합니다. 이 메서드는 SWbemObjectSet을 반환합니다.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. 표준 스크립팅 언어 컬렉션 기술을 사용하여 반환된 각 개체에 액세스합니다.

    for each Service in _ 
        GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
        WScript.Echo "  "& Service.DisplayName & " [", Service.Name, "]"
    next
    

다음 절차에서는 C++을 사용하여 동기적 데이터 쿼리를 실행하는 방법을 설명합니다.

C++에서 동기 쿼리 실행

  1. IWbemServices::ExecQuery 호출을 통해 WMI에 대한 쿼리를 설명합니다.

    ExecQuery 메서드는 WQL 검색 문자열을 쿼리를 설명하는 매개 변수로 사용합니다. WMI는 쿼리를 수행하고 IEnumWbemClassObject 인터페이스 포인터를 반환합니다. IEnumWbemClassObject 인터페이스를 통해 결과 집합을 구성하는 클래스 또는 인스턴스에 액세스할 수 있습니다.

  2. 쿼리를 받은 후 IEnumWbemClassObject::Next를 호출하여 쿼리를 열거할 수 있습니다. 자세한 내용은 WMI 열거를 참조하세요.

    다음 코드 예제가 올바르게 컴파일되려면 다음 참조 및 #include 문이 필요합니다.

    #include <wbemidl.h>
    #include <iostream>
    using namespace std;
    

    다음 코드 예제에서는 WMI의 사용자 및 그룹을 나타내는 개체를 쿼리하는 방법을 설명합니다.

    void ExecQuerySync(IWbemServices *pSvc)
    {
        // Query for all users and groups.
    
        BSTR Language = SysAllocString(L"WQL");
        BSTR Query = SysAllocString(L"SELECT * FROM __Namespace");
    
        // Initialize the IEnumWbemClassObject pointer.
        IEnumWbemClassObject *pEnum = 0;
    
        // Issue the query.
        HRESULT hRes = pSvc->ExecQuery(
            Language,
            Query,
            WBEM_FLAG_FORWARD_ONLY,         // Flags
            0,                              // Context
            &pEnum
            );
    
        SysFreeString(Query);
        SysFreeString(Language);
    
        if (hRes != 0)
        {
            printf("Error\n");
            return;
        }
    
        ULONG uTotal = 0;
    
        // Retrieve the objects in the result set.
        for (;;)
        {
            IWbemClassObject *pObj = 0;
            ULONG uReturned = 0;
    
            hRes = pEnum->Next(
                0,                  // Time out
                1,                  // One object
                &pObj,
                &uReturned
                );
    
            uTotal += uReturned;
    
            if (uReturned == 0)
                break;
    
            // Use the object.
    
            // ...
    
            // Release it.
            // ===========
    
            pObj->Release();    // Release objects not owned.            
        }
    
        // All done.
        pEnum->Release();
    }