다음을 통해 공유


인스턴스의 일부 업데이트

경우에 따라 인스턴스의 일부만 업데이트하고자 할 수 있습니다. 예를 들어 속성이 많은 인스턴스가 있을 수 있습니다. 이러한 인스턴스를 대량으로 업데이트해야 하는 경우 시스템 성능이 저하될 수 있습니다. 따라서 인스턴스의 일부만 업데이트하도록 선택하여 WMI에서 보내고 가져와야 하는 정보의 양을 줄일 수 있습니다. 그러나 WMI는 부분 인스턴스 작업을 직접 지원하지 않으며 대부분의 공급자도 지원하지 않습니다. 따라서 부분 인스턴스 작업을 사용하는 애플리케이션을 작성하는 경우 C++의 WBEM_E_PROVIDER_NOT_CAPABLE 또는 WBEM_E_NOT_SUPPORTED 오류 코드로 호출이 실패하는 데 대비해야 합니다. 스크립팅 언어에서 오류 코드는 wbemErrProviderNotCapable 또는 wbemErrNotSupported입니다.

스크립팅에서 이 작업은 엔터프라이즈를 통해 매우 많은 수의 개체에서 하나 또는 두 개의 쓰기 가능한 속성을 업데이트할 때만 성능을 지원하는 데 필요합니다. 아니면 SWbemObject.Put_ 또는 SWbemObject.PutAsync_에 대한 일반 VBScript 호출은 전체 개체를 작성하는 것처럼 보이지만 실제로는 공급자가 쓰기를 사용하도록 설정한 속성만 업데이트합니다.

다음 절차에서는 PowerShell을 사용하여 부분 인스턴스 업데이트를 요청하는 방법을 설명합니다.

PowerShell을 사용하여 부분 인스턴스 업데이트를 요청하는 방법

  1. 업데이트할 개체의 경로를 가져옵니다.

    경로를 수동으로 설명하거나 개체를 쿼리한 다음 __Path 속성을 검색할 수 있습니다.

    $myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path
    #or
    $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
    
  2. 업데이트할 속성의 이름을 나열하는 해시 테이블을 설정하고 Set-WmiInstance 호출에서 이 해시 테이블을 사용합니다.

    $newDriveName = @{VolumeName = "OSDisk"}
    Set-WmiInstance -Path $myWMIDrivePath -Arguments $newDriveName
    

다음 절차에서는 C#을 사용하여 부분 인스턴스 업데이트를 요청하는 방법을 설명합니다.

참고

System.Management는 WMI에 액세스하는 데 사용되는 원래 .NET 네임스페이스였습니다. 그러나 이 네임스페이스의 API는 일반적으로 최신 네임스페이스인 Microsoft.Management.Infrastructure에 비해 더 느리고 스케일링 성능이 떨어집니다.

 

C#을 사용하여 부분 인스턴스 업데이트를 요청하는 방법

  1. 업데이트할 특정 인스턴스를 나타내는 새 ManagementObject 개체를 만듭니다.

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. ManagementObject.SetPropertyValue를 호출하여 속성 값을 설정합니다.

    myDisk.SetPropertyValue("VolumeName", "OSDisk");
    

다음 절차에서는 VBScript를 사용하여 부분 인스턴스 업데이트를 요청하는 방법을 설명합니다.

VBScript를 사용하여 부분 인스턴스 업데이트를 요청하는 방법

  1. SWbemNamedValueSet 컨텍스트 개체를 만듭니다.

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. SWbemNamedValueSet.Add 메서드를 사용하여 컨텍스트 개체에 확장 값 "__PUT_EXTENSIONS" 및 "__PUT_EXT_CLIENT_REQUEST"를 추가합니다.

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. 업데이트할 속성의 이름을 나열하는 배열을 설정하고 Put 확장 값이 "__PUT_EXT_PROPERTIES"인 SWbemNamedValueSet 컨텍스트 개체에 이 배열을 추가합니다.

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. SWbemObject.Put_ 호출의 iFlags 매개 변수를 wbemChangeFlagUpdateOnly로 설정합니다. 이 플래그가 없으면 잘못된 컨텍스트로 호출이 실패합니다.

  5. 플래그 및 컨텍스트 개체를 SWbemObject.Put_ 또는 SWbemObject.PutAsync_objwbemNamedValueSet 매개 변수에 있는 공급자에게 전달합니다.

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

다음 절차에서는 C++를 사용하여 부분 인스턴스 업데이트를 요청하는 방법을 설명합니다.

C++를 사용하여 부분 인스턴스 업데이트를 요청하는 방법

  1. CoCreateInstance를 호출하여 IWbemContext 개체를 만듭니다.

    컨텍스트 개체는 WMI가 WMI 공급자에게 추가 정보를 전달하는 데 사용하는 개체입니다. 이 경우 IWbemContext 개체를 사용하여 공급자에게 부분 인스턴스 업데이트를 수락하도록 지시합니다.

  2. IWbemContext::SetValue 호출을 통해 "__PUT_EXTENSIONS" 및 "__PUT_EXT_CLIENT_REQUEST"로 명명된 값을 IWbemContext 개체에 추가합니다.

    다음 표에는 "__PUT_EXTENSIONS" 및 "__PUT_EXT_CLIENT_REQUEST"의 의미가 명시되어 있습니다.

    명명된 값 설명
    "__PUT_EXTENSIONS" VT_BOOLVARIANT_TRUE로 설정됩니다. 하나 이상의 다른 컨텍스트 값이 지정되었음을 나타내는 값입니다. 이렇게 하면 공급자 내의 컨텍스트 개체를 빠르게 확인하여 부분 인스턴스 업데이트가 사용되고 있는지 확인할 수 있습니다.
    "__PUT_EXT_CLIENT_REQUEST" VT_BOOLVARIANT_TRUE로 설정됩니다. 초기 요청 중에 클라이언트에서 설정합니다. 이 값은 재진입 오류를 방지하는 데 사용됩니다.

     

  3. IWbemContext::SetValue에 대한 다른 호출을 통해 필요에 따른 조합으로 __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES 또는 __PUT_EXT_ATOMIC을 IWbemContext 개체에 추가합니다.

    다음 표에는 명명된 값의 의미가 명시되어 있습니다.

    명명된 값 설명
    "__PUT_EXT_STRICT_NULLS" VT_BOOLVARIANT_TRUE로 설정됩니다. 클라이언트가 의도적으로 속성을 VT_NULL로 설정했으며 쓰기 작업이 성공할 것으로 예상했음을 나타냅니다. 공급자가 값을 NULL로 설정할 수 없는 경우 오류를 보고해야 합니다.
    "__PUT_EXT_PROPERTIES" 업데이트할 속성 이름 목록이 포함된 문자열의SAFEARRAY입니다. 단독으로 또는 "__PUT_EXT_PROPERTIES"와 함께 사용할 수 있습니다. 값은 작성 중인 인스턴스에 있습니다.
    "__PUT_EXT_ATOMIC" VT_BOOLVARIANT_TRUE로 설정됩니다. 모든 업데이트가 동시에 성공하거나(원자성 의미 체계) 공급자가 되돌려야 했음을 나타냅니다. 부분적인 성공은 있을 수 없습니다. 단독으로 또는 다른 플래그와 함께 사용할 수 있습니다.

     

  4. iFlags 매개 변수를 WBEM_FLAG_UPDATE_ONLY로 설정합니다. 이 플래그가 없으면 잘못된 컨텍스트로 호출이 실패합니다.

  5. IWbemContext 컨텍스트 개체를 pCtx 매개 변수의 IWbemServices::PutInstance 또는 IWbemServices::PutInstanceAsync 호출로 전달합니다.

    IWbemContext 개체를 전달하면 공급자가 부분 인스턴스 업데이트를 허용하도록 지시합니다. 전체 인스턴스 업데이트에서 pCtxNULL로 설정합니다.

    호출에 있는 컨텍스트 개체에 "__PUT_EXTENSIONS"이 포함되지 않은 경우 공급자가 필요한 속성을 작성할 수 있습니다. 컨텍스트 개체에 "__PUT_EXTENSIONS"이 있는 경우 WMI에서는 공급자가 작업의 의미 체계를 정확하게 준수하거나 아니면 호출에 실패해야 합니다. 자세한 내용은 공급자에서 액세스 거부 메시지 처리를 참조하세요.