Question A propos du script Get-Audit

Plus d'informations
il y a 16 ans 2 mois #5986 par Olivier
Réponse de Olivier sur le sujet Re:A propos du script Get-Audit
En fait, à chaques lancement, il faudrait pouvoir mettre à jour les fichier PingKO et PingOK et ce, jusqu'à ce que le fichier PingKO soit vide ... j'ai mis un test
[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 ...:lol:
Sitôt que je remet le tout en fonction, vais tester tout ça avec mon Hyper-V qui va si bien :-)<br><br>Message édité par: Olivier, à: 18/01/10 17:57

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

Plus d'informations
il y a 16 ans 2 mois #5989 par Laurent Dardenne
Olivier écrit:

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

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.

\&quot;on recommence un inventaire\&quot; : 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é :lol:

Une solution :
[code:1]
#Test de noms de machine
@\&quot;
pc1
pc2
pc3
pc4
pc5
pc6
\&quot;@ &gt; machines.txt

@\&quot;
pc2
pc3
\&quot;@ &gt; PingOK.txt

@\&quot;
pc1
pc4
pc5
\&quot;@ &gt; PingKO.txt


Function Ping-AuditComputerOnLine([string[]] $ComputerName, [switch] $Continuous)
{
#todo cas d'erreur :
# ParcMachines -ne $null -&gt; exception
# ParcMachines[n] -ne $null or empty -&gt; Write-Error
# Si -Reprise on suppose que les 2 fichiers txt existe sinon Erreur

#$FileNames=@(\&quot;D:\Windows\PowerShell\Scripts\PingKO.txt\&quot;,\&quot;D:\Windows\PowerShell\Scripts\PingOK.txt\&quot;«»)

#*** Les noms de fichier sont ordonnés.
$FileNames=@(\&quot;PingKO.txt\&quot;,\&quot;PingOK.txt\&quot;«»)

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 \&quot;Reprise ineffective, toutes les machines ont été inventoriées.\&quot;;
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 \&quot;Reprise avec les machines trouvées.\&quot;
}
else
{ Write-Debug \&quot;Reprise avec la liste complète des machines du parc.\&quot; }

Write-Warning \&quot;Reprise pour les machines suivantes :`r`n$ComputerName\&quot;
#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 \&quot;Traite $($ComputerName.count) machines.\&quot;

#On teste la connection des machines
ForEach($Computer In $ComputerName)
{
$Result=(Test-Connection $Computer -ErrorAction \&quot;SilentlyContinue\&quot; -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 \&quot;Stations en ligne : \&quot; (gc $FileNames[$Correct])
Write-Host \&quot;Stations hors ligne : $MachinesEnErreur\&quot;
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 \&quot;machines.txt\&quot;«»)

While (!$Complete)
{
#continue l'inventaire
$Complete=Ping-AuditComputerOnLine (Get-Content \&quot;machines.txt\&quot;«») -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=\&quot;Pressez une touche pour continuer...\&quot;«»)
Write-Host -NoNewLine $Message
$null = $Host.UI.RawUI.ReadKey(\&quot;NoEcho,IncludeKeyDown\&quot;«»)
Write-Host \&quot;\&quot;
}
[/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.

Plus d'informations
il y a 16 ans 2 mois #5993 par Olivier
Réponse de Olivier sur le sujet Re:A propos du script Get-Audit
Salut !

Merci beaucoup pour ton intérêt à mon \&quot;cas\&quot; :)

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 \&quot;V1.0\&quot; ... 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.

Plus d'informations
il y a 16 ans 2 mois #5994 par Laurent Dardenne
Salut,
Olivier écrit:

Merci beaucoup pour ton intérêt à mon \&quot;cas\&quot; :)

C'est en forgeant qu'on devient forgeron...
Olivier écrit:

mais tout d'un coup j'ai un doute par rapport au nom du répertoire \&quot;V1.0\&quot; ...

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.
Olivier écrit:

Vu que la commande Test-Connexion est fournie que depuis la version 2 (Si je me trompe pas ...) ben je pense avoir la 2 ...

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.
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 \&quot;mécanisme de plugin\&quot; :
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 \&quot;From\&quot;
#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 \&quot;Information\&quot;|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.

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