다음을 통해 공유


동기 쿼리 호출

동기 쿼리는 쿼리 기간 동안 애플리케이션 프로세스를 제어하는 쿼리입니다. 동기 쿼리에는 단일 인터페이스 호출이 필요하므로 비동기 호출보다 더 간단합니다. 그러나 동기 쿼리는 대규모 쿼리나 네트워크를 통한 쿼리의 경우 애플리케이션을 멈추게 할 위험이 있습니다.

다음 절차에서는 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();
    }