PoshWSUS — как узнать дату последнего исправления для каждого сервера?

#poshwsus

Вопрос:

итак, у меня есть этот модуль PoshWSUS и скрипт, который запускается на WSUS и создает CSV-файл. Я пытаюсь обновить его, чтобы он также содержал столбец даты последнего исправления, но у меня возникли проблемы с его определением

 Import-Module -name poshwsus -force
Import-module -name SysDBApi -force
Import-module -name EncryptedCredential -force -ErrorAction Stop

#get credentials
$cred = Import-Clixml 'E:WCOtransit.xml'
$SysDBcred = Import-Clixml 'E:WCOSysDBCred.xml'
$UseSSL = $True
$Port = 8530
$Date = get-date -Format dd-MM-yyyy
$Time = get-date -format HHmmss
$Filename = "$($env:COMPUTERNAME)_$($Date)_$($Time)"


[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null

Connect-PSWSUSServer -WsusServer $env:COMPUTERNAME -Port $Port
$ClientInfoHash = Get-PSWSUSClient | 
    Group-Object -Property Id -AsHashTable -AsString 
$UpdateScope = New-PSWSUSUpdateScope -UpdateApprovalActions Install -ExcludedInstallationStates NotApplicable 
$Classifications = Get-PSWSUSClassification | Where-Object {$_.Title -eq "Security Updates" }
$UpdateScope.Classifications.AddRange($Classifications)
$WsusData = Get-PSWSUSUpdateSummaryPerClient -UpdateScope $UpdateScope
$WsusData | 
    Select-Object @{name="Computer name";Expression={($ClientInfoHash[$_.ComputerTargetID].FullDomainName).split(".",2) | select -first 1}},
                  @{name="Domain name";Expression={
                      if ( ($ClientInfoHash[$_.ComputerTargetID].FullDomainName).split(".",2)[1])
                      {
                        ($ClientInfoHash[$_.ComputerTargetID].FullDomainName).split(".",2) | select -last 1
                      }
                      else
                      {
                        "WORKGROUP"
                      }
                  }},

                  @{name="Customer";Expression={(Get-SysDBHost -Credentials $SysDBcred -ComputerName ( ($ClientInfoHash[$_.ComputerTargetID].FullDomainName).split(".",2) | select -first 1)).Customer}},
                  @{name="Last reported status";Expression={$ClientInfoHash[$_.ComputerTargetID].LastReportedStatusTime}},
                  @{name="Required Updates";expression={$_.needed}}, 
                  @{name="Total Updates";expression={($_.Installed $_.Needed $_.PendingReboot $_.Failed)}}, 
                  @{name="% Of Compliance";expression={"$([math]::Round((($_.Installed / ($_.Installed $_.Needed $_.PendingReboot $_.Failed)) * 100),0))%"}}, 
                  @{name="Operating System";Expression={$ClientInfoHash[$_.ComputerTargetID].OSDescription}}|
    Export-Csv -Path "E:Reports$($Filename)_UpdatesStatus.csv" -NoTypeInformation -Encoding "utf8" -Delimiter ";" 
 

На другом сервере WSUS мы используем sqlcmd и SQL-запросы для получения этих данных, и часть, которая получает эту информацию, выглядит следующим образом:

 SELECT LIP.FullDomainName as 'Server Name',LIP.GroupName as 'Group Name',
LIP.CreationDate as 'Most recent patchinstall date', CASE WHEN NUP.NumUPatches is NULL THEN 0 ELSE NUP.NumUPatches END as 'Number of needed patches' FROM LATESTINSTPATCH LIP LEFT JOIN NumOfUNINSTPATCH NUP ON LIP.ComputerID=NUP.ComputerID
ORDER BY NUP.NumUPatches
 

Согласно https://docs.microsoft.com/en-us/previous-versions/windows/desktop/bb410149(v=против 85)
это в PUBLIC_VIEWS.vUpdate, но как с этим работать в PoshWSUS?

РЕДАКТИРОВАТЬ: Я также хочу добавить поле WSUSgroupname, но это должно быть проще…

Ответ №1:

Вариант 1 использовать Get-PSWSUSUpdate

Параметры этой команды перечислены здесь, на Github

Запустите Get-PSWSUSUpdate с опцией, а затем передайте результаты grep на дату.


Вариант 2 собственная команда

это просто gwmi win32_quickfixengineering |sort installedon -desc


Вариант 3 Команда оболочки PS

 Get-HotFix |?{$_.InstalledOn -gt ((Get-Date).AddDays(-30))}
 

Теперь ваш скрипт может использовать что-то вроде @{name="Dates";Expression=... одного из вышеперечисленных вариантов..