none
Создание отчета по WSUS (POWERSHELL)

    Вопрос

  • Добрый день, коллеги!

    Поставили задачу, собирать с WSUS информацию по контроллерам домена - имя контроллера, сколько висит не установленных обновлений и когда последний раз связывался с WSUS сервером и далее всю эту информацию нужно отправлять её по почте. Проблема в том, что контроллеры домена находятся в общей куче со всеми остальными пк\серверами поэтому обычные отчеты WSUS не пригодились. Было принято решение написать скрипт, который будет делать все это. Скрипт я написал:

    cls
    [void][system.reflection.assembly]::LoadWithPartialName('Microsoft.UpdateServices.Administration')
    $Global:wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer(“nsk-srv03”,$False, 8530)
    $computerscope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
    $updatescope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
    $wsus.GetSummariesPerComputerTarget($updatescope,$computerscope) |
    ForEach {
                $wsus_info = New-Object PSObject -Property @{
                                                                LastUpdated = $_.LastUpdated
                                                                ComputerName = ($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).FullDomainName
                                                                NeededCount = ($_.DownloadedCount + $_.NotInstalledCount)
                                                                #DownloadedCount = $_.DownloadedCount
                                                                #NotApplicableCount = $_.NotApplicableCount
                                                                #NotInstalledCount = $_.NotInstalledCount
                                                                #InstalledCount = $_.InstalledCount
                                                                #FailedCount = $_.FailedCount                                                            
                                                            }
                $wsus_info = $wsus_info | ?{($_.ComputerName -like "*sdcs*")}  
                $wsus_info | ?{$_.NeededCount -ne '0'} | select ComputerName, @{Expression={$_.NeededCount};Label="NeedInstallUpdate"}, @{Expression={$_.LastUpdated};Label="LastContactServer"}
            } |        
            Send-MailMessage -To pochta@nsk.com -From ServerReport@test.com -Body $_ -subject "Server Report" -SmtpServer nsk-smtp1

    Но, в данном скрипте я не могу вывести свойство Last Status Report(или ещё как то его привязать), есть только LastUpdate, что мне не нужно совсем. И вторая проблема, как вывод скрипта перенаправлять в почту? В моем примере приходит пустое письмо. Прошу помощи. Заранее благодарен за любой ответ.





    • Изменено eclegolas 15 марта 2019 г. 6:27 Правка
    • Изменен тип eclegolas 15 марта 2019 г. 8:52 правка
    15 марта 2019 г. 6:23

Ответы

  • а так $(($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).LastReportedStatusTime)

    на что ругается то? 

    • Изменено Svolotch 15 марта 2019 г. 8:27
    • Помечено в качестве ответа eclegolas 15 марта 2019 г. 8:52
    15 марта 2019 г. 8:25
  • Спасибо Вам большое! Так заработало.

    Вот конечный вариант скрипта:

    cls
    $(get-childitem "C:\Temp\Wsus.html").delete()
    $rep = @()
    $a = "<style>"
    $a = $a + "BODY{background-color:#D6FFAD;}"
    $a = $a + "TABLE{border-width: 2px;border-style: solid;border-color: black;border-collapse: collapse;}"
    $a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#82b254}"
    $a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#FFFFEB}"
    $a = $a + "</style>"
    $body = "<b>Wsus reports</b><br> $(get-date)"
    
    [void][system.reflection.assembly]::LoadWithPartialName('Microsoft.UpdateServices.Administration')
    $Global:wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer(“nsk-srv03”,$False, 8530)
    $computerscope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
    $updatescope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
    $wsus.GetSummariesPerComputerTarget($updatescope,$computerscope) |
    ForEach {
                $wsus_info = New-Object PSObject -Property @{
                                                                LastUpdated = $_.LastUpdated
                                                                ComputerName = ($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).FullDomainName
                                                                LastSync = $(($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).LastReportedStatusTime)
                                                                NeededCount = ($_.DownloadedCount + $_.NotInstalledCount)                                                    
                                                            }
                $wsus_info = $wsus_info | ?{($_.ComputerName -like "*sdcs*")}  
                $wsus_info | ?{$_.NeededCount -ne '0'} | select ComputerName, LastSync, @{Expression={$_.NeededCount};Label="NeedInstallUpdate"}, @{Expression={$_.LastUpdated};Label="LastContactServer"}
                $attach = get-childitem "C:\Temp\Wsus.html"
            }  | ConvertTo-Html -head $a -body $body  | Out-File C:\Temp\Wsus.html -Force
            Send-MailMessage -To pochta@nsk.com -From ServerReport@test.com -Body  $attach -subject "Server Report" -SmtpServer nsk-smtp1

    • Помечено в качестве ответа eclegolas 15 марта 2019 г. 8:53
    15 марта 2019 г. 8:33

Все ответы

  • send-mailmessage в качестве боди ожидает таки стринг, а не кастомный объект.

    нет под рукой всуса, а тестовый разворачивать лень

    15 марта 2019 г. 8:04
  • Добрый день!

    Собственно с почтой разобрался, тоже допер до этого, а вот с LastReportedStatusTime победить не могу =(

    Сам скрипт сейчас такой:

    cls
    $(get-childitem "C:\Temp\Wsus.html").delete()
    $rep = @()
    $a = "<style>"
    $a = $a + "BODY{background-color:#D6FFAD;}"
    $a = $a + "TABLE{border-width: 2px;border-style: solid;border-color: black;border-collapse: collapse;}"
    $a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#82b254}"
    $a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#FFFFEB}"
    $a = $a + "</style>"
    $body = "<b>Wsus reports</b><br> $(get-date)"
    
    [void][system.reflection.assembly]::LoadWithPartialName('Microsoft.UpdateServices.Administration')
    $Global:wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer(“nsk-srv03”,$False, 8530)
    $computerscope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
    $updatescope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
    $wsus.GetSummariesPerComputerTarget($updatescope,$computerscope) |
    ForEach {
                $wsus_info = New-Object PSObject -Property @{
                                                                LastUpdated = $_.LastUpdated
                                                                ComputerName = ($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).FullDomainName
                                                                LastSync = ($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).LastReportedStatusTime
                                                                NeededCount = ($_.DownloadedCount + $_.NotInstalledCount)                                                          
                                                            }
                $wsus_info = $wsus_info | ?{($_.ComputerName -like "*sdcs*")}  
                $wsus_info | ?{$_.NeededCount -ne '0'} | select ComputerName, @{Expression={$_.NeededCount};Label="NeedInstallUpdate"}, @{Expression={$_.LastUpdated};Label="LastContactServer"}
                $attach=get-childitem "C:\Temp\Wsus.html"
            }  | ConvertTo-Html -head $a -body $body  | Out-File C:\Temp\Wsus.html -Force
            Send-MailMessage -To pochta@nsk.com -From ServerReport@test.com -Body $attach -subject "Server Report" -SmtpServer nsk-smtp1

    Все отправляет, все работает, но с строкой LastSync = ($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).LastReportedStatusTime имею проблемы и не зрнаю как их решить =(


    • Изменено eclegolas 15 марта 2019 г. 8:16 правка
    15 марта 2019 г. 8:12
  • а так $(($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).LastReportedStatusTime)

    на что ругается то? 

    • Изменено Svolotch 15 марта 2019 г. 8:27
    • Помечено в качестве ответа eclegolas 15 марта 2019 г. 8:52
    15 марта 2019 г. 8:25
  • Спасибо Вам большое! Так заработало.

    Вот конечный вариант скрипта:

    cls
    $(get-childitem "C:\Temp\Wsus.html").delete()
    $rep = @()
    $a = "<style>"
    $a = $a + "BODY{background-color:#D6FFAD;}"
    $a = $a + "TABLE{border-width: 2px;border-style: solid;border-color: black;border-collapse: collapse;}"
    $a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#82b254}"
    $a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#FFFFEB}"
    $a = $a + "</style>"
    $body = "<b>Wsus reports</b><br> $(get-date)"
    
    [void][system.reflection.assembly]::LoadWithPartialName('Microsoft.UpdateServices.Administration')
    $Global:wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer(“nsk-srv03”,$False, 8530)
    $computerscope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
    $updatescope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
    $wsus.GetSummariesPerComputerTarget($updatescope,$computerscope) |
    ForEach {
                $wsus_info = New-Object PSObject -Property @{
                                                                LastUpdated = $_.LastUpdated
                                                                ComputerName = ($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).FullDomainName
                                                                LastSync = $(($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).LastReportedStatusTime)
                                                                NeededCount = ($_.DownloadedCount + $_.NotInstalledCount)                                                    
                                                            }
                $wsus_info = $wsus_info | ?{($_.ComputerName -like "*sdcs*")}  
                $wsus_info | ?{$_.NeededCount -ne '0'} | select ComputerName, LastSync, @{Expression={$_.NeededCount};Label="NeedInstallUpdate"}, @{Expression={$_.LastUpdated};Label="LastContactServer"}
                $attach = get-childitem "C:\Temp\Wsus.html"
            }  | ConvertTo-Html -head $a -body $body  | Out-File C:\Temp\Wsus.html -Force
            Send-MailMessage -To pochta@nsk.com -From ServerReport@test.com -Body  $attach -subject "Server Report" -SmtpServer nsk-smtp1

    • Помечено в качестве ответа eclegolas 15 марта 2019 г. 8:53
    15 марта 2019 г. 8:33
  • Кстати, я почему то не могу ответить Ваш ответ как правильный.
    15 марта 2019 г. 8:48
  • вы создали обсуждение, а не вопрос.
    15 марта 2019 г. 8:49
  • Изменил тип, спасибо. Отметил Ваш ответ как верный.
    15 марта 2019 г. 8:53