May 22 2011

Powershell: WSUS réaliser un inventaire de conformité

Dans cet article nous allons réaliser un inventaire de conformité WSUS des ordinateurs de votre domaine. Les machines qui peuvent recevoir des patchs de sécurité Microsoft doivent avoir une version d’OS et de Service Pack minimale, ci-dessous un tableau récapitulatif des versions de Windows supportées:

Nous allons considérer que le SP1 de Windows Vista n’est plus supporté, car le support MS se termine le  12 juillet 2011. Dans un premier temps nous allons donc inventorier avec Powershell les machines qui ne peuvent plus recevoir des patchs de sécurité du fait de leur obsolescence, ceci en s’inspirant de cet article de AskDS.

$base = 'OU=Servers,DC=ldap389,DC=info'
$d = [DateTime]::Today.AddDays(-30)
 
$computers = Get-ADComputer -Filter 'PasswordLastSet -ge $d' -Searchbase $base -Properties OperatingSystemVersion,OperatingSystemServicePack,dNSHostName,OperatingSystem
 
foreach($computer in $computers) {
 
if (($computer.OperatingSystemVersion -lt "5.1") -or (($computer.OperatingSystemVersion -like "5.1*") -and ($computer.OperatingSystemServicePack -ne "Service Pack 3")) -or (($computer.OperatingSystemVersion -like "5.2*") -and ($computer.OperatingSystemServicePack -ne "Service Pack 2")) -or (($computer.OperatingSystemVersion -like "6.0*") -and ($computer.OperatingSystemServicePack -ne "Service Pack 2")))
{$computer.Name + ';' + $computer.OperatingSystem + ';' + $computer.OperatingSystemServicePack  | Out-file NOK-OSVersion.csv -append}
}

Nous cherchons donc les machines actives, i.e. qui ont renouvelé leur mot de passe avec un DC au cours des 30 derniers jours, situées dans l’OU “Servers” et dont la version d’OS et de Service Pack n’est plus supportée par Microsoft. Ces machines listés dans le fichier NOK-OSVersion.csv ne peuvent plus recevoir des mises à jour de sécurité via WSUS, il faudra les mettre à jour.

Nous allons dans un second temps chercher les machines qui sont éligibles à recevoir des mises à jour mais qui ne remontent pas dans votre serveur WSUS. Il existe alors un problème au niveau du client WSUS de la machine où celui ci n’est pas configuré et elles téléchargent directement les patchs de sécurité sur Internet, ce qui n’est pas conseillé dans un environnement d’entreprise, car vous n’avez aucun contrôle quant à leur déploiement.

A partir de WSUS 3.0 SP2 il est possible d’utiliser PowerShell pour gérer vos mises à jour comme nous montre ce tutoriel de Boe Prox, ceci à l’aide du Namespace Microsoft.UpdateServices.Administration. Nous allons donc lister toutes les machines contenues dans nos groupes WSUS (sauf le groupe All Computers qui est un groupe qui contient au fait tous les groupes) et les comparer aux ordinateurs issus de notre requête faite sur l’annuaire Active Directory ($computer):

$wsusserver = "WSUS-server"
 
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($wsusserver,$False)
$groups = $wsus.GetComputerTargetGroups()
 
foreach($group in $groups) {
if ($group.Name -ne "All Computers"){
($wsus.getcomputertargetgroup($group.Id)).GetComputerTargets() |%{if ($_.FullDomainName -eq $computer.dNSHostName){ ....}}
}
}

Le FQDN de la machine est la clef commune entre l’objet ordinateur sous WSUS (attribut FullDomainName) et celui sous Active Directory (attribut DNSHostName). Les objets dont le matching est trouvé seront inscrits dans un fichier $file portant le nom du groupe WSUS auxquels ils appartiennent. Les ordinateurs pour lesquels il n’y a pas de matching, qui donc ne sont pas remontés sur votre serveur WSUS, sont indiqués dans un fichier NOK-wsus.csv. Pour ces derniers il faudra donc voir si vous les avez configurés pour pointer sur votre serveur WSUS, ou si le client WSUS a un problème.

Pour télécharger le script complet c’est ici:

Il vous faudra modifier les variables suivantes:

  • $wsusserver: Nom de votre serveur WSUS.
  • $base: DistingushedName de la base de vôtre recherche sur l’annuaire AD.

 

This post is also available in: Anglais

3 Comments

  • By Vincent, May 26, 2011 @ 11:54 am

    Bonjour,

    J’ai essayer une partie de votre script sur mon serveur WSUS (Win srv 2008 Std | WSUS 3 SP2) mais j’obtiens un erreur.

    Voici le script :
    $wsusserver = “SVM004”

    [void][reflection.assembly]::LoadWithPartialName(“Microsoft.UpdateServices.Administration”)
    $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($wsusserver,$False)
    $groups = $wsus.GetComputerTargetGroups()

    Et le Message d’erreur :

    PS C:\Scripts> .\test1.ps1
    Exception lors de l’appel de « GetUpdateServer » avec « 2 » argument(s) : « Une exception a été levée par l’initialiseu
    r de type pour ‘Microsoft.UpdateServices.Internal.Constants’. »
    Au niveau de C:\Scripts\test1.ps1 : 4 Caractère : 78
    + $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer <<<< ($wsusserver,$False)
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

    Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
    Au niveau de C:\Scripts\test1.ps1 : 5 Caractère : 40
    + $groups = $wsus.GetComputerTargetGroups <<<< ()
    + CategoryInfo : InvalidOperation: (GetComputerTargetGroups:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Avez vous une idée de l'origine de ce message ?

    Merci d'avance,

    Vincent

  • By ldap389, May 31, 2011 @ 11:37 am

    Vu avec Vincent, le problème apparait si vous n’éxecutez pas votre script en tant qu’administrateur.

  • By Gerard, June 3, 2016 @ 12:29 pm

    Bonjour et merci pour ce bon tutoriel

Other Links to this Post

RSS feed for comments on this post. TrackBack URI

Leave a comment

*

WordPress Themes

Blossom Icon Set

Software Top Blogs