WMI和軟體開發
通常軟體開發工作可以進行分類,這取決于它們将重點放在結構的哪個部件—應用程式、Schema或提供程式。
應用程式開發—通過收集和分析管理資料以及報告和反應事件通知來傳遞産品
WMI對象模型通信時,應用程式可以使用:
WMI COM API (C,C++)
WMI 腳步 API (VBScript,JSript)
Schema開發—包括将變更應用于WMI Schema,他可以通過如下技術完成:
MOF檔案
WMI COM API (C,C++)
WMI 腳本 API (VBScript,JSript)
提供程式開發—授予通路有關被管理環境特定部分的資訊。是WMI相關開發中最難的一部分切記。
通過探索WMI腳本對象模型開始,我們将發現它包含了很多對象及其他方法、屬性和事件。
wbem腳本類型庫wbemscripting存放在檔案wbemdisp.tlb。
WMI腳本對象模型
如何在WMI腳本類型庫中例示一個對象,同WScript用作WSH模型的入口點一樣,wbemscripting用于提供對各種WMI腳本API接口的通路。
可以通過COM對象的腳本API ProgID來建立wbemscripting
wbemscripting.swbemlocator用于取得swbemservices對象,代表本地或遠端計算機上名字空間的一個連接配接。
wbemscripting.swbemlasterror允許查詢和處理最後方法調用的錯誤.
wbemscripting.swbemobjectpath需要建立和校驗另一個對象路徑.
wbemscripting.swbemnamedvalueset主要用于通信一組提供程式的值.
wbemscripting.swbemsink用于接收異步操作和事件通知的結果.
WMI對象是通過将createobject方法應用于前面所列的ProgID來建立,例如:
Dim MyLocator
set mylocator = createobject("wbemscripting.swbemlocator")
通路WMI對象
為了讓你了解建立WMI名字空間初始連接配接的相對複雜過程,我将說明前面兩種方法之間的不同。
假定需要使用WMI scripting API來擷取遠端伺服器上有關spooler服務的資訊。
1使用swbemlocator通路WMI對象
方法一:使用swbemlocator通路WMI對象
dim objlocator
set objlocator = createobject("wbemscripting.swbemlocator")
dim objmyservices
set objmyservices = objlocator.connectserver
set objspooler = objmyservices.get("win32_service=""spooler""")
dim intstatus
intstatus = objspooler.startservice()
wscript.echo intstatus
此時我們運作腳本會發現給我的傳回值是:10
然後我們人為将windows服務print spooler的狀态由“自動運作”變成“停止”可以得到我們的值為0
最後我們禁止調print spooler服務,可以得到的傳回值:14
方法二:使用Monikers通路WMI對象(Monikers是一個标準的方法,用于将COM對象綁定在一起,它必須由3個部分組成1、winmgmts。2、假冒,驗證,權限,特權和語言訓示器。3、指向一個特定類或對象的WMI對象路徑。)
dim objspooler
set objspooler = getobject("winmgmts:{impersonationlevel=impersonate}!win32_service=""spooler""")
此時我們運作程式,發現得到相同的結果,是以我們可以知道使用Monikers通路WMI對象也是一樣的。
總結分析兩種方法,我們可以發現,第一種方法較傳統,當重複通路WMI對象時,它的性能較好
第二種方法使用monikers,它的形式相當的簡單,代碼實作隻用了兩行就可讀取屬性了,呵呵,但是monikers隻能用于建立SWbemObject和SWbemServices類型的對象和集合。
swbemservices和swbemobject類
swbemservices方法和屬性
swbemservices方法用于管理WMI名字空間中的類和對象。
swbemservices方法
每種方法有它的異步等價方法,差別是否可以在使用後立即傳回或它是否必須等待到它的結果可用。
異步方法的名稱與同步方法的名稱是相同的,唯一的差別在于Async字尾。
associatorsof(associatorsof)—将與對象有關的一組類或執行個體傳回到你指定的路徑
delete(deleteasync)—删除一個執行個體或類
execmethod(execmethodasync)—執行一個對象方法
execnotificationquery(execnotificationquerysync)—執行一個WQL查詢以接收事件
execquery(execquerysync)—執行一個WQL查詢以接收一組類或執行個體
get(getsync)—擷取你指定路徑的類或執行個體。省略可以建立一個空對象,可以使用它來建立新類
instancesof(instancesofsync)—傳回指定類的一組執行個體
referencesto(referencestosync)—傳回引用指定對象的一組類或執行個體
subclassof(subclassofsync)—傳回指定類的一組子類。
swbemservices屬性
swbemservices隻有一個單獨的屬性。security_用于讀取或改變安全設定
swbemobject方法和屬性
本質上,swbemobject可以代表任何WMI對象。可以把swbemobject想成一個類或執行個體的臨時容器。特别注意
swbemobject随着代表類或執行個體不同屬性和方法也會不同,呵呵
swbemobject方法(同樣存在異步版本)
associators_(associatorsasyn_)—擷取于指定對象有關的一組對象
clone_—建立目前對象的一份拷貝
compareto_—檢查兩個對象是否相同
delete_(deleteasyn_)—從WMI存儲庫中删除對象
execmethod_(execmethodasyn_)—執行對象實作的方法當方法不能使用直接通路執行時,就可以使用它
getobjecttext_—在MOF文法中擷取一個對象的全部說明
instance_(instanceasyn_)—擷取對象的一組執行個體
put_(putasyn_)—建立或更新WMI存儲庫中的對象
referencesto_(referencestoasyn_)—擷取引用指定對象的一組聯合類和它們的執行個體
spawderivedclass_從目前對象派生出一個新類,目前對象必須是一個WMI類定義
spawninstance_—從目前對象建立一個新的執行個體,目前對象必須是一個WMI類定義
subclass_(subclassasyn_)—傳回對象的一組子類,目前對象必須是一個WMI類定義
swbemobject屬性
derivation_—描述類的派生層次結構的一組字串,第一個元素顯示直接父結構,最後一個元素是層次結構頂部的類,隻讀
methods_—包含這個對象的一組方法的swbemmethodset對象,隻讀
path_—代表目前類或執行個體的對象路徑的SWbemobjectpath路徑。
properties_—這個對象的屬性組的swbempropertyset對象,隻讀
qualifiers_—這個對象的限定詞組的swbemqualifierset對象,隻讀
sercurity_—用于擷取和改變安全設定(驗證級别、假冒級别和特權)的swbesecurity對象
簡單修改前面的程式如下:
wscript.echo objspooler.properties_("startmode")
可以得到的結果為14,disable這樣兩個屬性,呵呵,我們知道了如何直接使用對象的屬性了吧。
此時我們必須知道,通過swbemobject對象的引用在腳本中開始,它們僅影響底層WMI對象的一個拷貝,而不會影響WMI對象本身。
執行個體:通過腳本改變“系統啟動延時”屬性
dim objsystem
set objsystem = getobject("winmgmts:{impersonationlevel=impersonate}!win32_computersystem=""bubble""")
wscript.echo objsystem.systemstartupdelay
objsystem.systemstartupdelay = 5
objsystem.put_
以上就是我們修改systemstartupdelay的腳本,呵呵。
WQL查詢的腳本編制
資料查詢
執行個體:列出自動啟動但未啟動的windows服務
option explicit
dim colwin32svcs
dim objsvc
set colwin32svcs = getobject("winmgmts:{impersonationlevel=impersonate}").execquery("select * from win32_services where started='false' and startmode='auto'")
for each objsvc in colwin32svcs
wscript.echo objsvc.descripton
next
下面一個例子和上面的例子一樣,實作同樣的功能
dim colwin32assocs
set colwin32assocs = getobject("winmgmts:{impersonationlevel=impersonate}").execquery("associators of {win32_service.name=""lanmanworkstation""}")
for each objsvc in colwin32assocs
wscript.echo objsvc.Description
結果如下顯示:
AT/AT COMPATIBLE
NetworkProvider
Alerter
Background Intelligent Transfer Service
Computer Browser
Messenger
Net Logon
Remote Procedure Call (RPC) Locator
本文轉自hcy's workbench部落格園部落格,原文連結:http://www.cnblogs.com/alterhu/archive/2012/04/11/2442942.html,如需轉載請自行聯系原作者。