Flash info

"Problems cannot be solved by the same level of thinking that created them."

- Albert Einstein
 
Accueil arrow Forum

Bienvenue sur le forum PowerShell-Scripting.com

 
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Traiter les informations récupérées dans un script - 21/07/19 16:56 Bonjour,

Je suis novice dans powershell mais je souhaite m'améliorer !
Lorsque je fais un script façon "oneshot" ou l'exécution de ligne de codes les unes après les autres, tout se passe bien.

Toutefois, on m'a demandé de faire un audit AD, et je me retrouve confronté à un nouveau problème :
Comment traiter les données que j'ai récupéré ?
Je ne vois pas du tout comment je dois gérer la sortie de ces infos.
Je ne cherche pas à faire quelque chose de complexe et la sortie vers un fichier texte me suffira dans un premier temps (le HTML sera pour plus tard).

Je ne pense pas que la bonne méthode soit celle que j'ai employée :

Code:

 #membres des groupes administrateurs write-output "Membres des groupes avec privilèges" out-file $file -Append write-output "Membres du groupe Administrateurs de l'entreprise" Get-ADGroupMember -Identity "Administrateurs de l’entreprise" -Recursive fl name $forest.domains | ForEach-Object {      write-output "Domaine $_"     write-output "Membres du groupe Admins du domaine"     Get-ADGroupMember -Identity "Admins du domaine" -Recursive fl name } | out-file $file -Append #Tous les DC et les OS associés write-output "Tous les DC de la forêt et l'OS associé" out-file $file -Append $allDC $domainName | foreach-object {      write-output "Domaine $_"     Get-ADDomainController -Filter * -Server $_ ft hostname,operatingsystem } | Out-File $file -Append



J'aimerais bien qu'on m'explique ce qui ne va pas dans ma manière de faire et quelles sont mes possibilitées pour arriver à mon but !
Merci par avance

Message édité par: matteu, à: 21/07/19 16:57
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 22/07/19 13:52 Salut,
matteu écrit:

Comment traiter les données que j'ai récupéré ?

Cela dépend du traitement qui suit la récupération, créer un rapport uniquement et/ou filtrer/valider les données.
Ensuite cela dépend de la volumétrie, s'agit-il de qq centaines,milliers ou dizaines de milliers d'objets ?
matteu écrit:

Je ne pense pas que la bonne méthode soit celle que j'ai employée

Elle te renvoie une information, mais ton traitement couple la récupération des données et son formatage, tu devrais avoir, schématiquement,Get-MesDonnées ET Format-MesDonnées.

Mais sans connaitre les spécifications difficile de proposer qq chose.
Je pourrais te diriger sur cet outil de mise en forme, mais si tu débutes ce n'est peut pas le mieux. En tout cas il permet de choisir une ou + mise en forme ( Word,PDf,Html) à partir d'une seule source données.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 22/07/19 14:13 Bonjour et merci pour ton retour !

Cela sera un rapport pour faire un audit donc juste un état des lieu.

Je ne souhaite pas dans une V1 avoir des fonctions "intelligentes" du style : Si j'ai la valeur 1 alors c'est conforme, si j'ai la valeur 2 alors c'est non conforme.
Je souhaite prendre le soin d'être juge arbitre la dessus pour l'instant.

Je dirai donc que c'est juste à des fin de rapport.

Concernant la volumétrie, cela dépendra malheureusement du client...Mais ce sera entre plusieurs centaines et plusieurs miliers d'objet.
Dans le cas précis, c'est pour un hopital.

Pour la seconde partie de ta réponse, je crois que justement j'ai corrigé cela en ayant modifié le script pour avoir une partie ou je récupère les infos, et une partie ou je gère leur sortie (ce qui s'appelle le formatage si j'ai bien compris ? ).

Ce qui ressemble à ça :

Code:

 #Forêts AD avec ses domaines $forest=get-adforest $forestName=$forest.Name $domainName=$forest.domains #membres des groupes administrateurs $EnterpriseAdminsMember=(Get-ADGroupMember -Identity "Administrateurs de l’entreprise" -Recursive).name $DomainsAdminsMember=$domainName | foreach {write-output "Domaine : $_ ";(Get-ADGroupMember -Identity "Admins du domaine" -Recursive).name} ####Traitement de sortie ##Nom de la forêt et du domaine et Roles FSMO et niveaux fonctionnels Write-Output "Nom de la forêt : $forestname" out-file $file -Append  Write-Output "Nom des domaines : $domainName" out-file $file -Append  #membres des groupes administrateurs write-output "Membres des groupes avec privilèges" out-file $file -Append write-output "Membres du groupe Administrateurs de l'entreprise" out-file $file -Append $EnterpriseAdminsMember out-file $file -Append



Dans un premier temps, je souhaite vraiment me limiter au txt. Je sais que ce n'est pas le format le meilleur mais j'aurai pas le temps de faire mieux je pense.
Mon but n'étant pas qu'on me mache le travail non plus mais que j'apprenne en ayant des conseils.

Le soucis de l'export vers du .txt est que je vais devoir ensuite faire du copier coller dans word et que ce n'est pas possible de faire ça rapidement et proprement...
Donc je voudrais finir ma V1 au plus vite pour ensuite être en mesure de faire un export HTML. Je pourrais alors faire du copier coller de HTML vers word tout en gardant la mise en forme des tableau etc...
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 22/07/19 17:43 matteu écrit:
ce qui s'appelle le formatage si j'ai bien compris ?

Pour ce cas oui, mais en conception on parle plus de couplage (cf. Inconvénients d'un couplage fort)
matteu écrit:

Donc je voudrais finir ma V1 au plus vite pour ensuite être en mesure de faire un export HTML.

Dans ce cas regarde ce module, niveau vitesse ça devrait coller
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 22/07/19 20:03 Merci pour la réponse.

Je pense avoir compris pourquoi c'est pas bien de faire la récupération des données + son traitement en même temps du coup

Le bout de code que j'ai mis est donc la façon de faire c'est bien ça ?
1) Récupération des information
2) Formatage

Je me posais une question également, c'est que dans mon script à de nombreux momnent, je parcours tous les domaines de mon environnement pour récupérer 1 information.
Ex : Les roles FSMO , les OS des DC, les membres des groupes AD , ...
En terme d'optimisation de temps de traitement de script, je suppose que cela serait beaucoup mieux de récupérer toutes ces informations en 1 fois non ?
Sauf que cela rend plus complexe la lecture et surtout un objet qui contiendrait un peu tout et n'importe quoi...
Qu'est ce qu'il est recommandé de faire ?

Voici un exemple ou je séparre 2 récupération d'informations qui nécessitent toutes les deux de boucler au niveau des domaines

Code:

  #Réplication FRS ou DFS-R pour les GPO $GPOreplication =@() $domainName| ForEach-Object {      $DFSRFlags=(Get-ADObject -identity "CN=DFSR-GlobalSettings,$((Get-ADDomain).systemscontainer)" -properties msDFSR-Flags).'msDFSR-Flags'     if ($DFSRFlags -eq 48)     {         $temp="$_ : DFSR"     }     else     {         $temp="$_ : FRS"     }     $GPOreplication+=$temp } #Taille du dossier SYSVOL en KB  $SYSVOLSize=$domainName| ForEach-Object {     $syssize=(get-childitem "\\$_\sysvol" -recurse Measure-Object -property Length -Sum).sum 1KB     [PSCustomObject]@{         Domain $_         SYSVOLSize $syssize     } } 



PS : Au passage, quand je renvoie dans un texte $sysvolsize via la commande
$SYSVOLSize | out-file $file -Append
Je sais pas pourquoi, mais il m'affiche le domaine correctement à gauche mais la taille est complètement à droite de mon fichier texte. Je ne la vois pas lorsque j'ouvre le document. Je remarque que dans la console, c'est la même chose. Domaine est à gauche et SYSVOLSize est complètement à droite. Je n'ai pourtant demander aucun traitement de ce type.

Voici une image pour imager ça !





Merci d'avance pour le retour.

Message édité par: matteu, à: 23/07/19 07:43

Message édité par: matteu, à: 23/07/19 07:44
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 23/07/19 09:57 matteu écrit:

Le bout de code que j'ai mis est donc la façon de faire c'est bien ça ?
1) Récupération des information
2) Formatage

La présence de ces deux étapes permet de relire et de modifier plus facilement le script.
Ecrire un gros paquet de code où tout est dans tout ça marche aussi, mais c'est bien plus difficile à maintenir.

matteu écrit:

En terme d'optimisation de temps de traitement de script, je suppose que cela serait beaucoup mieux de récupérer
toutes ces informations en 1 fois non ?

Oui, et si un domaine est injoignable tu as une seule erreur et pas une par type d'objet récupéré, mais là c'est de la gestion d'erreur qui est un autre point important.
matteu écrit:

Sauf que cela rend plus complexe la lecture et surtout un objet qui contiendrait un peu tout et n'importe quoi...

Complexe non je ne pense pas, quant à la structure de données c'est toi qui lui donne du sens.
matteu écrit:

Qu'est ce qu'il est recommandé de faire ?

Ici tu peux regarder une hashtable ou un tableau de domaine pointant vers une hashtable et chacune pouvant imbriquer une autre structure.
Ensuite c'est la volumétrie qui importe pour savoir quelle solution est la plus approprié, ce n'est pas évident de proposer qq chose sans avoir les specs sous les yeux.
Note : j'ai eu dernièrement à gérer 475.000 objets fichier sérialisé dans un tableau qui occupe 11 Go de ram, ce n'est pas la bonne approche

Ici aussi tu devrais avoir un découplage entre la recherche des données et leurs enregistrement car si ton choix d'origine ne convient pas, les modif seront plus facile.
Mais on ne réfléchi pas dans la vitesse, pour ta v2 peut être

Evite ceci :
Code:

  $GPOreplication+=$temp


Utilise un Arraylist ou une liste générique.Le pourquoi.

matteu écrit:

Je sais pas pourquoi, mais il m'affiche le domaine correctement à gauche mais la taille est complètement à droite de mon fichier texte. Je ne la vois pas lorsque j'ouvre le document. Je remarque que dans la console, c'est la même chose. Domaine est à gauche et SYSVOLSize est complètement à droite. Je n'ai pourtant demander aucun traitement de ce type.

Peut-être que le rendu diffère entre une propriété de type string et une de type entier. Là c'est le système de formatage de Powershell qui entre en jeu.
Si tu passes par du texte tu ne peux faire autrement à moins de modifier le rendu de tes objets personnalisés, enfin c'est à vérifier.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 23/07/19 10:36 Bonjour et merci encore pour ces explications

Je comprends très bien pour le côté maintenance.

Idéalement, il faudra donc que pour ma V2 je réfléchisse à "factoriser" ce qui peut l'être.
En effet, il n'y a aucune gestion d'erreur dans mon script. Je verrai ca en v2 ou v3.

C'est exact, il faut que je regarde un peu mieux comment insérer un objet dans une hashtable pour la V2 car je pense partir la dessus. Le but sera d'avoir un objet qui ait du "sens" je cherche pas a avoir un objet qui mélangerait par exemple le niveau fonctionnel du domaine avec la taille du sysvol. Donc il faudra que je crée plusieurs objet dans ma boucle. Je testerai à ce moment là !
Un script qui remplit la hashtable qui contiendrait tous les éléments que je souhaite. Et lors du formatage des données, je pioche ce que je veux dans ma hashtable.

Qu'est ce que tu veux dire par la recherche des données et leur récupération? A quuoi correspondraient ces éléments dans mon script ?

C'est bon à savoir pour l'arraylist je l'ignorais completement Du coup, on oublie les array et on fait que des arraylist ^^ ?
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 23/07/19 12:01 matteu écrit:

Qu'est ce que tu veux dire par la recherche des données et leur récupération?

Recherche et enregistrement, un exemple approchant. Si je veux modifier le mode de persistance de données le code est plus facile à modifier.
matteu écrit:

Du coup, on oublie les array et on fait que des arraylist ^^ ?

C'est une bonne pratique à adopter. Ensuite si tu sais qu'un traitement unitaire manipulera tjr 10 objets, un array est acceptable.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 23/07/19 12:51 Je suis désolé mais je ne suis pas du tout développeur à la base. Je suis plutot orienté système et j'ai du mal à comprendre certains termes comme cette phrase :

Si je veux modifier le mode de persistance de données le code est plus facile à modifier.

C'est quoi qu'on appelle "mode de persistance ?"

Dans le lien que tu cite comme exemple, je ne vois à aucun moment de write-output par exemple donc en effet, je suis très loin du résultat...
Ce que je vais faire, c'est terminer mon script. Cela me permettra de venir le poste ensuite pour avoir des commentaires sur les points à améliorer !
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 23/07/19 17:15 matteu écrit:
Je suis plutot orienté système et j'ai du mal à comprendre certains termes comme cette phrase

Désolé, le terme persistance est lié à l'enregistrement des données.
Mais oublie dans ton cas.
matteu écrit:

je ne vois à aucun moment de write-output par exemple

La fonction WriteDatas appelle en interne Set-Content, si je veux modifier la manière d'enregistrer, je modifie cette fonction sans modifier le code de la fonction qui appelle WriteDatas.
Ici aussi oublie
matteu écrit:

donc en effet, je suis très loin du résultat...

Non, je n'ai pas la même approche et c'est mes explications qui t'éloignent du résultat.
Dans qq mois tu y verras + clair
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 23/07/19 18:36 Tu n'as aucune raison de t'excuser
C'est moi qui apprends...

Je ne pourrai malheureusement pas pratiquer du powershell tous les jours car mon travail ne me le permettra pas

Je veux apprendre un peu trop vite et c'est pour ca que je m'éparpille malheureusement...
Je remarque toutefois que dans de nombreux script il n'y a pas de write-output.

Les personnes arrivent à se débrouiller pour ne récupérer que des objets à retourner en tant que résultat de traitement. Il faut que je regarde un peu plus de script fait en powershell pour mieux cerner cette partie.
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 24/07/19 11:33 matteu écrit:

Je remarque toutefois que dans de nombreux script il n'y a pas de write-output.

Write-Host écrit sur l'écran uniquement, i.e. la console. Write-Output écrit dans le pipeline, donc par défaut le résultat est affiché à l'écran, sauf si on récupère le résultat d'un traitement dans une variable.

Ensuite dans une fonction/script, Powershell émet par défaut son résultat dans le pipeline, il n'est pas nécessaire de préciser Write-output ni return. Mais pour la maintenance il est préférable de préciser l'intention en utilisant Write-output ou return, ainsi le lecteur peut ne pas connaitre ce comportement par défaut et comprendre le fonctionnment.

Enfin la différence entre return et write-output est que return est "une rupture de séquence" (un Goto), on quitte la fonction ou le script, alors que write-output continue l'exécution.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 26/07/19 07:34 Ce que j'entendais par write output étant la façon dont j'affiche les données dans mon cas à la fin.
EX:

Write-Output "Nom de la forêt : $forestname" | out-file $file -Append
Write-Output "Nom des domaines : $domainName" | out-file $file -Append

Write-Output "Niveau Fonctionnel de la forêt : $($forest.ForestMode)" | out-file $file -Append
Write-Output "Version du schéma : $SchemaVersion" | out-file $file -Append

Write-Output "Maitre de schéma : $($forest.schemamaster)" | out-file $file -Append
Write-Output "Maitre de nom de domaine : $($forest.domainnamingmaster)" | out-file $file -Append

Mais bon, en même temps, le format de sortie qui devrait être utilisé est le html donc lexte est écrit entre balise html dans le script que j'ai pu récupérer.

Aller, je tente de finir ma V1 pour la semaine prochaine maxi comme ca je peux le poster ici et avoir des conseils sur comment organiser mieux ca ensuite (il y aura beaucoup de modification à apporter je pense....)
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 26/07/19 09:26 matteu écrit:

Write-Output "Nom de la forêt : $forestname" | out-file $file -Append

Ici l'appel à Write-Output est redondant.
On peut aussi écrire comme ceci et éviter l'usage du pipeline :
Code:

 out-file -InputObject "Nom de la forêt : $forestname"  -Filepath $file -Append 

Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 30/07/19 07:47 Merci pour ce retour.

J'avais lu qu'il faut éviter d'utiliser le pipeline lorsque c'est possible car les temps de traitements sont souvent plus long. Tu peux me confirmer ça ?

Je vais ouvrir un nouveau sujet j'ai quasi fini ma V1.
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5645
graph
Karma: 206  
Re:Traiter les informations récupérées dans un script - 30/07/19 18:01 matteu écrit:
Tu peux me confirmer ça ?

Pour moi, la réponse ici, n'est pas tjr oui,cela dépend.
Pour les itérations c'est certains. Mais on peut aussi avoir l'optimisation de l'optimisation.
Le pipeline est plus long car il effectue plus de contrôles. C'est aussi un choix d'en avoir moins, ce peut être aux développeurs de les faire.

L'autre intérêt sans pipeline ( ou du moins à outrance) est que la maintenance est plus facile .
Il y a aussi qq fois où le pipeline a été optimisé dans la dernière version (V7). Ce n'est pas tjr dû à la conception du pipeline mais à son implémentation.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
matteu
Utilisateur

PowerShelleur Débutant
Messages: 12
graphgraph
Karma: 0  
Re:Traiter les informations récupérées dans un script - 31/07/19 16:01 Très bien.

Je te remercie pour la qualité de tes réponse tout au long de ce post.
  | | L'administrateur a désactivé l'accés public en écriture.
© 2019 PowerShell-Scripting.com