PowerShell5.X与WMI的集成 专题系列分享 | 第二部分 WMI架构

2021年3月9日 168点热度 0人点赞 0条评论

本文作者:贝多芬不忧伤(Ms08067内网安全小组成员)

贝多芬不忧伤微信(欢迎骚扰交流):

图片


众所周知,在windows10以及Windows Server2016的平台当中,PowerShell5.x已经能够去获取到系 统当中大部分的信息,但有时候仍有一些信息需要借助于调用WMI的类来完成。通过本文,你可以 了解到WMI的基本架构和组件,包括WMI的数据库,WMI的provider,以及在PowerShell调用WMI的 时候提供的module和相关的命令。接下来我们就能通过powershell的命令去完成WMI的查询操作, 去获取到系统当中WMI的实例。然后我们还可通过实例的属性查看到系统当中不同的信息,同时的 话去调用实例当中为我们提供的不同的方法,去修改系统信息的配置。


2. WMI架构


通过前面的介绍,我们就能够了解到,通过powershell的方式调用WMI的类我们就能够去获取到系统和应用程序的配置信息,那么接下来的问题就在于powershell为什么能够去调用到WMI的类,另外WMI的类又是如何进行组织的。那要去回答这些问题的话,在这一节当中就将为大家去介绍WMI的基本架构和相应的组件,通过这一节的介绍,我们就能够去了解到,在WMI的整个体系当中它包括了哪一些最基本的组件,这些组件又是如何进行组织的,最终能够去确保powershell能够调用到WMI的类,获取到系统当中不同的组件以及配置的信息,接下来就可以在演示的环境当中,通过powershell的方式去查看到WMI当中为我们提供的这些不同的组件。

2.1 WMI Architechture


在WMI的整个体系当中,第一个最基本的组件其实就是 CIM Database ,在这个 CIM Database中就存储了系统当中所有相关组件的类。那么这些类是怎么来的呢?其实在WMI的架构当中,还会有第二个组件,这个组件就叫做 WMI Provider ,在WMI的Provider当中实际上就包括了系统当中不同组件的provider,那么其实也就意味着,微软各个不同产品组的开发人员在去开发自己的产品的时候其实也会依据WMI provider的基本规则开发响应的WMI的Provider,在这个Provider当中就包括了这些相应的类,而这些类就存储到了CIM Database当中,其实也就意味着CIM Database当中囊括了系统的各个方面的不同的这些类,正是有了这样的一些类,才使我们通过powershell调用WMI的方式去获取系统当中以及应用程序当中的数据和信息变成了可能。其实powershell的话是不能直接去读取WMI的数据库的,在WMI的体系架构当中,它还包括一个 CIM Object Manager (CIM对象管理器),这个管理器就提供了一个统一访问的接口,那么powershell或者是其他的应用程序要去访问到CIM的database当中不同的这些类的时候,就是需要通过CIM Object Manager的这种方式来去完成这个过程(其实当第三方程序应用开发商要去开发自己的WMI Provider的时候,也需要向CIMObject Manager进行注册)。那么有了这样一些基本组件之后,powershell要去访问WMI当中类的时候,实际上有两种不同的协议,一种是 DCOM 协议,另外一种是 WinRM 的协议。这两种协议都在 .NET 平台当中做了实现,.NET平台都提供了统一的访问接口即 Windows Management API 。通过Windows Management API的话,powershell就可以使用相应的这些命令访问到WMI当中的类,最终去获取到系统当中不同信息。那么了解完了WMI的基本架构之后,接下来我们就能够实际的查看下对于CIM Database当中所存储的所有的相应的数据(也就是所有的类)它们之间的基本的特点以及CIM类当中包括的基本信息。

  • Managed entity database
  • A provider can be a driver or something richer, and these providers provide a standard way for the CIMOM to talk to individual managed entities.
  • CIM Object Manager, the CIMOM, is the core of WMI.

图片

2.2 CIM Database

前面已经使用过一些CIM的类,比如像我们去获取系统信息的时候,可以使用Win32_OperatingSystem ,如果我们想要去获取虚拟的BIOS GUID的话,可以使用Msvm_VirtualSystemSettingData 。那这样的一些类的话,我们已经知道是由WMI的Provider定义的,定义好了之后是存储在CIM的Database当中,powershell要去获取系统信息的时候,都是通过调用这些类去访问的。而这些类是如何被访问到的呢?实际上,所有的这些类在数据库当中存储的时候都是依据命名空间进行存储的,如: root\cimv2 , root\virtualization\v2 。所以要通过powershell的方式去访问到不同的这些类,最终获取系统当中信息的时候,我们是需要去指定namespace的。这个namespace决定了所有的这些类是在数据库当中是如何存储的,同时决定了powershell要去访问这些类的时候的访问方式。那么有了namespace和class之后,通过powershell去获取到信息后,这些信息的结果被称作 Instance (实例),比如我们使用Win32_OperatingSystem,那么我们就能够去获取一个操作系统的实例,比如我们想去获取磁盘的信息,就需要用到 Win32_LogicalDisk ,在系统当中可能会有多个盘,也就意味着会有多个实例返回。这些实例,比如 OperatingSystem 就包括了操作系统的名称。那么这样的信息是怎么来的呢?是因为在我们的类当中其实是定义了一些属性,这些属性的值就是我们能获取到的系统当中或者是应用程序当中相应的配置。对于 Win32_OperatingSystem 这个类来说,当我们通过powershell去获取到了信息之后,就返回了一个实例,这个实例中就包含了一个属性叫做Caption ,通过这个属性我们就能够去了解当前计算机安装的操作系统的名称,同时它还包含了一个属性叫做 SystemDirectory ,通过这个属性我们就能够了解到当前计算机操作系统的系统目录的位置在哪里。其实除了这些个属性之外,实例当中还包括了一些方法 Method ,那么这些方法就能让我们去修改相应的配置和属性,同样的对于 Win32_OperatingSystem 这个类来说,当我们通过这个类去获得到了实例之后,它还包含了 Reboot 、 Shutdown 这样的方法供我们调用。

  • Class - the difinition of object

    • Win32_OperatingSystem

    • Msvm_VirtualSystemSettingData

  • Namespace - How WMI Class store and access

    • root\cimv2

    • root\virtualization\v2

  • Instance - How WMI Class store and access

    • Get-WmiObject Win32_LogicalDisk

    • One instance for each object

  • Property - an attribute of instance

    • Win32_OperatingSystem

    • Caption

    • SystemDirectory

  • Method - Instance can do

    • Win32_OperatingSystem

    • Reboot

    • Shutdown

2.3 牛刀小试

2.3.1 WMI Provider

查看WMI的Provider

PS D:\> Get-WmiObject -Namespace root\CIMV2\Security -class __namespace | selectobject Name
Name----MicrosoftTpmMicrosoftVolumeEncryption
2.3.2 WMI Class
查看WMI的class
PS D:\> Get-CimClass -Namespace root\CIMV2\Security\MicrosoftTPM

图片


未完待续 ....

PowerShell5.X与WMI的集成 专题系列分享 第一部分

扫描二维码,加入内网小组,共同成长!

图片






扫描下方二维码学习更多安全知识!

图片 图片

 图片 图片

目前30000+人已关注加入我们

图片

83790PowerShell5.X与WMI的集成 专题系列分享 | 第二部分 WMI架构

这个人很懒,什么都没留下

文章评论