none
WU Powershell Skript- Ausgabe der Statusinformation in einem Fenster RRS feed

  • Allgemeine Diskussion

  • 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


    • Bearbeitet 0HugoStiglitz0 Donnerstag, 26. Mai 2016 16:36 Ergänzung
    • Typ geändert Teodora MilushevaModerator Dienstag, 31. Mai 2016 07:57 Die Threads die keine Aktivität haben, werden als Diskussion geändert. Das machen wir, um die Suche in dem Forum zu verbessern. Sie können den Typ jede Zeit ändern.
    Donnerstag, 26. Mai 2016 16:33