您的位置:首页 > 运维架构 > Shell

PowerShell V2 高级函数使用举例(03)

2011-10-10 21:05 363 查看
大家好,今天我将完成Windows Update Agent PowerShell Module介绍的最后一讲。主要分成两部分,第一部分是继续高级函数的使用举例,第二部分是模块本身其它命令的一些快速介绍。

首先来介绍下如何对高级函数参数进行分类。在很早之前我博客的介绍中,只是凭空列举了四个参数来说明如何对参数进行分类,这次我们来看下在一个具体的使用场景中,如何去规划这个参数分类(参数集)。在此将引入另外一个在Windows Update Agent PowerShell Module中的高级函数:Search-WUUpdate。这里先贴出该高级函数的参数定义部分:

Param

(

[Parameter(Mandatory=$true,ParameterSetName="UpdateType",Position=0)]

[ValidateSet("Driver","Software")][String]$Type,

[Parameter(Mandatory=$true,ParameterSetName="UpdateType",Position=1)]

[ValidateSet("=","!=")][String]$TypeOperator,

[Parameter(Mandatory=$true,ParameterSetName="DeploymentAction",Position=0)]

[ValidateSet("Installation","Uninstallation")][String]$DeploymentAction,

[Parameter(Mandatory=$false,ParameterSetName="IS",Position=0)]

[ValidateSet("0","1")][int]$IsAssigned,

[Parameter(Mandatory=$false,ParameterSetName="IS",Position=1)]

[ValidateSet("0","1")][int]$AutoSelectOnWebSites,

[Parameter(Mandatory=$true,ParameterSetName="UpdateIdentity",Position=4)]

[String]$UpdateID,

[Parameter(Mandatory=$true,ParameterSetName="UpdateIdentity",Position=5)]

[String]$RevisionNumber,

[Parameter(Mandatory=$true,ParameterSetName="CategoryIDs",Position=6)]

[String]$CategoryIDs,

[Parameter(Mandatory=$false,ParameterSetName="IS",Position=2)]

[ValidateSet("0","1")][int]$IsInstalled,

[Parameter(Mandatory=$false,ParameterSetName="IS",Position=3)]

[ValidateSet("0","1")][int]$IsHidden,

[Parameter(Mandatory=$false,ParameterSetName="IS",Position=4)]

[ValidateSet("0","1")][int]$IsPresent,

[Parameter(Mandatory=$false,ParameterSetName="IS",Position=5)]

[ValidateSet("0","1")][int]$RebootRequired,

[Parameter(Mandatory=$true,ParameterSetName="Criteria",Position=0)]

[String]$Criteria

)

其实大家可以注意到,和之前的参数定义相比,这里的参数定义中只是增加了ParameterSetName这个参数属性,用于指定参数集的名称。而进行这个参数集的决定因素取决于高级函数在实现某项功能或者子功能的时候需要用户输入哪些参数。Search-WUUpdate就是这样一个高级函数,既允许用户通过cmdlet参数来指定搜索参数,也允许高级用户直接指定搜索字符串(参数Criteria)进行搜索。

接下来大家可能会好奇如何处理参数,这其实也不复杂,因为会接着利用$pscmdlet的一个属性ParameterSetName来进行判断。代码如下:

Switch ($pscmdlet.ParameterSetName) {

"UpdateType" {

$searchStrings = "Type$TypeOperator'$Type'"

}

"UpdateIdentity" {

$searchString = "UpdateID='$UpdateID' AND RevisionNumber=$RevisionNumber"

}

"CategoryIDs" {

$searchString = "CategoryIDs contains '$CategoryIDs'"

}

"Criteria" {

$searchString = $Criteria

}

Default {

$searchStrings=@()

foreach ($param in $params.GetEnumerator())

{

$paramName = $param.Key

$paramValue = $param.Value

if ($params.Count -gt 1)

{

$searchStrings += "$paramName=$paramValue"

}

else

{

if ($paramValue -isnot [int])

{

$searchString = "$paramName='$paramValue'"

}

else

{

$searchString = "$paramName=$paramValue"

}

}

}

if ($params.Count -gt 1)

{

$searchString = $searchStrings -join " AND "

}

}

}

大家看完以上代码之后就会发现其实也并不复杂,只是利用Switch对ParameterSetName进行判断。复杂的地方在于每个分支中的代码,这会根据具体要实现的功能而有所不同。示例代码的主要目的是生成合格搜索字符串,因此会根据参数集的不同而有所不同。参数集的分类依据,是根据MSDN上的IUpdateSearcher::Search 方法定义来决定的。这里大家可能会注意到某些搜索字符串乍看上去差不多,比如"$paramName='$paramValue'"和"$paramName=$paramValue",可能就是引号的区别,但是根据MSDN中提到的合格搜索条件这些引号是必不可少的,还请注意。还有一点,大家可以看到参数中有很多Is*形式的参数,那么在合成搜索语句时请大家善用-join操作符。当然我这里只是一个非常简单的实现,没有经过严格的测试,所以会有潜在的问题。因此为了方便高级用户手动输入搜索条件,我额外添加了Criteria参数。

总结起来,在高级函数中,启用参数集是比较简单的,难点在于后续的参数处理,而这完全取决于你的高级函数要实现那些功能。这里举得是Windows Update Agent API中搜索的例子,然而假设大家需要实现高级函数的参数集,那么是需要大家靠自己积累的经验来进行处理的,因此还请各位有机会的多锻炼下。接下来来看下这个命令的一个示例输出:





这里建议大家测试环境中配合WSUS进行测试。因为通过WSUS你可以控制客户端接收到的补丁数量,方便重复测试。

接下来我们来看下Windows Update Agent PowerShell Module中的其它命令。首先我们来看下命令列表:





这个模块一共包含16条命令,其中有四条命令是辅助函数,分别是Get-ResultCodeMeanning, New-CustomErrorRecord, Test-PSRemoting和Test-Privilege。其中Get-ResultCodeMeanning主要是用于解释下图中的ResultCode一栏。





其中2的意思是Succeeded。而New-CustomErrorRecord和Test-PSRemoting在之前的介绍中已经涉及到了,主要是新建错误记录和测试当前PowerShell 会话是否是远程会话。而Test-Privilege则是用来测试当前PowerShell会话是否是由提升权限后的管理员启动的。

而剩下的12条命令中,除了这几次详细介绍的Get-WUAutoUpdateSetting,Set-WUAutoUpdateSetting,Search-WUUpdate和Install-WUUpdate之外,剩下的几条命令分为两类,一类是返回信息,另一类是需要配合其它命令进行一些操作。其中Get-WUAVersion,Get-WUSystemInfo和Get-WUUpdateHistory可以不加参数直接运行,前两条命令将会返回一些版本信息。而Get-WUUpdateHistory可以返回补丁的历史安装记录。里面的信息比较复杂,需要大家参考MSDN上的相关信息来进行解读,我这里给出这条命令的运行结果:





而Invoke-WUAutoUpdateMethod则是用来触发定义在COM接口中的相关操作,其中最直观的可能是以下这个命令:





接下来一个高级函数是Invoke-WUOfflineScan。这个高级函数的作用是通过一个离线文件来确认当前系统还缺少哪些补丁,可以在缺少WSUS服务器以及无法连接到Internet情况下检查补丁安装情况。而Invoke-WUUpdateDownload则用来触发补丁的下载操作。而New-WebProxy则是用来创建供Windows Update Agent使用的代理对象。

这里需要提醒大家一点,以上提到的几个命令并没有经过详细的测试,脚本代码也并不是很完善,如果各位有兴趣的话,大家可以通过这个模块来练练手,

文章最后分享下我在编写和测试这个模块时用到的一些小技巧。首先是MSDN文档,没有相关文档是无法完成这个模块的。接下来是测试技巧,因为我们要经常下载补丁来进行补丁安装测试,所以建议各位在测试环境中安装WSUS服务器,然后通过WSUS服务器来控制客户端如何安装补丁。最后建议大家使用Trace32这个工具打开WindowsUpdate.log来查看命令的执行结果,同时也方便进行测试,关于如何阅读WindowsUpdate.log,各位可以查看这篇KB

好了,本次以Windows Update Agent API为基础展开的Windows PowerShell V2高级函数的介绍就到此结束,这里希望大家有机会的话可以研究下文后的模块,以及编写这个模块所用到的技巧。

从下次介绍开始,我将暂时搁置下Windows PowerShell,转而为大家介绍一款可能大多数人不算熟悉的微软服务器端产品,Forefront Identity Manager 2010,敬请期待。

PS

附件免责声明

文后附件仅供学习和测试使用,其中的代码并非完整可工作代码,严禁在生产环境中使用该PowerShell Module。本人不会为任何在生产环境中使用该PowerShell Module所带来的不良后果负责。如果您下载了该附件,即被认为接受了本免责声明

Attachment(s): WUAModule.zip

已发表 2011年10月7日 21:49 作者 ghjconan

附件:http://down.51cto.com/data/2359047
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Windows 博客 休闲