office

位置:IT落伍者 >> office >> 浏览文章

WMI中的Windows PowerShell脚本使用方法


发布日期:2024年01月14日
 
WMI中的Windows PowerShell脚本使用方法
Windows Management Instrumentation(WMI)是能够改变你日常生活的工具之一虽然自年代初期它就已经存在但是由于WMI的复杂性其推广速度非常缓慢Windows PowerShell打破了这个障碍它让WMI的使用更容易这也改变了IT行业的面貌

在我们着重于钻研如何用PowerShell来简化WMI之前先让我们来看一看什么是WMI这是个最简单的术语你可以认为WMI是一个充满了查提供一致且可靠的各种格式数据的资料库

维基百科解释说WMI旨在规定一个独立环境标准的非专有设置它让管理应用程序之间能共享管理信息这是一个相当抽象的解释而WMI可能已经开始在做环境独立的尝试现在情况已经改变这些天开始思考下WMI会变成什么样子吧当你今天听说WMI时它通常是通过内置供应程序用于微软的WMI实施环境中这也是本文将要关注的点

WMI由三种基础元素组成

Provider 批准访问管理对象并提供有效的WMI API

Classes 对象有属性和方法的WMI陈述

Namespace 类的逻辑分组

那么PowerShell是如何做到让WMI的访问更加容易的呢?

首先让我们来了解一下PowerShell为WMI提供的工具总体来说有个PowerShell 命令集这让WMI的使用简单容易这里我将把它们都列出来但是我接下来只会着重讲其中一个(GetWMIObject)

GetWmiObject—— 基于命名空间和提供的类别返回对象

InvokeWmiMethod——调用WMI程序(通常用于执行静态程序)

RegisterWmiEvent——用于订阅WMI事件

RemoveWmiObject 删除一个现有的WMI类的实例(要清楚它实际并没有删除类本身而是在内存中这个类的实例)

SetWmiInstance 创建或更新一个现有WMI类的实例(要谨慎地使用它因为它实际上会写入WMI库)

现在让我们来解决WMI中最大的难题搞清楚它究竟是什么并且能提供什么数据

你可以依靠下面的代码来写程序

$Root = \\\ROOT:__namespace

$WMIProv = NewObject SystemManagementManagementClass

($Root)

$WMIProvGetInstances() | Select Name(但是这比其它任务更复杂些幸运的是你不用经常这么做

下面是你通过特定命名空间列出提供类的方法(默认是Root\CIM它包括所有的Microsoft Win类)

# On local machine

GetWmiObject –Namespace Root\SecurityCenter –List

# On Remote machine

GetWmiObject –Namespace Root\SecurityCenter –List

–Computer core

# To filter you can use wildcards

GetWmiObject –Namespace Root\SecurityCenter –List

*firewall*

# To list the classes for HyperV on remote server

GetWmiObject –Namespace Root\Virtualization –List

–Computer core(这很艰难但是你可以通过WMI浏览器或微软的PowerShell Scriptomatic等免费工具来作弊

现在是时候坐下来了解一下GetWMIObject的不寻常之处了它是五个命令集中最有用的一个工具箱里有了它你几乎与所有你能想到的任一块数据(微软相关的系统)都只有一线之隔有超过个Win用来显示CPU内存磁盘进程网络BIOS和USB等信息激动吗?等一下你就会知道它有多简单

获取操作系统的信息

GetWmiObject –class win_OperatingSystem获取计算机系统的信息

GetWmiObject –class win_ComputerSystem获取磁盘信息

GetWmiObject –class Win_LogicalDisk获取网络信息

GetWmiObject –class Win_NetworkAdapterConfiguration只要尝试一下 就是那么简单

让我们看一个使用WMI获取IP信息的例子下面有效的脚本代替了ipconfig和它通常的awful输出

function GetIP

{

[Cmdletbinding()]

Param(

[alias(dnsHostName)]

[Parameter(ValueFromPipelineByPropertyName=$trueValueFromPipeline=

$true) [string]$ComputerName = $Env:COMPUTERNAME

process

{

$NICs = GetWmiObject

Win_NetworkAdapterConfiguration Filter

IPEnabled=$True ComputerName $ComputerName

foreach ($Nic in $NICs)

{

$myobj = @{

Name = $NicDescription

MacAddress = $NicMACAddress

IP = $NicIPAddress | where{$_

match

\d+\\d+\\d+\\d+}

IP = $NicIPAddress | where{$_

match \:\:}

IPSubnet = $NicIPSubnet | where{$_

match

\d+\\d+\\d+\\d+}

DefaultGWY = $NicDefaultIPGateway |

Select First

DNSServer = $NicDNSServerSearchOrder

WINSPrimary = $NicWINSPrimaryServer

WINSSecondary = $NicWINSSecondaryServer

}

$obj = NewObject PSObject Property $myobj

$objPSTypeNamesClear()

$objPSTypeNamesAdd(BSonPoshIPInfo

$obj

}

}

}你可以在微软的网站上找到更多的关于WMI的信息还能看到WMI术语和Win类的列表               

上一篇:设计心得——用 XDoclet 减少代码膨胀

下一篇:打虎亲兄弟 Office 2010与Sharepoint 2010的协同工作