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  -list

   NameSpace: ROOT\CIMV2

Name                                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  localhost

   NameSpace: ROOT\CIMV2

Name                                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.eventlog

  Max(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 application

  Max(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 application

  Max(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> $var

  Max(K) Retain OverflowAction        Entries Log
  ------ ------ --------------        ------- ---
  20,480      0 OverwriteAsNeeded       5,900 application                              

____________________________________________________________________________________

  任何有效的PS命令的输出均可以存在变量中,变量名以$开头,若要引用变量,用$接变量名即可。如上我们建立了$var变量,我们可以利用它获取相关的系统事件日志信息。

Exp:

PS C:\Users\vol_20120330> $var |get-member

   TypeName: System.Diagnostics.EventLog

Name                      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.clear

MemberType          : 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> $wshshell

SpecialFolders                              CurrentDirectory
--------------                              ----------------
System.__ComObject                          C:\Users\vol_20120330                      

2、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=$home

      4、存储对象,在进行设定后需要保存lnk对象

Exp:

PS C:\Users\vol_20120330> $mylnk.save()

下面我们来查看是否成功创建了对象:

PS C:\Users\vol_20120330> ls

    目录: C:\Users\vol_20120330

Mode                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.application

  2、然后需要调用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组件是一个复杂的体系,需要慢慢的体会才能做到应用自如;接下来我们将继续探讨这方面的内容。

时间: 2024-11-05 16:48:43

PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件的相关文章

PowerShell_零基础自学课程_5_自定义PowerShell环境及Powershell中的基本概念

PowerShell_零基础自学课程_5_自定义PowerShell环境及Powershell中的基本概念 据我个人所知,windows下的cmd shell除了能够通过修改系统参数来对其中的环境变量进行改变外,其环境的可自定义性相对来说很困难,而在Linux环境中,可以通过修改/etc目录下的某些配置文件来达到配置shell环境的目的.也许这也是某些人诟病cmd shell功能不强的原因之一. 而目前这种状况在windows powershell中得到了改善,可以说PS中提供的自定义环境的功能

PowerShell_零基础自学课程_6_PS中获取帮助信息详解、管道、格式化输

前些文章陆续的说了一些关于这些主题,但是讨论的都不够深入,今天我们深入的了解一下获取帮助信息.管道以及格式化输出的内容. 一.获取帮助信息 在PS中获取帮助信息,最常用的有: -? .get-command和get-help.这三者获取的信息不是完全一致的,并且由于get-command和get-help是cmdlet:因此具有很多实用 的参数来帮助我们获取我们想要的信息. 1.1  -? 参数 如果我们知道某个cmdlet的拼写,但是不知道他的用户,那么最快速的方法就是用:-? 参数. 例如:

PowerShell_零基础自学课程_1_初识PowerShell

欢迎转载本系列文章:转载请注明出处:www.cnblogs.com/volcanol 自从微软推出.Net以来,微软旗下的windows体系就发生了很大的变化,首先是操作系统的界面的变化,例如vista与XP的界面变化, 其次是一些应用的变化,例如在XP下就没有Aero桌面效果,而在Win7下就有Aero桌面效果(本人没有用过vista,不知道有没有Aero的效果). 但这些都是用户直观的感受,除了这些还有更深层次的变化,如C++的CLR和CLI.以及一些时下非常流行的技术(像WPF.WCF还有

PowerShell_零基础自学课程_3_如何利用Powershell ISE调试PS脚本

微软在推出PS的同时,没有忘记其一贯的作风,什么东东都弄一个IDE环境,这不微软没有忘记给PS也来一个IDE的环境, 通过这个IDE环境,可以建立psl文件,可以调试psl文件. 1.IDE界面 我们看一下IDE环境的界面: 如图所示: IDE环境被分成了三个窗格,这个窗格的布局可以自定义.其中左上角的窗格是输出窗格,在IDE中执行的结果 通过它输出:左下角的窗口是交互窗格,也叫做命令窗格,可以在里面输入要执行的命令,同时这个窗格还会提示当前的工作路径, 上图的工作路径是:C:\users\vo

PowerShell_零基础自学课程_2_Powershell与Cmd以及Unix/Linux Shell

上篇文章我说道,windows为了改变用户对其console界面的诟病,于是就从windows   vista开始,计划要改变这种局面,于是就有 了Powershell的出现. 1.兼容shell命令 为了兼容Unix/Linux Shell(主要是bash)的命令:Powershell中提供了一套机制来兼容cmd.exe和bash命令.这就是上篇文章中提到 的别名机制.下图是powershell中兼容的cmd命令和unix/linux shell的命令. 2.标准命令的别名 同样,powers

零基础自学前端 D3.js 初体验03 柱状图+排序

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>d3</title> </head> <script src="https://d3js.org/d3.v4.min.js"></script> <body> <button type="button"

python零基础自学——前篇自白

首先声明,本人就是个菜鸟,小白一个,在这里记录我自学python时的点点滴滴,用于我的经验积累以及复习.当然,若有零基础自学的人看见,交流学习经验那就最好不过了. python其实对零基础的小白来说就再适合不过了,为什么这么说,个人对编程的理解就是高.大.上.总感觉都是些BT才可以玩这个的. 我自己创业,开公司有过好的时候,但最后都倒闭了,积累如此阅历,却回首发现,自己没有一项术语自己的专业既能.所以就想学习编程.跟专业朋友交流以后,都推荐我学习python.原因有以下几点: 一:简单. 因为是

讨教大学:零基础自学编程,选JAVA,Python还是PHP?

越来越多非科班出身的人也义无反顾的投身到了IT互联网行业,加入了码农大军.但是对于非科班自学编程的朋友们来说,考虑的第一个问题一定是:我该从哪一个语言开始学起?在这里小编就为大家介绍一下零基础自学几大主流语言的优劣势. 首先从这几大语言的难度谈起,不同语言门槛和难度不同,Python<PHP<JavaScript<Java<C++.也就是说,Python是最好入门的一种语言,兼具易学性和趣味性,学几天就可以做出一些有意思的小功能出来.这也给了初学者学下去的信心和兴趣,不至于啃书几天

小猿圈web前端开发讲师:零基础自学html5开发方法

web前端开发目前市场使用率随着需求逐年递增.越来越多的年轻人转行进入了web前端开发领取.html5强大的功能是有目共睹的,本属自身独特的优势让这一技术越来越受欢迎,相比于原生APP,html5已经逐渐在用户体验生无限接近,再加上低廉的开发成本和强大的适配功能,早已经可以俘获开发商和开发者的芳心,本文小猿圈web前端开发讲师介绍零基础如何自学html5开发? 小猿圈web前端开发讲师:零基础自学html5开发方法: 1.拒绝插件,遇到交互效果就选择扒插件,这是一种非常不可取的方法,在这种情况之