设为首页 收藏本站
查看: 1349|回复: 0

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

[复制链接]

尚未签到

发表于 2018-9-3 09:25:05 | 显示全部楼层 |阅读模式
  大家好,今天我将完成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>  PS
  附件免责声明
  文后附件仅供学习和测试使用,其中的代码并非完整可工作代码,严禁在生产环境中使用该PowerShell Module。本人不会为任何在生产环境中使用该PowerShell Module所带来的不良后果负责。如果您下载了该附件,即被认为接受了本免责声明
  Attachment(s): WUAModule.zip
  已发表 2011年10月7日 21:49 作者 ghjconan


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-561881-1-1.html 上篇帖子: Powershell学习笔记——运算符 下篇帖子: Powershell学习笔记——函数和函数库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表