[python] WMI
Radek Holý
radekholypublic na gmail.com
Čtvrtek Červen 14 23:33:19 CEST 2012
Dobrý den,
nemáte někdo zkušenosti s editací WMI z Pythonu? Mám kód::
import wmi
class_ = wmi.WMI(computer=".", impersonation_level="Impersonate",
privileges=("Backup", "Restore"), namespace="WMI", suffix="BcdStore")
_result, store_com = class_.OpenStore("")
store = wmi._wmi_object(store_com)
manager_com, _result =
store.OpenObject("{9dea862c-5cdd-4e70-acc1-f32b344d4795}")
manager = wmi._wmi_object(manager_com)
_result, = manager.SetIntegerElement(0x25000004, 5)
element_com, _result = manager.GetElement(0x25000004)
element = wmi._wmi_object(element_com)
print(element.Integer) # Beze zmeny :-/
Měl by zavoláním metody ``SetIntegerElement`` nastavit hodnotu 5. Ale
i když vzápětí zavolám ``GetElement``, tak zjistím, že se hodnota
nezměnila.
Přičemž obdobný kód ve VB funguje správně::
dim objBCD
dim objBCDStore
dim objWBM
dim objElement
set objBCD =
GetObject("winmgmts:{impersonationlevel=Impersonate,(Backup,Restore)}!root/wmi:BcdStore")
if Err.number <> 0 then
WScript.Quit(1)
end if
if not objBCD.OpenStore( "", objBcdStore ) then
WScript.Quit(1)
end if
set objBCD = nothing
if not objBcdStore.OpenObject(
"{9dea862c-5cdd-4e70-acc1-f32b344d4795}", objWBM ) then
WScript.Quit(1)
end if
if not objWBM.SetIntegerElement( &h25000004, 5) then
WScript.Quit(1)
end if
if not objWBM.GetElement( &h25000004, objElement ) then
WScript.Quit(1)
end if
WScript.Echo objElement.Integer
Tento strom WMI přibyl až ve Windows Vista. Oba skripty spouštím z
příkazové řádky se stejnými "rootovskými" oprávněními.
Metoda ``Put_`` se v tomto případě zavolat nedá, ani ji Microsoft v
žádných ukázkových skriptech nepoužívá.
Skript jsem přepsal i pomocí ``win32com`` knihovny (vypustil jsem
``wmi``, která stejně jen obaluje ``win32com``) a ani to nepomohlo.
Děkuju za pomoc
--
Radek Holý
Další informace o konferenci Python