用于检查特定于服务器

时间:2017-12-19 18:38:00

标签: powershell

我在下面编写脚本来验证Windows服务器中是否存在某些KB。 每个Windows版本都应该安装推荐的KB。这段代码工作正常。但我想在$ Objects中添加一个新的noteproperty作为“Comments”,它的Value应该根据某些条件自定义消息,如“Problem”或“Good”。

条件:

  • 如果所有$ kb都缺失 - >问题
  • 如果所有$ kb都已安装 - >好
  • 如果安装了最高$ kb - >好

实际情况

  • Windows Server 2008,SP1,SP2,R2和R2 SP1需要安装KB2754704才能解决MPIO路径故障转移问题
  • Windows Server 2008 R2和R2 SP1需要安装KB2821052才能解决MPIO路径故障转移问题
  • Windows Server 2008 SP2需要安装KB2878031才能解决MPIO路径故障转移问题
  • Windows Server 2012和2012 R2要求安装KB3046101以解决MPIO路径故障转移问题

代码

$Hotfixes = Get-WmiObject -Class Win32_QuickFixEngineering
$OSName = Get-WmiObject win32_operatingsystem | select Caption -expa Caption
$Kbs = $null
if($OSName -match "2008 R2")
{
    $Kbs = @('KB2754704','KB2821052','KB2869606')
}
if($OSName -match "2008 SP2")
{
    $Kbs = @('KB2878031')
}
if($OSName -match "2012 R2")
{
    $kbs = @('KB3046101','KB3121261')
}
if($OSName -match "2012")
{
    $kbs = @('KB3046101')
}
$ht = [ordered]@{} 
foreach($kb in $Kbs) 
{ 
  $st =  $Hotfixes.HotFixID -contains $kb
  $ht[$kb] = $st 
}
$object = new-object psobject
$object | add-member  -MemberType noteproperty -name Server -Value $env:COMPUTERNAME
$object | add-member  -MemberType noteproperty -name OSName -Value $OSName
$object | add-member  -MemberType noteproperty -name Comments -Value ""
$object 

我应该在这里做些什么改变才能通过这三个条件?与$ Kbs数组中的Kb计数无关。 我创建了一个$ Kbs的哈希表,所有$ true都与其他哈希表

进行比较
$ht
Name                           Value                                              
----                           -----                                              
KB2754704                      False                                              
KB2821052                      False                                              
KB2869606                      True   

$DHash = [ordered]@{} 
$Kbs | ForEach-Object {$DHash.Add($_,$true)}

$DHash
Name                           Value                                              
----                           -----                                            
KB2754704                      True                                               
KB2821052                      True                                               
KB2869606                      True 

我很震惊继续写条件。我使用了compare-object,但结果是侧面指标。我真的不确定如何实现这个功能。所以在这里发布我的查询以获得一些想法/帮助。

1 个答案:

答案 0 :(得分:0)

您可以将$ht设为PSCustomObject的类型,然后选择最后一个元素(即“最高”KB)。如果那是$true,那你很好。如果没有,则表示您遇到问题,因为没有,或者没有安装最新的补丁

$ht = foreach ($kb in $Kbs) 
{ 
    $st = $Hotfixes.HotFixID -contains $kb
    [PSCustomObject]@{
        kb = $kb
        st = $st
    }
}

$ht = $ht | Sort-Object -Property kb

if ($ht[-1] -eq $true) {
    $Comment = 'Good'
}
else {
    $Comment = 'Problem'
}