none
POWERSHELL - WSUS - Approbation Automatique et Log RRS feed

  • Question

  • Bonjour, 

    Voici le script que je souhaiterai mettre en place pour l'approbation des mises à jour Microsoft.

    # ~ | -------------------------------------------------------------------------- |
    # ~ | WSUS_AutoApprove
    # ~ |
    # ~ | Date : 21/12/2015
    # ~ | 
    # ~ | Description : Approuve automatiquement les mises à jour sur les groupes de 
    # ~ | test, puis sur l'ensemble du parc.
    # ~ | -------------------------------------------------------------------------- |
    
    # ~ | -------------------------------------------------------------------------- |
    # ~ | VARIABLES
    # ~ | -------------------------------------------------------------------------- |
    $install = [Microsoft.UpdateServices.Administration.UpdateApprovalAction]::Install;
    [reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null
    $notapproved = [Microsoft.UpdateServices.Administration.UpdateApprovalAction]::NotApproved;
    [reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null
    # ~ | Date pour nommé le fichier de log
    $date=(get-date).ToString('yyyy-mm-dd')
    # ~ | -------------------------------------------------------------------------- |
    
    # ~ | -------------------------------------------------------------------------- |
    # ~ | CONNEXION AU SERVEUR
    # ~ | -------------------------------------------------------------------------- |
    $server="localhost"
    # ~ | Mettre sur " $True " pour se connecter en HTTP
    $Secure=$False
    $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($server,$Secure,8530)
    # ~ | -------------------------------------------------------------------------- |
    
    # ~ | -------------------------------------------------------------------------- |
    # ~ | LISTE DES GROUPES D'ORDINATEUR
    # ~ | -------------------------------------------------------------------------- |
    # ~ | Les groupes de test
    $PC_TST=$wsus.GetComputerTargetGroups() | WHERE {$_.Name -eq "Postes_test"}
    $PC_TST2=$wsus.GetComputerTargetGroups() | WHERE {$_.Name -eq "Postes_test_Phase2"}
    $SRV_TST=$wsus.GetComputerTargetGroups() | WHERE {$_.Name -eq "Serveurs_test"}
    # ~ | Les groupes de production
    $PROD=$wsus.GetComputerTargetGroups() | WHERE {($_.Name -eq "Postes") -or ($_.Name -eq "Postes_Critiques") -or ($_.Name -eq "Serveurs") -or ($_.Name -eq "Serveurs_Critiques")}
    # ~ | Les groupes où les mises à jour ne sont pas approuvées (Group = Ordinateurs non attribués)
    $NOPROD=$wsus.GetComputerTargetGroups() | WHERE {$_.Id -eq "b73ca6ed-5727-47f3-84de-015e03f6a88a"} 
    # ~ | -------------------------------------------------------------------------- |
     
    # ~ | -------------------------------------------------------------------------- |
    # ~ | LISTE DE TOUTES LES MISES A JOUR
    # ~ | -------------------------------------------------------------------------- |
    $updates = $wsus.GetUpdates()
    # ~ | -------------------------------------------------------------------------- |
    
    # ~ | -------------------------------------------------------------------------- |
    # ~ | VALIDE LA LICENCE SI BESOIN
    # ~ | -------------------------------------------------------------------------- |
    #$license = $updates | Where {$_.RequiresLicenseAgreementAcceptance}
    #if ($license) {
    #    $license | Select Title
    #	$license | ForEach {$_.AcceptLicenseAgreement()}
    #}
    # ~ | -------------------------------------------------------------------------- |
    
    # ~ | -------------------------------------------------------------------------- |
    # ~ | APPROBATION DES MISES A JOUR
    # ~ | -------------------------------------------------------------------------- |
    foreach($update in $updates){
    if($update.State -ne "NotNeeded"){            
    # ~ | Si la mise à jour est approuvée dans "Postes_Test"
    	if ($update.GetUpdateApprovals($PC_TST).Count -ne 0) { 
    # ~ | Et que cette mise à jour n'est pas approuvée dans "Poste_Test_Phase2"
    		if ($update.GetUpdateApprovals($PC_TST2).Count -eq 0){		{
    # ~ | Alors on l'approuve pour "Postes_Test_Phases2"
    			#$update.Approve('install',$PC_TST2) 
                $update.Title >> ('C:\temp\'+$date+'_WSUS Test2.txt')
    		}
    }
    }
    }
    }
    # ~ | -------------------------------------------------------------------------- |

    Je l'ai adapter à mon environnement. Le problème c'est qu'à chaque exécution il approuve a chaque fois toutes les mises à jour (soit en test, soit en test ou en prod) Le problème est que j'ai besoin d'un fichier de log, permettant de savoir les mise à jour approuvée en TEST, TEST2 et en PROD.

    Pour logger c'elle envoyé en TEST, j'y arrive avec un "$updatescope". Mais pas pour le TEST2 et la PROD.

    Pour le TEST, je filtre comme ceci : 

    updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
    $updatescope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::NotApproved
    $updatescope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::NotInstalled

    Mais pour le TEST2 et PROD je ne sais pas comment sortir seulement les mises à jour approuvées dernièrement et pas toutes les mise à jour présente sur TEST2 ou PROD.

    Merci de votre aide.

    mardi 22 décembre 2015 03:50