#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=...
одного из вышеперечисленных вариантов..