第14章 Windows管理规范

  我们一直期望但是又害怕写这一章。Windows管理规范(Windows Management Instrumentation,WMI)可能是微软提供给管理员使用最优秀的工具之一。但同时它也是这个公司曾经给我们造成最多问题的部分。WMI可以从计算机中收集大量系统信息。但有时候这些信息不易看懂,另外文档也不够友好。在本章,我们将从PowerShell的角度介绍WMI,以及WMI的工作方式和一些不完美的地方,以便全面揭示你将会遇到的问题。

  需要强调的是,WMI是一个外部技术;PowerShell仅仅与其接口交互而已。本章的重点将放在PowerShell如何与WMI交互,而不是WMI的底层实现机制。

14.1 WMI概要

  典型的Windows计算机包含数万个管理信息,WMI会将这些信息整理成易于访问的形式。

  在最顶层,WMI被组织成命名空间(namespace)。可以把命名空间想象为关联到特定产品或技术的一个文件夹。比如,“root\CIMv2”,该命名空间包含了所有Windows操作系统和计算机硬件信息。而“root\MicrosoftDNS”命名空间包含了所有关于DNS服务器的信息。在客户端计算机上,“root\SecurityCenter”包含了关于防火墙、杀毒软件和反流氓软件等工具的信息。

  在命名空间中,WMI被分成一系列的类,每个类都是可用于WMI查询的管理单元。比如,在“root\SecurityCenter”中的“Antivirus-Product”类被设计用于保存反间谍软件的信息;在“root\CIMv2”中的“Win32_LogicalDisk”类被设计用于保存逻辑磁盘的信息。但是即使一个计算机上存在某个类,也不代表计算机上实际安装了对应组件。比如无论是否安装了磁带驱动程序。“Win32_TapeDrive”类在所有的Windows版本上都存在。

  当你有一个或多个可管理组件时,你可以看到在对应的类中有相同数量的实例(instances)。一个实例由类代表了一个现实世界的事件。如果你的计算机只有一个单一的BIOS,那么在“root\CIMv2”中会有一个关于“Win32_BIOS”的实例。如果计算机安装了100个后台服务,你会看到100个“Win32_Service”的实例。请注意,在“root\CIMv2”中的类型一般以“Win32_”可“CIM_”开头。

14.3 探索WMI

  最佳的WMI入门恐怕是暂时抛开PowerShell并从WMI自身出发。这里我们使用WMI探索工具。不幸的是,这些工具就像季节更替那样经常更换,所以我们犹豫是否该告诉你某个特定工具。你可以尝试在搜索引擎中搜索WMI explorer并查看结果。你也可以尝试访问 http://powershell.org/wp/2013/03/08/wmi-explorer/。我们可以从这类工具中得到大部分所需的关于WMI的信息。当然,这个工作要求耐心和不少的浏览量——这并不是最佳方法,但是我们最终还是选择了这个工具。

  由于每台计算机上的WMI命名空间和类都不尽相同,所以你需要把工具直接在准备查询的机器上运行,以便看到对应机器的WMI仓库。

  另一个途径是使用PowerShell本身。比如,我们想知道一些关于磁盘的信息。可以尝试下面的命令。

Get-WmiObject -Namespace root\CIMv2 -list | where name -like '*dis*'

14.4 选择你的武器:WMI或CIM

  在PowerShell v3及后续版本中,有两种与WMI交互的方式。

  • 所谓的“WMI Cmdlets”,例如“Get-WmiObject”与“Invoke-WmiMethod”——这些都是遗留命令,意味着它们依旧能工作,但是微软不会对他们进行后续开发投入。它们与远程过程调用(RPC)交互,也就是说,只有在防火墙支持状态审查时才能通过防火墙(实际上很难)。
  • 新版的“CIM Cmdlets”,例如“Get-CimInstance”与“Invoke-CimMethod”——它们或多或少等价于旧版本的“WMI Cmdlets”,但是它们通过WS-MAN交互,替代原有的RPCs。这是微软的主方向,执行“Get-Command -noun CIM*”可以显示很多微软提供的这类命令的功能。

      毫无疑问,这些命令的后端同样是WMI,其差异在于如何交互和如何被使用。

14.5 使用Get-WmiObject

  通过“Get-WmiObject”命令,你可以指定一个命名空间、一个类名称甚至远程计算机的名称以及备用凭据名。如果需要,还可以从指定的计算机中查询该类的所有实例。

  如果要减少类实例的返回结果,甚至可以提供筛选条件实现,可以使用下面的语法获取一个命名空间中的类列表。

Get-WmiObject -namespace root\cimv2 -list

  注意,命名空间名字使用的是反斜杠,不是斜杠。

  也可以通过指定命名空间和类型查询一个类。

Get-WmiObject -namespace root\cimv2 -class win32_desktop

  其中“root\CIMv2”是Windows XP SP2及后续版本的系统默认命名空间,所以如果你的类在该命名空间中,可以不显式指定。同时,“-Class”是位置参数,也就是说,如果你把类名称放到第一个位置,它依旧能正常工作。

  这里有两个例子,其中一个使用Gwmi别名代替完整的Cmdlet名称。

PS C:\>Get-WmiObject win32_desktop
PS C:\>gwmi antispywareproduct -namespace root\securitycenter2

  对于许多WMI类,PowerShell的默认配置已经设定了需要展示的属性。“Win32_OperatingSystem”是一个很好的例子,因为它默认仅在列表中展示了6个属性。请记住,你总能把WMI对象用管道传输到“Gm”或“Format-List”中,以便查看所有可用的属性。“Gm”问题列出所有可用的方法。下面是一个示例。

PS C:\>Get-WmiObject win32_operatingsystem | gm

  另外,“filter"参数允许你通过指定的规则查询特定实例。该参数使用越来有点棘手。下面的示例可以看出其最坏情况下的结果。

PS C:\>gwmi -class win32_desktop -filter "name='COMPANY\\ADMINISTRATOR'"

  对于该命令的输出结果,需要注意下面事项。

  • 筛选条件通常被双引号包住。
  • 筛选比较操作符并不使用PowerShell的常规操作符“-eq”或“-like”,而使用更加传统、更加编程化的操作符,比如=、>、<、<=、>=和<>。可以使用关键字“LIKE”作为操作符,但在匹配值时必须使用“%”作为字符通配符,如“NAME LIKE '%ADMINISTRATOR%'”。注意,这里不能像PowerShell的其他地方一样使用*作为通配符。
  • 字符串匹配是以单引号包住,这也是筛选表达式的最外层的引号是双引号的原因。
  • 避免在WMI中使用反斜杠。当你需要使用文本的反斜杠时,你必须使用两个反斜杠替代。
  • Gwmi的输出结果总会包含大量的系统属性。PowerShell的默认显示配置通常会隐藏这些属性,如果你故意列出的这些值或类没有默认配置,那么这些值会被显示出来。系统属性名称以双下划线开始。这里有两个非常有用的属性。
    • __ SERVER:包含被查询实例所在的计算机名称。当所查询的WMI信息来自多台计算机时非常有用,该属性与易于记忆的“PSComputerName”属性功能一致。
    • __PATH:是实例本身的绝对引用。如果需要的话,可以用来查询实例。

  该Cmdlet不仅可以从远程计算机中查询信息,也可以从多台计算机中检索,可以使用任何可以生成一个包含计算机名称或IP列表的技术。

PS C:\>Gwmi Win32_BIOS -Comp server-r2,server3,dc4

  一旦你查询到一个WMI实例的集合后,就可以把它们用管道连接到任何以“-Object”cmdlet、“Format-”Cmdlet或“Out-”“Export-”“ConverTo-”开头的Cmdlet中。你可以使用自定义表格显示“Win32_BIOS”类的信息。

PS C:\>Gwmi Win32_BIOS | Format-table serialNumber,Version auto

  在第10章中,我们已经介绍了如何使用“Format-Table”Cmdlet生成定制列。当你想从一台给定计算机中查询一些WMI类并集成到一个表时,该技术在这里就可以派上用场。此时你可以创建一个关于表的自定义列,并用列的表达式执行一个全新的WMI查询。语法如下,虽然看上去有点头大,但是结果却能让人满意。

PS C:\>gwmi -class win32_bios -computer server2,localhost |
format-table @{label='ComputerName';expression={$_.__SERVER}},
@{label='BIOSSerial';expression={$_.SerialNumber}},
@{label='OSBuild';expression={gwmi -class win32_operatingsystem -computer $_.__SERVER | select-object -expand BuildNumber}} -autosize

14.6 使用Get-CimInstance

  Get-CimInstance是PowerShell v3引入的新命令,与“Get-WimObject”有很多相似的地方,但是也有几个语法上的差异。

  • 你需要使用“-ClassName代替“-Class”(虽然你只需要输入-Class,但是如果你记住了该参数名称的话,这没有问题)。
  • 没有用于列出命名空间中的所有类的“-List”参数。而是使用“Get-Ciminstance”并搭配“-namespace"参数获取列表。
  • 没有“-Credential”参数;如果你需要从远程计算机查询并被要求提供替代凭据,需要通过“Invoke-Command”发送“Get-Ciminstance”。

  比如:

PS C:\>Get-Ciminstance -ClassName Win32_LogicalDisk

  如果你需要使用替代凭据查询远程计算机,可以使用类似下面的命令。

PS C:\>invoke-command -scriptBlock {Get-CimInstance -ClassName win32_process } -ComputerName win8 -Credential DOMAIN\Administrator

第14章 Windows管理规范的更多相关文章

  1. C#高级编程9 第14章 内存管理和指针

    C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...

  2. 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理

    [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...

  3. Windows核心编程:第14章 探索虚拟内存

    Github https://github.com/gongluck/Windows-Core-Program.git //第14章 探索虚拟内存.cpp: 定义应用程序的入口点. // #inclu ...

  4. Java核心技术卷一基础知识-第14章-多线程-读书笔记

    第 14 章 多线程 本章内容: * 什么是线程 * 中断线程 * 线程状态 * 线程属性 * 同步 * 阻塞队列 * 线程安全的集合 * Collable与Future * 执行器 * 同步器 * ...

  5. Linux就这个范儿 第14章 身在江湖

    Linux就这个范儿 第14章 身在江湖 “有人的地方就有江湖”,如今的计算机世界就像一个“江湖”.且不说冠希哥有多么无奈,把微博当QQ的局长有多么失败,就说如此平凡的你我什么时候就成了任人摆布的羔羊 ...

  6. JavaScript高级程序设计(第三版)学习笔记13、14章

    第13章,事件 事件冒泡 IE的事件叫做事件冒泡:由具体到不具体 <!DOCTYPE html> <html> <head>      <title>E ...

  7. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  8. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  9. 第一章 Windows内核概述

    第一章 Windows内核概述 这一章节描述了Windows内核知识中最重要的几个概念,这些话题在这本书之后会有更详细的描述,那些会与当前的主题密切相关.要确保你理解这个章节的概念,因为这些概念构成了 ...

  10. Python for Infomatics 第14章 数据库和SQL应用一(译)

    14.1 什么是数据库 数据库一种存储结构数据的文件.绝大多数数据库类似字典——映射键和值的关系.最大的区别是数据库是保存在硬盘或其它永久性的存储上,所以在程序结束后它仍然存在.而保存在内存中的字典容 ...

随机推荐

  1. TCP协议之四次挥手

    参考文章 这里 四次挥手过程 四次挥手的过程是全双工的,因此每个方向都必须要进行单独的关闭,这样原则是当一方完成数据发送后发送一个FIN信号给对方,对方收到FIN后就知道这个方向不会再有数据发送过来了 ...

  2. Python语言基础实验(第四周)

    Python语言基础实验(第四周) 一.实验目的 1.了解并掌握python中序列及序列的常用操作. 2.根据实际需要运用合适的序列类型来完成实验. 二.实验环境 软件版本:Python 3.10 6 ...

  3. React父组件如何调用子组件方法,访问子组件State

    /** * * Author: shujun * Date: 2020-10-25 */ import React from 'react'; import {message} from 'antd' ...

  4. windwos11没有Hyper-V的解决方法

    我的系统是windows11家庭版,程序添加这就没有hyper-v,但是可以手动添加,把下面这个脚本修改后缀.cmd即可(如:hyper-v.cmd),不会的可以直接下载我这个文件. Hyper-v执 ...

  5. datax clickhousewriter插件下载 elasticsearchwriter插件下载

    有用点手推荐!!! clickhousewriter: 链接:https://pan.baidu.com/s/1_dx7Y1P31yScNQvz0UH2WA 提取码:cwvv elasticsearc ...

  6. list集合之流操作

    1.根据某一个实体字段进行去重(分组)操作 List<Object> list = objectList.stream().collect(Collectors.collectingAnd ...

  7. (app笔记)Appium如何开启、配置、启用

    1.安装adb 2.打开手机调试 3.连接手机 4.appium运行前,手机需要io.appium.uiautomator2.server 和 Appium Settings. 5.appium操作: ...

  8. 解决Idea 中Java编译器的版本自动变成1.5的问题

    可在pom文件中加入以下配置: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins ...

  9. pychars的使用

    1|0安装 pyecharts 兼容 Python2 和 Python3.目前版本为 0.1.2 pip install pyecharts 2|0入门 首先开始来绘制你的第一个图表 from pye ...

  10. 错误 : 资产文件&ldquo;\obj\project.assets.json&rdquo;没有&ldquo;.NETCoreApp,Version=v2.0&rdquo;的目标。确保已运行还原,且&ldquo;netcoreapp2.0&rdquo;已包含在项目的 TargetFrameworks 中。

    原因是项目升级了目标框架netcoreapp2.1但是发布配置文件上的目标框架配置项没有更改导致发布错误 将此处修改成需要的版本即可.例如:<TargetFramework>netcore ...