Question
Fontion filtre
- Texier
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
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.
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 1 mois #4093
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Fontion filtre
Salut,
TooWiLLS écrit:
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.
TooWiLLS écrit:
Je ne connais pas ces classes mais celle nommée, UpdateScope me semble contenir des propriétées déclarant des filtres.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 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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
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
[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.074 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Fontion filtre