PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件
本系列文章從最初的初識開始,基本上可以完成一些簡單的系統(tǒng)管理了,為了更方便的管理系統(tǒng),同時為了更好的發(fā)掘系統(tǒng)的性能,就需要用到系統(tǒng)提供
的一些高級特性,在Windows Server系列的OS中,如果可以利用最新的特性對系統(tǒng)進行管理,將會是一件非常不錯的事情,雖然目前WinServer用的比較少
但是在一些地方還是有用到,尤其當某些場合需要非計算機專業(yè)的人員在服務器上進行操作的時候,winServer以其比Unix/Linux簡單性更加適合應用。今天
這里就對PS中一些高級特性進行介紹。
一、Wmi對象
我們知道在windows 系列的操作系統(tǒng)下,WMI一直是管理系統(tǒng)的利器,也是Win下系統(tǒng)管理的核心技術(shù)。利用Wmi可以實現(xiàn)很多功能,在PS中,這一功
能不但沒有削弱,反而得到了加強。WMI提供一致的方式來公開各種類型的信息,下面我們慢慢的討論這個主題。
1、1 ?獲取WMI類
我們知道WMI可以提供強大的功能,但是我們在應用的時候,需要知道這個應用的接口,以及這個應用提供哪些對象可供操作,在WMI中存在幾百個類,而
某些類的屬性又有幾十個,因此WMI是一個繁雜的類庫和對象庫。
通過Get-WmiObject命令可以獲取WMI類型庫的概要信息。(下面的命令用......... 表示省略的輸出)
Exp:利用Get-WmiObject ?-list 命令獲取WMI信息
PS C:\Users\vol_20120330> get-wmiobject -listNameSpace: ROOT\CIMV2Name Methods Properties ---- ------- ---------- __SystemClass {} {} __thisNAMESPACE {} {SECURITY_DESCRIPTOR} __NAMESPACE {} {Name} __Provider {} {Name} __Win32Provider {} {ClientLoadableCLSID, CLSID... __ProviderRegistration {} {provider} __EventProviderRegistration {} {EventQueryList, provider} __ObjectProviderRegistration {} {InteractionType, provider,... __ClassProviderRegistration {} {CacheRefreshInterval, Inte... __InstanceProviderRegistration {} {InteractionType, provider,... __MethodProviderRegistration {} {provider} __PropertyProviderRegistration {} {provider, SupportsGet, Sup... __EventConsumerProviderRegistration {} {ConsumerClassNames, provider} __IndicationRelated {} {}.............
我們需要關(guān)注一下這個輸出的頭部:NameSpace: ROOT\CIMV2 ; 這個輸出表示當前獲取的WMI類型從屬于root\cimv2 命名空間(有的人喜歡譯為名字空間,不過我個人
認為翻譯成命名空間比名字空間好聽一些,嘻嘻嘻.......); ?namespace可以作為get-wmiobject命令的參數(shù)使用。
上面的命令相當于: ?get-wmiobject ? -list ?-namespace ? root\cimv2
get-wmiobject有很多的參數(shù),其中一個就是:computername參數(shù),指定計算機名或者IP地址,可以從遠程計算機上獲取相關(guān)的信息。其命令是:
get-wmiobject ?-list ?-computername ? 192.168.0.1 ?
通過這個命令獲取遠程計算機的信息時,遠程計算機必須運行WMI, 并且使用的賬戶必須是遠程計算機上管理員組的成員;利用這種方式獲取遠程計算機信息的時候,遠程
計算機不需要運行PS,因此可以利用PS管理沒有安裝PS的遠程計算機。
利用computername參數(shù)還可以獲取本機的信息和資源。
Exp:
PS C:\Users\vol_20120330> get-wmiobject -list -computername localhostNameSpace: ROOT\CIMV2Name Methods Properties ---- ------- ---------- __SystemClass {} {} __thisNAMESPACE {} {SECURITY_DESCRIPTOR} __NAMESPACE {} {Name} __Provider {} {Name}上面的localhost表示的就是本機。
因此可以有幾個命令可以獲取本機的信息: get-wmiobject ? -list
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??get-wmiobject ? -list ? -computername ? localhost
?get-wmiobject ? -list ? ???-computername ?本機計算機名稱
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??get-wmiobject ? -list ? ???-computername ?本機IP地址
?
1、2 ?顯示W(wǎng)MI類的詳細信息
如果知道了某個WMI的名稱,那么如何顯示這個類的相關(guān)系信息呢? ?我們可以使用-class參數(shù)來顯示某個WMI類的相關(guān)信息。
Exp: ?用-class參數(shù)顯示 win32_operatingsystem類的信息
PS C:\Users\vol_20120330> get-wmiobject -class win32_operatingsystem -namespace root\cimv2 SystemDirectory : C:\Windows\system32 Organization : BuildNumber : 7601 RegisteredUser : vol_20120330 SerialNumber : 00426-OEM-8992662-00015 Version : 6.1.7601在前面的講述過程中,我們說過cmdlet均有自己默認的屬性,當沒有指定參數(shù)或者屬性時,cmdlet將以默認的屬性或者參數(shù)進行操作,get-wmiobject也有幾個默認的參數(shù): -class;
默認的namespace是root\cimv2; 而computername默認的是本機(localhost)。
因此上面的命令: ?get-wmiobject -class win32_operatingsystem -namespace root\cimv2 ???
? ? ? 相當于: ?get-wmiobject ?win32_operatingsystem?
1、3 ?利用Format命令顯示非默認屬性
前面說過可以利用Format命令顯示對象的非默認顯示屬性或者信息,這里一樣可以顯示非默認的信息。例如利用Format-table命令顯示win32_operatingsystem的Total*和Free的
屬性。
Exp:
PS C:\Users\vol_20120330> get-wmiobject -class win32_operatingsystem -namespace root\cimv2 | format-table -property total*,free*TotalSwapSpa TotalVirtual TotalVisible FreePhysical FreeSpaceIn FreeVirtual Name ceSize MemorySize MemorySize Memory PagingFiles Memory ------------ ------------ ------------ ------------ ----------- ----------- ---- 4039784 2019892 496464 1496860 2006200 Microsof...____________________________________________________________________________________這里說明一點: 在Format命令中,使用-property參數(shù)時,可以使用通配符進行輸出。
?
二、 創(chuàng)建WMI對象
既然WMI模型中有那么多的類,那么根據(jù)面向?qū)ο蟮乃枷?#xff0c;我們就可以利用這些類實例化一些對象。在PS中利用New-Object命令實例化對象。
2、1 創(chuàng)建WMI對象
在Windows下某些軟件組件具有Net Framework和Com接口,因此可以執(zhí)行許多的系統(tǒng)的管理任務;PS可以使用這些組件。早起版本的Ps多數(shù)的cmdlet不支持遠程計算機。
但在PS中利用Net Framework的system.diagnostics.eventlog類管理事件日志時可消除這個限制。
Exp:new-object命令創(chuàng)建system.diagnostics.eventlog對象
PS C:\Users\vol_20120330> new-object -typename system.diagnostics.eventlogMax(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- ---如上所示,我們創(chuàng)建了一個system.diagnostics.eventlog的對象,但是這個對象實例沒有包含任何的數(shù)據(jù),這是因為沒有為其指定特定的事件日志。
2、2 構(gòu)造函數(shù)
與面向?qū)ο笠恢?#xff0c;需要利用類的構(gòu)造函數(shù)來初始化對象。在這里我們通過指定日志名稱引用特定的事件日志,并將日志名稱傳遞給類的構(gòu)造函數(shù)。使用-argumentlist參數(shù)指定特定的事件日志
對象的日志名稱。
Exp: 利用argumentlist參數(shù)初始化對象
PS C:\Users\vol_20120330> new-object -typename system.diagnostics.eventlog -argumentlist applicationMax(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 20,480 0 OverwriteAsNeeded 5,900 application由于在PS中大多數(shù)的Net Framework核心類在system明明空間中定義,因此如果PS找不到指定的類型名稱項,則會到system命名空間中查找類,這就是說我們可以不指定system
命名空間來引用system.diagnostics.eventlog,而是使用diagnostics.eventlog.
Exp:
PS C:\Users\vol_20120330> new-object -typename diagnostics.eventlog -argumentlist applicationMax(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 20,480 0 OverwriteAsNeeded 5,900 application如上所示,執(zhí)行結(jié)果一樣。
2、3 ?利用變量來存儲對象
如上面創(chuàng)建對象后,我們?yōu)榱诉M行其他操作必須每次都輸入這個創(chuàng)建命令,這樣太麻煩;在PS中可以用變量來存儲對象。
Exp:
____________________________________________________________________________________ PS C:\Users\vol_20120330> $var=new-object -typename diagnostics.eventlog -argumentlist application____________________________________________________________________________________ PS C:\Users\vol_20120330> $varMax(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 20,480 0 OverwriteAsNeeded 5,900 application ____________________________________________________________________________________? 任何有效的PS命令的輸出均可以存在變量中,變量名以$開頭,若要引用變量,用$接變量名即可。如上我們建立了$var變量,我們可以利用它獲取相關(guān)的系統(tǒng)事件日志信息。
Exp:
PS C:\Users\vol_20120330> $var |get-memberTypeName: System.Diagnostics.EventLogName MemberType Definition ---- ---------- ---------- Disposed Event System.EventHandler Disposed(System.Object, Sys... EntryWritten Event System.Diagnostics.EntryWrittenEventHandler Ent... BeginInit Method System.Void BeginInit() Clear Method System.Void Clear() Close Method System.Void Close() CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(typ... Dispose Method System.Void Dispose() EndInit Method System.Void EndInit() Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetLifetimeService Method System.Object GetLifetimeService() GetType Method type GetType() InitializeLifetimeService Method System.Object InitializeLifetimeService() ModifyOverflowPolicy Method System.Void ModifyOverflowPolicy(System.Diagnos... RegisterDisplayName Method System.Void RegisterDisplayName(string resource... ToString Method string ToString() WriteEntry Method System.Void WriteEntry(string message), System.... WriteEvent Method System.Void WriteEvent(System.Diagnostics.Event... Container Property System.ComponentModel.IContainer Container {get;} EnableRaisingEvents Property System.Boolean EnableRaisingEvents {get;set;} Entries Property System.Diagnostics.EventLogEntryCollection Entr... Log Property System.String Log {get;set;} LogDisplayName Property System.String LogDisplayName {get;} MachineName Property System.String MachineName {get;set;} MaximumKilobytes Property System.Int64 MaximumKilobytes {get;set;} MinimumRetentionDays Property System.Int32 MinimumRetentionDays {get;} OverflowAction Property System.Diagnostics.OverflowAction OverflowActio... Site Property System.ComponentModel.ISite Site {get;set;} Source Property System.String Source {get;set;} SynchronizingObject Property System.ComponentModel.ISynchronizeInvoke Synchr...____________________________________________________________________________________還可以利用變量來引用對象屬性和方法。
Exp:
PS C:\Users\vol_20120330> $var.MachineName .____________________________________________________________________________________ PS C:\Users\vol_20120330> $var.log application在PS中如果調(diào)用某個方法,而不帶圓括號(),那么將會顯示這個方法的幫助信息。要調(diào)用某個方法必須帶圓括號。
Exp: 調(diào)用$var的clear方法,但不帶()
PS C:\Users\vol_20120330> $var.clearMemberType : Method OverloadDefinitions : {System.Void Clear()} TypeNameOfValue : System.Management.Automation.PSMethod Value : System.Void Clear() Name : Clear IsInstance : True小結(jié): 通過$variablename=new-object創(chuàng)建存儲對象的變量;變量存儲對象后,通過$variablename可以顯示對象信息;通過$variablename.method調(diào)用對象的方法;通過$variablename
.property引用對象的屬性。
2、4 ?創(chuàng)建com對象
使用new-object命令時可以利用-comobject參數(shù)來創(chuàng)建組件對象模型(COM)組件。WSH、ActiveX應用程序都可以應用COM組件。例如IE瀏覽器就可以應用COM組件模型;
在利用ComObject參數(shù)創(chuàng)建COM對象時需要制定附件信息來創(chuàng)建COM組件。 通常附件信息有兩種:?ProgID 和COM類的編程標識符。
在PS中可以指定以下幾個ProgID來創(chuàng)建COM組件: wscript.shell 、 wscript.network ?、script.dictionary 、 script.filesystemobject 。
Exp:我們創(chuàng)建一個 wscript.shell的COM組件
PS C:\Users\vol_20120330> $wshshell=new-object -comobject wscript.shell____________________________________________________________________________________ PS C:\Users\vol_20120330> $wshshellSpecialFolders CurrentDirectory -------------- ---------------- System.__ComObject C:\Users\vol_201203302、5 利用wscript.shell COM組件創(chuàng)建快捷方式
步驟: ?1、 ?創(chuàng)建一個變量存儲wscript.shell對象
?2、調(diào)用createshortcut方法創(chuàng)建lnk對象, createshortcut方法需要傳遞一個存儲lnk文件的路徑和lnk文件袋名稱的字符串作為參數(shù),如下所示:
PS C:\Users\vol_20120330> $wshshell.createshortcut("$home\my.lnk")FullName : C:\Users\vol_20120330\my.lnk Arguments : Description : Hotkey : IconLocation : ,0 RelativePath : TargetPath : WindowStyle : 1 WorkingDirectory :3、利用lnk對象的targetpath屬性指定lin對象要連接的目錄或者文件;為了對lnk對象進行操作,需要用一個變量存儲它
Exp:保存變量
PS C:\Users\vol_20120330> $mylnk=$wshshell.createshortcut("$home\my.lnk")Exp:設定目標位置
PS C:\Users\vol_20120330> $mylnk.targetpath=$home4、存儲對象,在進行設定后需要保存lnk對象
Exp:
PS C:\Users\vol_20120330> $mylnk.save()下面我們來查看是否成功創(chuàng)建了對象:
PS C:\Users\vol_20120330> ls目錄: C:\Users\vol_20120330Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r-- 2012/3/30 18:27 Contacts d-r-- 2012/5/14 19:17 Desktop d-r-- 2012/5/12 17:18 Documents d-r-- 2012/5/14 1:49 Downloads d-r-- 2012/5/2 9:51 Favorites d-r-- 2012/3/30 18:27 Links d-r-- 2012/4/30 14:15 Music d-r-- 2012/3/30 18:27 Pictures d-r-- 2012/3/30 18:27 Saved Games d-r-- 2012/3/30 18:27 Searches d-r-- 2012/3/30 18:27 Videos d---- 2012/5/12 19:02 vol -a--- 2012/5/14 21:59 498 my.lnk -a--- 2012/5/12 17:25 10346 process.txt -a--- 2012/5/12 17:31 5254 process1.txt -a--- 2012/4/15 19:14 509 regwizard.log -a--- 2012/4/15 19:14 9853 sanct.log如上所示,紅色的部分表示我們已經(jīng)成功創(chuàng)建了一個快捷方式。如果在當前路徑下輸入:.\my.lnk 則會打開我們的資源管理器,同時定位到$home目錄。
?
2、6 使用InternetExplore.application ProgID創(chuàng)建IE瀏覽器瀏覽博客園
1、首先需要創(chuàng)建一個IE的對象
Exp:
PS C:\Users\vol_20120330> $ie=new-object -comobject internetexplorer.application2、然后需要調(diào)用IE對象的navigate方法設定ID對象要連接的URL。
Exp: 指定URL為www.cnblogs.com
PS C:\Users\vol_20120330> $ie.navigate("www.cnblogs.com")3、利用IE的document.body.innertext 獲取www.cnblogs.com內(nèi)的文本內(nèi)容
Exp:
如上圖所示,我們利用PS瀏覽了www.cnblogs.com。如果進一步進行處理,就可以獲取我們想要的內(nèi)容了,比方說下載電子書什么的。
這樣在系統(tǒng)中就會啟動一個IE的進程,這個進程不會隨著PS的退出而自動停止,需要我們手動終止,或者知道關(guān)機的時候才會停止。
? ? ? 4、 將$IE變量變成無效。 ?利用?? $ie=$null
5、然后利用 remove-varibale ?ie 刪除變量$ie; 后面這兩條我們不做實驗了。
?
2.7 ?獲取PS中關(guān)于Net Framework的警告信息
因為PS中Net Framework的RCW包與標準的COM對象不完全一致,存在某些細微的差別,他們的行為不一樣,使用strict參數(shù)在創(chuàng)建COM對象時將產(chǎn)生相關(guān)的警告信息。
Exp:
New-Object : 無法加載 COM 類型 excel.application。 所在位置 行:1 字符: 18 + $excel=new-object <<<< -comobject excel.application -strict+ CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException+ FullyQualifiedErrorId : CannotLoadComObjectType,Microsoft.PowerShell.Commands.NewO bjectCommand?
三、小結(jié)
windows的WMI和COM組件是一個復雜的體系,需要慢慢的體會才能做到應用自如;接下來我們將繼續(xù)探討這方面的內(nèi)容。
轉(zhuǎn)載于:https://www.cnblogs.com/micro-chen/p/5776258.html
總結(jié)
以上是生活随笔為你收集整理的PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 sitemesh/decorato
- 下一篇: 文字水印