Quantcast
Channel: Windows PowerShell Forum
Viewing all articles
Browse latest Browse all 2314

WU Powershell Skript- Ausgabe der Statusinformation in einem Fenster

$
0
0

Hallo alle zusammen,

ich bin gerade dabei, eine Lösung für unser "Windows Update (WU) Problem unter Windows Server 2012 R2" zu finden. Problem ist, dass wir feste Zeiten einstellen, wann WU installiert werden. Wir nutzen WSUS zum Verteilen. Unter Windows 2012 R2 schlägt aber leider immer das "Maintenance Windows" zu. Die Lösung sieht bis jetzt so aus, als das die Windows Update Funktion deaktiviere und einen Scheduled Task einrichte, welcher das "Get-WindowsUpdate.ps1" Script mit dem Parameter "-install" ausführt. Das Skript habe ich von MS bekommen. Der Task läuft mit dem SYSTEM Account und als höchste Priorität. Es gibt dabei noch die Möglichkeit, den Task manuell über eine Verknüpfung auf dem Desktop zu starten.

Leider bekomme ich dabei kein Fenster anzeigt, ob er nun Updates gefunden hat, diese ggfs. noch herunter lädt oder wieviele er noch installieren muss. Könnt ihr mir bitte dabei helfen und eine solche Funktion einbauen oder mir sagen, wie ich dies einbinden kann?

Anbei das Skript:

<#
    .SYNOPSIS
        Get and optionally install Windows Updates
    .DESCRIPTION
        This script will get all available udpates for the computer it is run on.
        It will then optionally install those updates, provided they do not require
        user input.

        This script was based off the original vbs that appeared on the MSDN site.
        Please see the Related Links section for the URL.

        Without any parameters the script will return the title of each update that
        is currently available.
    .PARAMETER Install
        When present the script will download and install each update. If the EulaAccept
        param has not been passed, only updates that don't have a Eula will be applied.
    .PARAMETER EulaAccept
        When present will allow the script to download and install all updates that are
        currently available.
    .EXAMPLE
        .\Get-WindowsUpdates.ps1

        There are no applicable updates

        Description
        -----------
        This system is currently patched and up to date.
    .NOTES
        ScriptName : Get-WindowsUpdates.ps1
        Created By : jspatton
        Date Coded : 08/29/2012 13:06:31
        ScriptName is used to register events for this script

        ErrorCodes
            100 = Success
            101 = Error
            102 = Warning
            104 = Information
    .LINK
        https://code.google.com/p/mod-posh/wiki/Production/Get-WindowsUpdates.ps1
    .LINK
        http://msdn.microsoft.com/en-us/library/windows/desktop/aa387102(v=vs.85).aspx
#>
[CmdletBinding()]
Param
    (
    [switch]$Install,
    [switch]$EulaAccept
    )
Begin
    {
        $ScriptName = $MyInvocation.MyCommand.ToString()
        $ScriptPath = $MyInvocation.MyCommand.Path
        $Username = $env:USERDOMAIN + "\" + $env:USERNAME

        New-EventLog -Source $ScriptName -LogName 'Windows Powershell' -ErrorAction SilentlyContinue

        $Message = "Script: " + $ScriptPath + "`nScript User: " + $Username + "`nStarted: " + (Get-Date).toString()
        Write-EventLog -LogName 'Windows Powershell' -Source $ScriptName -EventID "104" -EntryType "Information" -Message $Message

        #	Dotsource in the functions you need.

        $UpdateSession = New-Object -ComObject 'Microsoft.Update.Session'
        $UpdateSession.ClientApplicationID = 'MSDN PowerShell Sample'
        }
Process
    {

        $UpdateSearcher = $UpdateSession.CreateUpdateSearcher()

            # $UpdateSearcher.ServiceID = "9482F4B4-E343-43B6-B170-9A65BC822C77"    # WU
            $UpdateSearcher.ServiceID = "3DA21691-E39D-4DA6-8A4B-B43877BCB1B7" #Wsus
            $UpdateSearcher.SearchScope = 3
            $UpdateSearcher.ServerSelection = 3

        $SearchResult = $UpdateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")


        if ($Install)
        {
            Write-Verbose 'Creating a collection of updates to download:'
            $UpdatesToDownload = New-Object -ComObject 'Microsoft.Update.UpdateColl'
            foreach ($Update in $SearchResult.Updates)
            {
                [bool]$addThisUpdate = $false
                if ($Update.InstallationBehavior.CanRequestUserInput)
                {
                    Write-Verbose "> Skipping: $($Update.Title) because it requires user input"
                    }
                else
                {
                    if (!($Update.EulaAccepted))
                    {
                        Write-Verbose "> Note: $($Update.Title) has a license agreement that must be accepted:"
                        if ($EulaAccept)
                        {
                            $Update.AcceptEula()
                            [bool]$addThisUpdate = $true
                            }
                        else
                        {
                            Write-Verbose "> Skipping: $($Update.Title) because the license agreement was declined"
                            }
                        }
                    else
                    {
                        [bool]$addThisUpdate = $true
                        }
                    }
                if ([bool]$addThisUpdate)
                {
                    Write-Verbose "Adding: $($Update.Title)"
                    $UpdatesToDownload.Add($Update) |Out-Null
                    }
                }
            if ($UpdatesToDownload.Count -eq 0)
            {
                Write-Verbose 'All applicable updates were skipped.'
                break
                }

            Write-Verbose 'Downloading updates...'
            $Downloader = $UpdateSession.CreateUpdateDownloader()
            $Downloader.Updates = $UpdatesToDownload
            $Downloader.Download()

            $UpdatesToInstall = New-Object -ComObject 'Microsoft.Update.UpdateColl'

            [bool]$rebootMayBeRequired = $false
            Write-Verbose 'Successfully downloaded updates:'

            foreach ($Update in $SearchResult.Updates)
            {
                if ($Update.IsDownloaded)
                {
                    Write-Verbose "> $($Update.Title)"
                    $UpdatesToInstall.Add($Update) |Out-Null

                    if ($Update.InstallationBehavior.RebootBehavior -gt 0)
                    {
                        [bool]$rebootMayBeRequired = $true
                        }
                    }
                }
            if ($UpdatesToInstall.Count -eq 0)
            {
                Write-Verbose 'No updates were succsesfully downloaded'
                }

            if ($rebootMayBeRequired)
            {
                Write-Verbose 'These updates may require a reboot'
                }

            Write-Verbose 'Installing updates...'

            $Installer = $UpdateSession.CreateUpdateInstaller()
            $Installer.Updates = $UpdatesToInstall
            $InstallationResult = $Installer.Install()

            Write-Verbose "Installation Result: $($InstallationResult.ResultCode)"
            Write-Verbose "Reboot Required: $($InstallationResult.RebootRequired)"
            Write-Verbose 'Listing of updates installed and individual installation results'

            for($i=0; $i -lt $UpdatesToInstall.Count; $i++)
            {
                New-Object -TypeName PSObject -Property @{
                    Title = $UpdatesToInstall.Item($i).Title
                    Result = $InstallationResult.GetUpdateResult($i).ResultCode
                    }
                }
            }
        else
        {
            if ($SearchResult.Updates.Count -ne 0)
            {
                #$SearchResult.Updates |Select-Object -Property Title |Format-List
                $SearchResult.Updates |Select-Object -Property Title, IsDownloaded | Format-Table
                }
            else
            {
                Write-Host 'There are no applicable updates'
                }
            }
        }
End
    {
        $Message = "Script: " + $ScriptPath + "`nScript User: " + $Username + "`nFinished: " + (Get-Date).toString()
        Write-EventLog -LogName 'Windows Powershell' -Source $ScriptName -EventID "104" -EntryType "Information" -Message $Message
        }

Danke und Gruß

/Danny



Viewing all articles
Browse latest Browse all 2314


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>