PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件
本系列文章從最初的初識開始,基本上可以完成一些簡單的系統管理了,為了更方便的管理系統,同時為了更好的發掘系統的性能,就需要用到系統提供
的一些高級特性,在Windows Server系列的OS中,如果可以利用最新的特性對系統進行管理,將會是一件非常不錯的事情,雖然目前WinServer用的比較少
但是在一些地方還是有用到,尤其當某些場合需要非計算機專業的人員在服務器上進行操作的時候,winServer以其比Unix/Linux簡單性更加適合應用。今天
這里就對PS中一些高級特性進行介紹。
一、Wmi對象
我們知道在windows 系列的操作系統下,WMI一直是管理系統的利器,也是Win下系統管理的核心技術。利用Wmi可以實現很多功能,在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 {} {}.............
我們需要關注一下這個輸出的頭部:NameSpace: ROOT\CIMV2 ; 這個輸出表示當前獲取的WMI類型從屬于root\cimv2 命名空間(有的人喜歡譯為名字空間,不過我個人
認為翻譯成命名空間比名字空間好聽一些,嘻嘻嘻.......); ?namespace可以作為get-wmiobject命令的參數使用。
上面的命令相當于: ?get-wmiobject ? -list ?-namespace ? root\cimv2
get-wmiobject有很多的參數,其中一個就是:computername參數,指定計算機名或者IP地址,可以從遠程計算機上獲取相關的信息。其命令是:
get-wmiobject ?-list ?-computername ? 192.168.0.1 ?
通過這個命令獲取遠程計算機的信息時,遠程計算機必須運行WMI, 并且使用的賬戶必須是遠程計算機上管理員組的成員;利用這種方式獲取遠程計算機信息的時候,遠程
計算機不需要運行PS,因此可以利用PS管理沒有安裝PS的遠程計算機。
利用computername參數還可以獲取本機的信息和資源。
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 ?顯示WMI類的詳細信息
如果知道了某個WMI的名稱,那么如何顯示這個類的相關系信息呢? ?我們可以使用-class參數來顯示某個WMI類的相關信息。
Exp: ?用-class參數顯示 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均有自己默認的屬性,當沒有指定參數或者屬性時,cmdlet將以默認的屬性或者參數進行操作,get-wmiobject也有幾個默認的參數: -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參數時,可以使用通配符進行輸出。
?
二、 創建WMI對象
既然WMI模型中有那么多的類,那么根據面向對象的思想,我們就可以利用這些類實例化一些對象。在PS中利用New-Object命令實例化對象。
2、1 創建WMI對象
在Windows下某些軟件組件具有Net Framework和Com接口,因此可以執行許多的系統的管理任務;PS可以使用這些組件。早起版本的Ps多數的cmdlet不支持遠程計算機。
但在PS中利用Net Framework的system.diagnostics.eventlog類管理事件日志時可消除這個限制。
Exp:new-object命令創建system.diagnostics.eventlog對象
PS C:\Users\vol_20120330> new-object -typename system.diagnostics.eventlogMax(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- ---如上所示,我們創建了一個system.diagnostics.eventlog的對象,但是這個對象實例沒有包含任何的數據,這是因為沒有為其指定特定的事件日志。
2、2 構造函數
與面向對象一致,需要利用類的構造函數來初始化對象。在這里我們通過指定日志名稱引用特定的事件日志,并將日志名稱傳遞給類的構造函數。使用-argumentlist參數指定特定的事件日志
對象的日志名稱。
Exp: 利用argumentlist參數初始化對象
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中大多數的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如上所示,執行結果一樣。
2、3 ?利用變量來存儲對象
如上面創建對象后,我們為了進行其他操作必須每次都輸入這個創建命令,這樣太麻煩;在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變量,我們可以利用它獲取相關的系統事件日志信息。
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中如果調用某個方法,而不帶圓括號(),那么將會顯示這個方法的幫助信息。要調用某個方法必須帶圓括號。
Exp: 調用$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小結: 通過$variablename=new-object創建存儲對象的變量;變量存儲對象后,通過$variablename可以顯示對象信息;通過$variablename.method調用對象的方法;通過$variablename
.property引用對象的屬性。
2、4 ?創建com對象
使用new-object命令時可以利用-comobject參數來創建組件對象模型(COM)組件。WSH、ActiveX應用程序都可以應用COM組件。例如IE瀏覽器就可以應用COM組件模型;
在利用ComObject參數創建COM對象時需要制定附件信息來創建COM組件。 通常附件信息有兩種:?ProgID 和COM類的編程標識符。
在PS中可以指定以下幾個ProgID來創建COM組件: wscript.shell 、 wscript.network ?、script.dictionary 、 script.filesystemobject 。
Exp:我們創建一個 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組件創建快捷方式
步驟: ?1、 ?創建一個變量存儲wscript.shell對象
?2、調用createshortcut方法創建lnk對象, createshortcut方法需要傳遞一個存儲lnk文件的路徑和lnk文件袋名稱的字符串作為參數,如下所示:
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()下面我們來查看是否成功創建了對象:
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如上所示,紅色的部分表示我們已經成功創建了一個快捷方式。如果在當前路徑下輸入:.\my.lnk 則會打開我們的資源管理器,同時定位到$home目錄。
?
2、6 使用InternetExplore.application ProgID創建IE瀏覽器瀏覽博客園
1、首先需要創建一個IE的對象
Exp:
PS C:\Users\vol_20120330> $ie=new-object -comobject internetexplorer.application2、然后需要調用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內的文本內容
Exp:
如上圖所示,我們利用PS瀏覽了www.cnblogs.com。如果進一步進行處理,就可以獲取我們想要的內容了,比方說下載電子書什么的。
這樣在系統中就會啟動一個IE的進程,這個進程不會隨著PS的退出而自動停止,需要我們手動終止,或者知道關機的時候才會停止。
? ? ? 4、 將$IE變量變成無效。 ?利用?? $ie=$null
5、然后利用 remove-varibale ?ie 刪除變量$ie; 后面這兩條我們不做實驗了。
?
2.7 ?獲取PS中關于Net Framework的警告信息
因為PS中Net Framework的RCW包與標準的COM對象不完全一致,存在某些細微的差別,他們的行為不一樣,使用strict參數在創建COM對象時將產生相關的警告信息。
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?
三、小結
windows的WMI和COM組件是一個復雜的體系,需要慢慢的體會才能做到應用自如;接下來我們將繼續探討這方面的內容。
轉載于:https://www.cnblogs.com/micro-chen/p/5776258.html
總結
以上是生活随笔為你收集整理的PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 sitemesh/decorato
- 下一篇: 文字水印