Question A propos du script Get-Audit
- Olivier
- Hors Ligne
- Membre elite
-
- Messages : 182
- Remerciements reçus 0
[code:1](Get-content D:\Windows\PowerShell\Scripts\PingKO.txt).lenght -gt 0[/code:1]
Normalement si pas vide, ça continue le script mais si vide, ben on recommence un inventaire Complet non pas sur la base de PingKO mais plutôt de Working
Pour ce qui est de la liste des machines (Working.txt ...), pour l'instant c'est qu'un simple fichier texte remplis à la main mais vais mettre une fonction pour extraire les stations et serveurs d'un domaine AD ... ça va venir
Pour l'instant, l'un de mes PC est en traitement médical et attend de nouveaux organes de son médecin ...
Sitôt que je remet le tout en fonction, vais tester tout ça avec mon Hyper-V qui va si bien
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Si je comprend bien, ici il n'est plus question de reprise sur erreur-crash, ce à quoi je pensais, mais de continuer l'inventaire sur les machines restantes qui pour une raison ou pour une autre n'ont pas été inventoriées.En fait, à chaques lancement, il faudrait pouvoir mettre à jour les fichier PingKO et PingOK et ce, jusqu'à ce que le fichier PingKO soit vide ...
Normalement si pas vide, ça continue le script mais si vide, ben on recommence un inventaire Complet non pas sur la base de PingKO mais plutôt de Working
\"on recommence un inventaire\" : on connait le critère de déclenchement mais qui prend cette décision ?
A mon avis un autre traitement doit déterminer si l'inventaire a été réalisé entiérement sur le parc ou pas.
Et quand l'arrêter s'il est automatique ( halr9000.com/article/615 )?
De plus le rôle de ce traitement est de déterminer uniquement les machines offline ou online.
Sinon attention à ce code :
[code:1]
(Get-content D:\Windows\PowerShell\Scripts\PingKO.txt).lenght -gt 0)
#(@(Get-content D:\Windows\PowerShell\Scripts\PingKO.txt).lenght -gt 0)
[/code:1]
Le fichier peut contenir une ligne, dans ce cas gc renvoit un scalaire et pas un tableau.
Après réflexion je me suis dit que ce type de traitement(A faire, fait, reste à faire) pourrait être réutilisé dans un autre contexte, du coup je suis resté accroché
Une solution :
[code:1]
#Test de noms de machine
@\"
pc1
pc2
pc3
pc4
pc5
pc6
\"@ > machines.txt
@\"
pc2
pc3
\"@ > PingOK.txt
@\"
pc1
pc4
pc5
\"@ > PingKO.txt
Function Ping-AuditComputerOnLine([string[]] $ComputerName, [switch] $Continuous)
{
#todo cas d'erreur :
# ParcMachines -ne $null -> exception
# ParcMachines[n] -ne $null or empty -> Write-Error
# Si -Reprise on suppose que les 2 fichiers txt existe sinon Erreur
#$FileNames=@(\"D:\Windows\PowerShell\Scripts\PingKO.txt\",\"D:\Windows\PowerShell\Scripts\PingOK.txt\"«»)
#*** Les noms de fichier sont ordonnés.
$FileNames=@(\"PingKO.txt\",\"PingOK.txt\"«»)
Set-Variable Erreur -value 0 -option Constant #$false pingKO
Set-Variable Correct -value 1 -option Constant #$true pingOK
if ($Continuous)
{ #Reconstruit la liste des machines
#GC renvoi $null si le fichier existe, mais est vide
[string[]] $MachinesTraitées=@(gc $Filenames[$Correct])
#Toutes les machines ont-elles été inventoriées?
if ($ComputerName.Count -eq $MachinesTraitées.Count)
{
Write-Debug \"Reprise ineffective, toutes les machines ont été inventoriées.\";
return $True #Oui, plus rien à faire
}
elseif ($MachinesTraitées.Count -gt 0)
{ #Détermine la liste des machines restantes à inventorier
$Max=[Math]::Max($ComputerName.count,$MachinesTraitées.count)
[string[]] $ComputerName=Compare-object $MachinesTraitées $ComputerName -Sync $Max | %{$_.InputObject}
Write-Debug \"Reprise avec les machines trouvées.\"
}
else
{ Write-Debug \"Reprise avec la liste complète des machines du parc.\" }
Write-Warning \"Reprise pour les machines suivantes :`r`n$ComputerName\"
#On efface la liste des machines en erreur
#On la reconstruit à partir des machines restantes à inventorier
$null=New-Item $FileNames[$Erreur] –type File -Force
}
else
{ #Début d'un nouvel inventaire : raz des fichiers d'historiques
$null=New-Item $FileNames –type File -Force
}
Write-Debug \"Traite $($ComputerName.count) machines.\"
#On teste la connection des machines
ForEach($Computer In $ComputerName)
{
$Result=(Test-Connection $Computer -ErrorAction \"SilentlyContinue\" -count 1).StatusCode -eq 0
#Le résultat booléen détermine le nom de fichier associé (via un cast) : $true=Correct $false=Erreur
$Computer| Out-File -Append $FileNames[$Result]
}#foreach $ComputerName
[string[]] $MachinesEnErreur=@(gc $FileNames[$Erreur])
Write-Host \"Stations en ligne : \" (gc $FileNames[$Correct])
Write-Host \"Stations hors ligne : $MachinesEnErreur\"
Return ($MachinesEnErreur.Count -eq 0) #Renvoi faux si le fichier contient au moins une ligne
} #Ping-AuditComputerOnLine
[/code:1]
Le traitement avec reprise :
[code:1]
#Nouvelle campagne d'audit
$Complete=Ping-AuditComputerOnLine (Get-Content \"machines.txt\"«»)
While (!$Complete)
{
#continue l'inventaire
$Complete=Ping-AuditComputerOnLine (Get-Content \"machines.txt\"«») -Continuous
pause
}
[/code:1]
J'ai testé, en local, qq cas sans rencontrer de pb, la pause permet de modifier les fichiers pour tester les cas + rapidement. Il reste qq cas d'erreur à implémenter pour avoir un traitement stable.
Si tu utilises la V2, il est possible de créer une fonction avancée pour la prise en charge du pipeline et placer + facilement des régles de validations.
[code:1]
function pause{
param($Message=\"Pressez une touche pour continuer...\"«»)
Write-Host -NoNewLine $Message
$null = $Host.UI.RawUI.ReadKey(\"NoEcho,IncludeKeyDown\"«»)
Write-Host \"\"
}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 19/01/10 13:57
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Olivier
- Hors Ligne
- Membre elite
-
- Messages : 182
- Remerciements reçus 0
Merci beaucoup pour ton intérêt à mon \"cas\"
Je vais tester tout ça et je reviens par là pour t'en donner un retour et le résultat des tests chez moi ...
Au fait, petite question à part, le chemin d'accès à Powershell sur mon Win 7 est :
C:\Windows\SysWOW64\WindowsPowerShell\v1.0
On dit partout que la version 2 est incluse nativement dans Windows 7 mais tout d'un coup j'ai un doute par rapport au nom du repertoir \"V1.0\" ... Vu que la commande Test-Connexion est fournie que depuis la version 2 (Si je me trompe pas ...) ben je pense avoir la 2 ...
Merci encore pour tout et à +
Olivier
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Olivier écrit:
C'est en forgeant qu'on devient forgeron...Merci beaucoup pour ton intérêt à mon \"cas\"
Olivier écrit:
Non, c'est normal, mais pas vraiment cohérent je suis d'accord avec toi. Même les assemblies ont les mêmes numéros de version mais pas les mêmes n° de fichier.mais tout d'un coup j'ai un doute par rapport au nom du répertoire \"V1.0\" ...
Olivier écrit:
Dans un précédent post je t'avais indiqué un script et je pensais qu'il portait le même nom, c'est la raison pour laquelle j'avais un doute.Vu que la commande Test-Connexion est fournie que depuis la version 2 (Si je me trompe pas ...) ben je pense avoir la 2 ...
Du coup ce sera + facile pour toi de coder cette gestion d'inventaire.
Il y a qq jours je suis tombé sur ce post du blog MS-PowerShell, James Brundage y propose une approche de développement de script basée sur un \"mécanisme de plugin\" :
blogs.msdn.com/powershell/archive/2008/1...t-commandplugin.aspx
La fonction avancée Get-CommandPlugin utilise les métadonnées (description des fonctions/cmdlets/scripts) pour exécuter un ensemble de commandes basées sur une signature commune :
[code:1]
#Affiche les plugins Get-CodeFromxxx
Get-CommandPlugin (gcm Get-Code) -preposition \"From\"
#La fonction Get-Code exécute les plugins précédent
Get-code blogs.msdn.com
[/code:1]
Et à la lecture de ton script ce qui manque, à mon avis, c'est de moduler ( en + ou en - ) les parties à inventorier.
Cette approche permettrai d'y répondre 'facilement', sous PS v2 c'est plus une question de conception/structuration du code qu'une question technique, puisque celle-ci est déjà réglée avec ce script,enfin sur ce point précis.
Une ébauche :
[code:1]
Get-AuditInformationComputerSystem $computerName
Get-AuditInformationOperatingSystem $computerName
Get-AuditInformationWin32_Timezone $computerName
Get-AuditInformationWin32_Keyboard $computerName
Get-AuditInformationWin32_ScheduledJob $computerName
Get-AuditInformationOSRecoveryConfiguration $computerName
Get-AuditDetailBootINI $Drive
...
Get-CommandPlugin (gcm Get-Audit) -preposition \"Information\"|Invoke-AuditPlugin...
...
[/code:1]
Bon, c'est à creuser, car je ne suis pas certains que cela soit une bonne idée applicable...
Peut être pour ta version 3 de ton Audit
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- A propos du script Get-Audit