IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

PSWindowsUpdate en remote ? [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre chevronné
    Avatar de Skyxia
    Homme Profil pro
    Ingénieur réseau & sécurité
    Inscrit en
    Mai 2016
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur réseau & sécurité
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2016
    Messages : 359
    Billets dans le blog
    3
    Par défaut PSWindowsUpdate en remote ?


    Je dispose de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    param($global:RestartRequired=0,
            $global:MoreUpdates=0,
            $global:MaxCycles=10)
    
    function Check-ContinueRestartOrEnd() {
        $RegistryKey = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
        $RegistryEntry = "InstallWindowsUpdates"
        switch ($global:RestartRequired) {
            0 {            
                $prop = (Get-ItemProperty $RegistryKey).$RegistryEntry
                if ($prop) {
                    Write-Host "Restart Registry Entry Exists - Removing It"
                    Remove-ItemProperty -Path $RegistryKey -Name $RegistryEntry -ErrorAction SilentlyContinue
                }
                
                Write-Host "No Restart Required"
                Check-WindowsUpdates
                
                if (($global:MoreUpdates -eq 1) -and ($script:Cycles -le $global:MaxCycles)) {
                    Stop-Service $script:ServiceName -Force
                    Set-Service -Name $script:ServiceName -StartupType Disabled -Status Stopped 
                    Install-WindowsUpdates
                } elseif ($script:Cycles -gt $global:MaxCycles) {
                    Write-Host "Exceeded Cycle Count - Stopping"
                } else {
                    Write-Host "Done Installing Windows Updates"
                    Set-Service -Name $script:ServiceName -StartupType Automatic -Status Running         
                }
            }
            1 {
                $prop = (Get-ItemProperty $RegistryKey).$RegistryEntry
                if (-not $prop) {
                    Write-Host "Restart Registry Entry Does Not Exist - Creating It"
                    Set-ItemProperty -Path $RegistryKey -Name $RegistryEntry -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File $($script:ScriptPath)"
                } else {
                    Write-Host "Restart Registry Entry Exists Already"
                }
                
                Write-Host "Restart Required - Restarting..."
                Restart-Computer
            }
            default { 
                Write-Host "Unsure If A Restart Is Required" 
                break
            }
        }
    }
    
    function Install-WindowsUpdates() {
        $script:Cycles++
        Write-Host 'Evaluating Available Updates:'
        $UpdatesToDownload = New-Object -ComObject 'Microsoft.Update.UpdateColl'
        foreach ($Update in $SearchResult.Updates) {
            if (($Update -ne $null) -and (!$Update.IsDownloaded)) {
                [bool]$addThisUpdate = $false
                if ($Update.InstallationBehavior.CanRequestUserInput) {
                    Write-Host "> Skipping: $($Update.Title) because it requires user input"
                } else {
                    if (!($Update.EulaAccepted)) {
                        Write-Host "> Note: $($Update.Title) has a license agreement that must be accepted. Accepting the license."
                        $Update.AcceptEula()
                        [bool]$addThisUpdate = $true
                    } else {
                        [bool]$addThisUpdate = $true
                    }
                }
            
                if ([bool]$addThisUpdate) {
                    Write-Host "Adding: $($Update.Title)"
                    $UpdatesToDownload.Add($Update) |Out-Null
                }
            }
        }
        
        if ($UpdatesToDownload.Count -eq 0) {
            Write-Host "No Updates To Download..."
        } else {
            Write-Host 'Downloading Updates...'
            $Downloader = $UpdateSession.CreateUpdateDownloader()
            $Downloader.Updates = $UpdatesToDownload
            $Downloader.Download()
        }
        
        $UpdatesToInstall = New-Object -ComObject 'Microsoft.Update.UpdateColl'
        [bool]$rebootMayBeRequired = $false
        Write-Host 'The following updates are downloaded and ready to be installed:'
        foreach ($Update in $SearchResult.Updates) {
            if (($Update.IsDownloaded)) {
                Write-Host "> $($Update.Title)"
                $UpdatesToInstall.Add($Update) |Out-Null
                  
                if ($Update.InstallationBehavior.RebootBehavior -gt 0){
                    [bool]$rebootMayBeRequired = $true
                }
            }
        }
        
        if ($UpdatesToInstall.Count -eq 0) {
            Write-Host 'No updates available to install...'
            $global:MoreUpdates=0
            $global:RestartRequired=0
            break
        }
    
        if ($rebootMayBeRequired) {
            Write-Host 'These updates may require a reboot'
            $global:RestartRequired=1
        }
        
        Write-Host 'Installing updates...'
      
        $Installer = $script:UpdateSession.CreateUpdateInstaller()
        $Installer.Updates = $UpdatesToInstall
        $InstallationResult = $Installer.Install()
      
        Write-Host "Installation Result: $($InstallationResult.ResultCode)"
        Write-Host "Reboot Required: $($InstallationResult.RebootRequired)"
        Write-Host 'Listing of updates installed and individual installation results:'
        if ($InstallationResult.RebootRequired) {
            $global:RestartRequired=1
        } else {
            $global:RestartRequired=0
        }
        
        for($i=0; $i -lt $UpdatesToInstall.Count; $i++) {
            New-Object -TypeName PSObject -Property @{
                Title = $UpdatesToInstall.Item($i).Title
                Result = $InstallationResult.GetUpdateResult($i).ResultCode
            }
        }
        
        Check-ContinueRestartOrEnd
    }
    
    function Check-WindowsUpdates() {
        Write-Host "Checking For Windows Updates"
        $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
        Write-Host $Message
    
        $script:UpdateSearcher = $script:UpdateSession.CreateUpdateSearcher()
        $script:SearchResult = $script:UpdateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")      
        if ($SearchResult.Updates.Count -ne 0) {
            $script:SearchResult.Updates |Select-Object -Property Title, Description, SupportUrl, UninstallationNotes, RebootRequired, EulaAccepted |Format-List
            $global:MoreUpdates=1
        } else {
            Write-Host 'There are no applicable updates'
            $global:RestartRequired=0
            $global:MoreUpdates=0
        }
    }
    
    $script:ScriptName = $MyInvocation.MyCommand.ToString()
    $script:ScriptPath = $MyInvocation.MyCommand.Path
    $script:UpdateSession = New-Object -ComObject 'Microsoft.Update.Session'
    $script:UpdateSession.ClientApplicationID = 'Packer Windows Update Installer'
    $script:UpdateSearcher = $script:UpdateSession.CreateUpdateSearcher()
    $script:SearchResult = New-Object -ComObject 'Microsoft.Update.UpdateColl'
    $script:Cycles = 0
    
    
    Check-WindowsUpdates
    if ($global:MoreUpdates -eq 1) {
        Install-WindowsUpdates
    } else {
        Check-ContinueRestartOrEnd
    }
    Qui me permet de checker puis d'effectuer les mises à jours Windows.

    Mon problème est le suivant : Je dois effectuer ces MAJ sur plusieurs postes/serveurs.
    J'aimerais pour éviter me de connecter en RDP puis lancer le script à chaque fois pouvoir lancer ces MAJ comme le faisait un autre de mes scripts :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    get-content C:\Users\test\Documents\Script\Infos\List1.txt |
    C'est a dire, récupérer dans la "List1" le nom des serveurs, appliquer le script (donc check + install des MAJ + redémarrage si nécessaire), et c'est tout ou a la rigueur créer un "result.txt" en sortie dans lequel un simple message m'indique "Tout s'est terminé correctement" ou "Des erreures sont survenues".

    Si je n'ai pas était assez clair merci de me le préciser.

    Cordialement.

    Siberattaque : Attaque informatique par un hackeur sibérien.


    Je vous invite à consulter mes billets dans mon blog :
    Cisco IOS & Sécurité basique
    Audit réseaux dans un SI

    [Smartphone] [Android] 8 conseils pour vous sécuriser un minimum !

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    tu peux utiliser des jobs , mais Winrm doit être configuré sur ton infra.
    Citation Envoyé par Skyxia Voir le message
    ou a la rigueur créer un "result.txt" en sortie dans lequel un simple message m'indique "Tout s'est terminé correctement" ou "Des erreures sont survenues".
    Mieux vaut centraliser la récupération des erreurs d'exécution, ainsi tu sais où le traitement n 'a pas fonctionné et pourquoi.

  3. #3
    Membre chevronné
    Avatar de Skyxia
    Homme Profil pro
    Ingénieur réseau & sécurité
    Inscrit en
    Mai 2016
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur réseau & sécurité
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2016
    Messages : 359
    Billets dans le blog
    3
    Par défaut
    Je te remercie pour ta réponse, ainsi que pour le lien. Je vais aller jeter un œil là-dessus

    Siberattaque : Attaque informatique par un hackeur sibérien.


    Je vous invite à consulter mes billets dans mon blog :
    Cisco IOS & Sécurité basique
    Audit réseaux dans un SI

    [Smartphone] [Android] 8 conseils pour vous sécuriser un minimum !

  4. #4
    Membre chevronné
    Avatar de Skyxia
    Homme Profil pro
    Ingénieur réseau & sécurité
    Inscrit en
    Mai 2016
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur réseau & sécurité
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2016
    Messages : 359
    Billets dans le blog
    3
    Par défaut
    J'ai bien compris l'utilisation des Jobs pour le retour d'erreur ou non, néanmoins je ne pense pas qu'il soit possible de régler mon problème de "remote session" avec ceux-ci (corrigez moi si je me trompe) quelqu'un aurait-il une idée pour le problème en question ? Le retour d'erreur/de confirmation de l'exécution du script reste quand à lui optionnel.

    Rectification, Je viens de trouver :

    8. Utiliser un Job distant
    8.1 Exécution d'un RemoteJob


    Siberattaque : Attaque informatique par un hackeur sibérien.


    Je vous invite à consulter mes billets dans mon blog :
    Cisco IOS & Sécurité basique
    Audit réseaux dans un SI

    [Smartphone] [Android] 8 conseils pour vous sécuriser un minimum !

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    En passant, revoit tes appels à Write-Host car en remote il n'y a pas de console.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Eclipse][JBoss] Lancer un serveur JBoss en remote
    Par cowa dans le forum Wildfly/JBoss
    Réponses: 7
    Dernier message: 02/09/2008, 11h08
  2. Utilisations de flash remoting et com servers
    Par bolo dans le forum Flash
    Réponses: 8
    Dernier message: 11/07/2006, 10h04
  3. [Integration] Equivalent de l'interface Remote des EJB
    Par onlytoine dans le forum Spring
    Réponses: 36
    Dernier message: 07/01/2005, 14h55
  4. Création d'un "remote server" sur un réseau
    Par Papino dans le forum Débuter
    Réponses: 2
    Dernier message: 05/09/2004, 16h49
  5. [C#] OpenFileDialog en Remoting
    Par MarkoImDe dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/06/2004, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo