Örneğin Bir Bölümünü Güncelleştirme
Bazen bir örneğin yalnızca bir bölümünü güncelleştirmek isteyebilirsiniz. Örneğin, bazı örneklerin çok sayıda özelliği vardır. Bu örneklerin çok sayıda güncelleştirmeniz gerekiyorsa sistem performansını düşürebilirsiniz. Bu nedenle, örneğin yalnızca bir bölümünü güncelleştirmeyi seçebilir ve böylece WMI'ye ve WMI'den göndermeniz ve almanız gereken bilgi miktarını azaltabilirsiniz. Ancak, WMI kısmi örnek işlemlerini doğrudan desteklemediği gibi, çoğu sağlayıcı da bunu desteklemez. Bu nedenle, kısmi örnek işlemleri kullanan bir uygulama yazarsanız, çağrılarınızın C++ içindeki WBEM_E_PROVIDER_NOT_CAPABLE veya WBEM_E_NOT_SUPPORTED hata koduyla başarısız olmasına hazırlıklı olun. Betik dillerinde hata kodları ya wbemErrProviderNotCapable ya da wbemErrNotSupportedşeklindedir.
Betik oluşturmada, bu işlem yalnızca bir kuruluş genelinde çok sayıda nesne üzerinde bir veya iki yazılabilir özelliği güncelleştirirken performansa yardımcı olmak amacıyla gereklidir. Aksi takdirde, normal VBScript SWbemObject.Put_ veya SWbemObject.PutAsync_çağrıları, nesnenin tamamını yazıyor gibi görünmesine rağmen, aslında yalnızca sağlayıcının yazma etkin olduğu özellikleri güncelleştirir.
Aşağıdaki yordamda, PowerShell kullanarak kısmi örnek güncelleştirmesinin nasıl istendiği açıklanmaktadır.
PowerShell kullanarak kısmi örnek güncelleştirmesi istemek için
Güncelleştirmek istediğiniz nesnenin yolunu alın.
Yolu el ile açıklayabilir veya nesneyi sorgulayabilir ve ardından __Path özelliğini alabilirsiniz.
$myWMIDrivePath = (get-wmiObject Win32_LogicalDisk -filter "Name = 'C:'").__Path #or $myWmiDrivePath = \\myComputer\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
Güncelleştirilecek özelliklerin adlarını listeleyen bir karma tablo ayarlayın ve bu karma tabloyu Set-WmiInstance çağrısında kullanın.
$newDriveName = @{VolumeName = "OSDisk"} Set-WmiInstance -Path $myWMIDrivePath -Arguments $newDriveName
Aşağıdaki yordamda, C# kullanarak kısmi örnek güncelleştirmesinin nasıl istendiği açıklanmaktadır.
Not
System.Management WMI'ye erişmek için kullanılan özgün .NET ad alanıydı; ancak, bu ad alanındaki API'ler genellikle daha yavaştır ve daha modern Microsoft.Management.Infrastructure karşılıklarına göre ölçeklendirilmemektedir.
C# kullanarak kısmi örnek güncelleştirmesi istemek için
Güncelleştirilecek örneği temsil eden yeni bir ManagementObject nesnesi oluşturun.
using System.Management; ... ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
ManagementObject.SetPropertyValueçağrısıyla özellik değerini ayarlayın.
myDisk.SetPropertyValue("VolumeName", "OSDisk");
Aşağıdaki yordamda VBScript kullanılarak kısmi örnek güncelleştirmesinin nasıl istendiği açıklanmaktadır.
VBScript kullanarak kısmi örnek güncelleştirmesi istemek için
SWbemNamedValueSet bağlam nesnesi oluşturun.
Set objwbemNamedValueSet = CreateObject ("WbemScripting.SWbemNamedValueSet")
SWbemNamedValueSet.Add yöntemini kullanarak bağlam nesnesine "__PUT_EXTENSIONS" ve "__PUT_EXT_CLIENT_REQUEST" uzantı değerlerini ekleyin.
objwbemNamedValueSet.Add "__PUT_EXTENSIONS", True objwbemNamedValueSet.Add "__PUT_EXT_CLIENT_REQUEST", True
Güncelleştirilecek özelliklerin adlarını listeleyen bir dizi ayarlayın ve bu diziyi "__PUT_EXT_PROPERTIES" Put uzantısı değeriyle SWbemNamedValueSet bağlam nesnesine ekleyin.
arProperties = Array("propertyname1", "propertyname2") objwbemNamedValueSet.Add "__PUT_EXT_PROPERTIES", arProperties
iFlags parametresini SWbemObject.Put_ çağrısında wbemChangeFlagUpdateOnlyolarak ayarlayın. Bu bayrak olmadan çağrı geçersiz bir bağlamla başarısız olur.
bayrağınızı ve bağlam nesnenizi SWbemObject.Put_ veya SWbemObject.PutAsync_objwbemNamedValueSet parametresinde sağlayıcıya geçirin.
call objSystem.put_( wbemChangeFlagUpdateOnly, objwbemNamedValueSet)
Aşağıdaki yordamda, C++ kullanarak kısmi örnek güncelleştirmesinin nasıl istendiği açıklanmaktadır.
C++ kullanarak kısmi örnek güncelleştirmesi istemek için
CoCreateInstanceçağrısıyla bir IWbemContext nesnesi oluşturun.
Bağlam nesnesi, WMI'nin bir WMI sağlayıcısına daha fazla bilgi geçirmek için kullandığı bir nesnedir. Bu durumda, sağlayıcıya kısmi örnek güncelleştirmelerini kabul etmelerini bildirmek için IWbemContext nesnesini kullanıyorsunuz.
IWbemContext::SetValueçağrısıyla IWbemContext nesnesine "__PUT_EXTENSIONS" ve "__PUT_EXT_CLIENT_REQUEST" adlı değerleri ekleyin.
Aşağıdaki tabloda "__PUT_EXTENSIONS" ve "__PUT_EXT_CLIENT_REQUEST" anlamları listelenmiştir.
Adlandırılmış değer Açıklama "__PUT_EXTENSIONS" VT_BOOLVARIANT_TRUEolarak ayarlandı. Bir veya daha fazla diğer bağlam değerinin belirtildiğini belirten bir değer. Bu, kısmi örnek güncelleştirmelerinin kullanılıp kullanılmadığını saptamak için sağlayıcı içindeki bağlam nesnesinin hızlı bir şekilde denetlenmesini sağlar. "__PUT_EXT_CLIENT_REQUEST" VT_BOOLVARIANT_TRUEolarak ayarlanır. İlk istek sırasında istemci tarafından ayarlanır. Bu değer, yeniden giriş hatalarını önlemek için kullanılır. __PUT_EXT_STRICT_NULLS, __PUT_EXT_PROPERTIES veya __PUT_EXT_ATOMIC'ı ihtiyaç halinde herhangi bir kombinasyonla IWbemContext nesnesine başka bir çağrıyla IWbemContext::SetValueekleyin.
Aşağıdaki tabloda adlandırılmış değerlerin anlamı listelenmiştir.
iFlags parametresini WBEM_FLAG_UPDATE_ONLYolarak ayarlayın. Bu bayrak olmadan çağrı geçersiz bir bağlamla başarısız olur.
IWbemContext bağlam nesnesini IWbemServices::PutInstance veya IWbemServices::PutInstanceAsync çağrılarının pCtx parametresine geçirin.
IWbemContext nesnesinin geçirilmesi, sağlayıcıya kısmi instans güncellemelerine izin verme talimatı verir. Tam örnek güncelleştirmesinde, pCtx'i NULLolarak ayarlayabilirsiniz.
Çağrıda bulunan bağlam nesnesi "__PUT_EXTENSIONS" içermiyorsa sağlayıcı gerekli özellikleri yazabilir. Bağlam nesnesinde "__PUT_EXTENSIONS" varsa, WMI sağlayıcıdan ya işlemin semantiğine tam olarak uymasını ya da başka bir seçenek olarak çağrının başarısız olmasını ister. Daha fazla bilgi için bkz. Sağlayıcıda Erişim Reddedilen İletileri İşleme.