更新部分实例

有时,您可能只想更新部分实例。 例如,某些实例的属性很多。 如果必须更新大量这些实例,则可能会降低系统性能。 因此,您可以选择仅更新部分实例,从而减少您必须发送和检索 WMI 的信息量。 但是,WMI 不直接支持部分实例操作,也不会执行大多数提供程序。 因此,如果你编写使用部分实例操作的应用程序,请准备好调用,使其无法使用 wbem _ e _ 提供程序 _ _wbem _ e _ 不 _ 支持 c + + 中的错误代码。 在脚本语言中,错误代码为 wbemErrProviderNotCapablewbemErrNotSupported

在脚本编写中,只需执行此操作,就可以在企业中更新大量对象中的一个或两个可写属性时帮助提高性能。 否则,普通 VBScript 对 SWbemObject __ SWbemObject的调用,而看似写入整个对象,实际上只是更新提供程序已启用写功能的属性。

下面的过程介绍如何使用 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.web 是用于访问 WMI 的原始 .net 命名空间;但是,此命名空间中的 Api 的速度通常较慢,并且相对于 更现代的

使用 C 请求部分实例更新#

  1. 创建一个新的 system.management.managementobject 对象,该对象表示要更新的特定实例。

    using System.Management;
    ...
    ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    
  2. 使用对 system.management.managementobject的调用设置属性值。

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

下面的过程介绍如何使用 VBScript 请求部分实例更新。

使用 VBScript 请求部分实例更新

  1. 创建 SWbemNamedValueSet 上下文对象。

    Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
    
  2. 使用 SWbemNamedValueSet 方法将 Put 扩展值 " _ _ put extension _ " 和 " _ _ put _ EXT _ CLIENT _ REQUEST" 添加到上下文对象

    objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True
    objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
    
  3. 设置一个数组,其中列出要更新的属性的名称,并将此数组添加到带有 Put extension 值 " _ _ put _ EXT _ properties" 的 SWbemNamedValueSet 上下文对象。

    arProperties = Array("propertyname1", "propertyname2") 
    objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
    
  4. _ SWbemObject调用的 IFlags 参数设置为 wbemChangeFlagUpdateOnly。 如果没有此标志,则调用将失败,并出现无效的上下文。

  5. 将标志和上下文对象传递到 _ SWbemObject _ 或 SWbemObjectobjwbemNamedValueSet 参数中的提供程序。

    call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
    

下面的过程介绍如何使用 c + + 请求部分实例更新。

使用 c + + 请求部分实例更新

  1. 使用对 CoCreateInstance的调用创建 IWbemContext对象。

    上下文对象是 WMI 用来将详细信息传入 WMI 提供程序的对象。 在这种情况下,你将使用 IWbemContext 对象来指示提供程序接受部分实例更新。

  2. _ _ _ 调用 IWbemContext:: SetValue,将 "put extension" 和 " _ _ put _ EXT _ CLIENT _ REQUEST" 命名值添加到 IWbemContext对象。

    下表列出了 " _ _ put _ extension" 和 " _ _ put _ EXT _ CLIENT _ REQUEST" 的含义。

    命名值 说明
    " _ _ PUT _ EXTENSION" VT _布尔 值设置为 变体 _ TRUE。 指示已指定一个或多个其他上下文值的值。 这样,便可以快速检查提供程序内的上下文对象,以确定是否正在使用部分实例更新。
    " _ _ PUT _ EXT _ CLIENT _ REQUEST" VT _布尔 值设置为 变体 _ TRUE。 在初始请求期间由客户端设置。 此值用于防止重入错误。
  3. 添加 _ _ put _ ext _ STRICT _ null、 _ _ put _ ext _ PROPERTIES,或 _ _ _ 根据需要将 Ext 原子添加 _ 到 IWbemContext对象,并调用 IWbemContext:: SetValue

    下表列出了命名值的含义。

    命名值 说明
    " _ _ PUT _ EXT _ STRICT _ NULL" VT _布尔 值设置为 变体 _ TRUE。 指示客户端有意将属性设置为 VT _ NULL ,并期望写入操作成功。 如果提供程序无法将值设置为 NULL,则应报告错误。
    " _ _ PUT _ EXT _ PROPERTIES" 字符串的 SAFEARRAY ,其中包含要更新的属性名称的列表。 可以单独使用,也可以与 " _ _ PUT _ EXT _ PROPERTIES" 结合使用。 值在要写入的实例中。
    " _ _ PUT _ EXT _ 原子" VT _布尔 值设置为 变体 _ TRUE。 指示所有更新必须 (原子语义同时成功) 或者提供程序必须还原。 可能没有部分成功。 可以单独使用,也可以与其他标志一起使用。
  4. iFlags 参数设置为 _ _ _ 仅限 WBEM 标志更新。 如果没有此标志,则调用将失败,并出现无效的上下文。

  5. IWbemContext上下文对象传递到 pCtx 参数中的 Iwbemservices::P Utinstanceiwbemservices::P utinstanceasync的任何调用。

    传递 IWbemContext 对象会指示提供程序允许部分实例更新。 在完全实例更新中,将 pCtx 设置为 NULL

    如果调用中的上下文对象不包含 " _ _ PUT extension",则该提供程序可能会写入任何必需 _ 的属性。 如果 _ _ _ 上下文对象中存在 "PUT extension",则 WMI 要求提供程序完全遵守操作的语义,否则调用将失败。 有关详细信息,请参阅 处理提供程序中的拒绝访问消息