Question Fontion filtre

Plus d'informations
il y a 17 ans 1 mois #4089 par Texier
Fontion filtre a été créé par Texier
Bonjour à tous,

Voilà ... j'en ai assez des rapports détaillés WSUS, qui ne sont pas super détaillés en fait.
J'ai récupéré et amélioré le script ci-dessous :

[code:1][reflection.assembly]::LoadWithPartialName(\"Microsoft.UpdateServices.Administration\"«») | out-null
if (!$wsus) {
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer(\"serveur\",\"\",8530);
}

$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.UpdateApprovalActions = [Microsoft.UpdateServices.Administration.UpdateApprovalActions]::Install `
-bor [Microsoft.UpdateServices.Administration.UpdateApprovalActions]::Uninstall

$wsus.GetUpdates($updateScope) | foreach {
$update = $_ #$_ is a shorthand variable for the current item in a loop
\"
\"
\"Update: \" + $update.Title
\"Update Id: \" + $update.Id.UpdateId
\"Arrival time : \" + $update.CreationDate
\"
\"

$wsus.GetComputerTargetGroups() | foreach {
$group = $_

if ($update.GetUpdateApprovals($group).Count -ne 0)
{
#`t is equivalent to \t in C#/C++
\"`t Computer Group: \" + $group.Name
\"`t ComputerTargetGroupId: \" + $group.Id
\"`t Approval action: \" + $update.GetUpdateApprovals($group)[0].Action
\"`t Approval time: \" + $update.GetUpdateApprovals($group)[0].Golivetime
\"`t Expiration date: \" + $update.GetUpdateApprovals($group)[0].Deadline
\"`t Etat mise à jour: \" + $update.GetUpdateApprovals($group)[0].state
\"`t Applied By: \" + $update.GetUpdateApprovals($group)[0].AdministratorName

$summary = $update.GetSummaryForComputerTargetGroup($group)

\"`t Installed:\" + ($Summary.InstalledCount + $summary.NotApplicableCount)

$neededCount = ($summary.InstalledPendingRebootCount + $summary.NotInstalledCount)
if ($neededCount -gt 0)
{
Write-Host (\"`t Needed: $neededCount\"«») -foregroundColor Yellow -backgroundColor black
} else {
\"`t Needed: $neededCount\"
}

if ($summary.FailedCount -gt 0)
{
Write-Host (\"`t Failed: \" + $summary.FailedCount) -foregroundColor Red -backgroundColor black
} else {
\"`t Failed: \" + $summary.FailedCount
}

\"`t Unknown: \" + $summary.UnknownCount
\"`t
\"
}
}
\"
\"
} [/code:1]

Ce script liste tout les groupes d'ordinateurs et toutes les KB sur le serveur.
Son execution est assez longue et j'ai essayé d'appliquer un filtre pour ne prendre qu'une KB spécifique. Sans grand résultat ...

Donc pour résumer, je cherche à éxécuter ce script en cherchant des termes spécifiques
exemple :

[code:1]$wsus.GetUpdates($updateScope) | foreach {
$update = $_ #$_ is a shorthand variable for the current item in a loop
where ($update.title -contains \"kb958644\"«»)
[/code:1]

Je débute en powershell et malgré tout mes essais ... je ne trouve pas mon bonheur.

Vos suggestions sont les bienvenues.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 1 mois #4093 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Fontion filtre
Salut,
TooWiLLS écrit:

cherchant des termes spécifiques
exemple :

[code:1]$wsus.GetUpdates($updateScope) | foreach {
$update = $_ #$_ is a shorthand variable for the current item in a loop
where ($update.title -contains \"kb958644\"«»)
[/code:1]

Je ne connais pas ces classes mais celle nommée, UpdateScope me semble contenir des propriétées déclarant des filtres.
Je regarderais déjà de ce coté, car si ton traitement est long, il l'est, il me semble, sur le premier segment du pipeline $wsus.GetUpdates. Le filtre doit donc se faire en amont.

Avant de modifier ce script il te faut étudier la classe UpdateScope directement dans la console PS.
Ensuite une fois trouvé les propriétés à renseigner, il faudra ajouter leurs prise en charge dans ce script.

Si tu as besoin d'aide n'hésite pas.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 1 mois #4094 par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Fontion filtre
A priori c'est juste la syntaxe de ton filtre qui est incorrecte. Tu n'as pas besoin de faire un foreach {...}, utilise directement where à la place :

[code:1]
$wsus.GetUpdates($updateScope) | where {$_.title -contains \"kb958644\"«»)
[/code:1]
Le code ci-dessus va lancer la méthode GetUpdates et filtrer tous ses résultats pour ne laisser passer que ceux qui répondent au critère, c'est-à-dire ceux pour lesquels l'expression qui suit la clause where retourne un résultat non nul.

Mais si ce script va simplifier l'affichage des résultats, il ne devrait pas améliorer sensiblement les performances de ton script. En effet, la clause where ne fait que filtrer les résultats déjà produits, mais elle n'empêche pas la commande qui est en amont de produire tous les résultats (en l'occurence l'inventaire de toutes les mises à jour).

Malheureusement le script ne fait qu'enrober l'utilisation d'une méthode \"toute faite\" produite par le serveur WSUS. Ton seul espoir sera alors de voir si cette méthode propose un paramètre supplémentaire permettant d'appliquer un filtre sur les updates à renvoyer de manière à ne faire qu'un inventaire partiel.

Janel

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.097 secondes
Propulsé par Kunena