Question
Optimisation d'un script
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 3 ans 3 mois #30326
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Optimisation d'un script
Un point important que j'ai oublié :
>>Si jamais tu as un peu de temps à consacrer à la lecture du script complet pour faire quelque remarque
Tu ne loggues pas les erreurs, c'est à dire que tout se passe bien tout le temps
Malheureusement (pour nous) une infra ça bouge et pas qu'un peu !
Donc ajouter une gestion d'erreur est adroit
>>Si jamais tu as un peu de temps à consacrer à la lecture du script complet pour faire quelque remarque
Tu ne loggues pas les erreurs, c'est à dire que tout se passe bien tout le temps
Malheureusement (pour nous) une infra ça bouge et pas qu'un peu !
Donc ajouter une gestion d'erreur est adroit
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Damien Commenge
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 4
il y a 3 ans 3 mois - il y a 3 ans 3 mois #30339
par Damien Commenge
Réponse de Damien Commenge sur le sujet Optimisation d'un script
Merci pour ton retour.
OK pour le niveau de log à conserver si besoin.
Pour la gestion des erreurs, faut que je prenne du temps dessus de toute façon, car actuellement je ne connais pas suffisament. Cela me permettra de répondre au dernier besoin que tu as exprimé
En terme de maintenance, il y a une chose qui ne me plait pas spécialement dans mon script, mais je vois pas trop comment faire différement.
Actuellement si je crée une fonction, je suis obligé de mettre à jour pas mal d'endroit pour l'intégrer dans mon fichier html de sortie. Cela est construit comme ça :
Déjà je pense que je pourrais peut être mettre directement dans le main
$xxx=Get-xxx -domain $domain | ConvertTo-Html -Fragment
Comme ca je peux m'enlever toute une partie "inutile" j'ai bien l'impression.
Je vais essayer de repasser sur chacune de mes fonctions pour mieux les documenter, et essayer de simplifier la lisibilité du code
OK pour le niveau de log à conserver si besoin.
Pour la gestion des erreurs, faut que je prenne du temps dessus de toute façon, car actuellement je ne connais pas suffisament. Cela me permettra de répondre au dernier besoin que tu as exprimé
En terme de maintenance, il y a une chose qui ne me plait pas spécialement dans mon script, mais je vois pas trop comment faire différement.
Actuellement si je crée une fonction, je suis obligé de mettre à jour pas mal d'endroit pour l'intégrer dans mon fichier html de sortie. Cela est construit comme ça :
function get-xxx {
traitement
}
$xxx=get-xxx | ConvertTo-Html -Fragment
Dans la fonction html je viens ajouter :
"<h3>xxx</h3>"
$xxx
et dans le "main" :
$xxx= Get-xxx -domain $domain
Déjà je pense que je pourrais peut être mettre directement dans le main
$xxx=Get-xxx -domain $domain | ConvertTo-Html -Fragment
Comme ca je peux m'enlever toute une partie "inutile" j'ai bien l'impression.
Je vais essayer de repasser sur chacune de mes fonctions pour mieux les documenter, et essayer de simplifier la lisibilité du code
Dernière édition: il y a 3 ans 3 mois par Damien Commenge.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 3 ans 3 mois #30340
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Optimisation d'un script
Hello Damien,
Je ne suis pas sûr de bien comprendre ton problème de fonction...
Car justement l'intérêt d'une fonction c'est de mettre à jour son contenu et ça s'arrête là.
Arnaud
Je ne suis pas sûr de bien comprendre ton problème de fonction...
Car justement l'intérêt d'une fonction c'est de mettre à jour son contenu et ça s'arrête là.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Damien Commenge
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 4
il y a 3 ans 3 mois - il y a 3 ans 3 mois #30341
par Damien Commenge
Réponse de Damien Commenge sur le sujet Optimisation d'un script
Bonjour et merci pour ton retour.
Actuellement, mon fichier est organisé comme ça :
fonction1
fonction2
fonction3
....
fonctionHTML
Stockage du résultat de mes fonction
resultFontion1=fonction1 -domain toto.lan
resultFontion2=fonction2 -domain toto.lan
....
Conversion des variables contenant le résultat des fonction vers du HTML
resultFonction1=resultFontion1 | convertto-html ...
resultFonction2=resultFontion2 | convertto-html ...
Et je vais ajouter dans ma fonction HTML l'emplacement ou je veux que resultfonction1 et 2 soient présent.
Encore une fois, je suis assez autodidacte la dessus, je me suis basé sur quelques exemple, et je n'utilise peut être pas la meilleure méthode.
Si tu as 5 minutes pour regarder mon script, tu vas peut être mieux comprendre ce que je veux dire et ca me permettrait de savoir si je fais quelque chose de "propre" ou pas.
Actuellement, mon fichier est organisé comme ça :
fonction1
fonction2
fonction3
....
fonctionHTML
Stockage du résultat de mes fonction
resultFontion1=fonction1 -domain toto.lan
resultFontion2=fonction2 -domain toto.lan
....
Conversion des variables contenant le résultat des fonction vers du HTML
resultFonction1=resultFontion1 | convertto-html ...
resultFonction2=resultFontion2 | convertto-html ...
Et je vais ajouter dans ma fonction HTML l'emplacement ou je veux que resultfonction1 et 2 soient présent.
Encore une fois, je suis assez autodidacte la dessus, je me suis basé sur quelques exemple, et je n'utilise peut être pas la meilleure méthode.
Si tu as 5 minutes pour regarder mon script, tu vas peut être mieux comprendre ce que je veux dire et ca me permettrait de savoir si je fais quelque chose de "propre" ou pas.
Dernière édition: il y a 3 ans 3 mois par Damien Commenge.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 3 ans 3 mois #30352
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Optimisation d'un script
Salut,
j'ai relu ton post, mais pour
J'ai beau relire ceci (tout en sachant que l'on parle ici de log) :
Et je vais ajouter dans ma fonction HTML l'emplacement où je veux que resultfonction1 et 2 soient présent,
,une reformulation ne serait pas de trop
j'ai relu ton post, mais pour
Sans vouloir t'offenser Il est préférable que tes propos précise ce que tu souhaites faire plutôt que d'interpréter du code.Damien Commenge écrit: Si tu as 5 minutes pour regarder mon script, tu vas peut être mieux comprendre ce que je veux dire
J'ai beau relire ceci (tout en sachant que l'on parle ici de log) :
Et je vais ajouter dans ma fonction HTML l'emplacement où je veux que resultfonction1 et 2 soient présent,
,une reformulation ne serait pas de trop
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Damien Commenge
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 4
il y a 3 ans 3 mois - il y a 3 ans 3 mois #30363
par Damien Commenge
Réponse de Damien Commenge sur le sujet Optimisation d'un script
Merci pour ton retour.
Je mets un exemple ci dessous qui est un extrait du script.
Il y a 2 fonctions:
Get-FirewallState qui permet de connaitre l'état du parefeu pour le profil public, privé et domaine.
Get-AllDChardware qui permet de connaitre le nombre de CPU, la quantité de RAM, si c'est un serveur physique ou virtuel, le système d'exploitation installé et la dernière fois que le serveur à démarré.
Les fonctions sont exécutés pour chaque domaine présents dans la forêt Active directory.
En espérant avoir tes remarques sur ce qui est bien / pas bien. Tout mon script est architecturé de cette façon au final...
Si je veux ajouter un traitement supplémentaire que je souhaite auditer, je crée une fonction, je stocke le résultat dans une variable, je modifie cette variable pour la convertir en html et j'ajoute dans la partie HTML cette nouvelle variable.
Je mets un exemple ci dessous qui est un extrait du script.
Il y a 2 fonctions:
Get-FirewallState qui permet de connaitre l'état du parefeu pour le profil public, privé et domaine.
Get-AllDChardware qui permet de connaitre le nombre de CPU, la quantité de RAM, si c'est un serveur physique ou virtuel, le système d'exploitation installé et la dernière fois que le serveur à démarré.
Les fonctions sont exécutés pour chaque domaine présents dans la forêt Active directory.
En espérant avoir tes remarques sur ce qui est bien / pas bien. Tout mon script est architecturé de cette façon au final...
Si je veux ajouter un traitement supplémentaire que je souhaite auditer, je crée une fonction, je stocke le résultat dans une variable, je modifie cette variable pour la convertir en html et j'ajoute dans la partie HTML cette nouvelle variable.
#region HTML style
$HTMLCSS=@'
<style>
table {
# border-collapse: collapse;
border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;
}
h2 {text-align:center}
th, td {
#padding: 8px;
#text-align: left;
#border-bottom: 1px solid #ddd;
border-width: 1px; padding: 3px; border-style: solid; border-color: black;
}
body {
font-family:"Vinci Sans Light";Font-Size:10pt
}
tr:hover{background-color:#f5f5f5}
</style>
'@
#Variable initialization
#$domainName = All forest domains
#$ReportPath = Path where script datas will be stored
#$date = Current date to format text and be sure they are unique
#$logfilename is file name for file contains script log for troubleshoot.
$domainName=(get-adforest).domains
$date = (get-date -Format "dd_MM_yyyy_HH_mm")
$ReportPath = "c:\temp\audit\$date"
$logFileName = "Logs.log"
#region firewall state
#Get status of firewall for all profiles (domain, private, public) in all DC
Function Get-FirewallState
{
param (
[string]$domain
)
Write-EZLog -Category INF -Message "### Start Get-FirewallState ###"
$obj=@()
foreach ($DC in (Get-ADDomainController -Filter {domain -eq $domain} -Server $domain))
{
Write-EZLog -Category INF -Message "Process Domain controller $($DC.hostname)"
$obj+=[PSCustomObject]@{
ServerName = $DC.hostname
Domain = Invoke-Command -ComputerName $DC.hostname -ScriptBlock {(get-itemproperty "HKlm:\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\DomainProfile").enablefirewall}
Private = Invoke-Command -ComputerName $DC.hostname -ScriptBlock {(get-itemproperty "HKlm:\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\StandardProfile").enablefirewall}
Public = Invoke-Command -ComputerName $DC.hostname -ScriptBlock {(get-itemproperty "HKlm:\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\PublicProfile").enablefirewall}
}
Write-EZLog -Category INF -Message "object created. ServerName = $($obj.ServerName) ; Domain = $($obj.Domain) ; Private = $($obj.Private)"
Write-EZLog -Category INF -Message "Public = $($obj.Public)"
Write-EZLog -Category INF -Message "End Domain controller $($DC.hostname)"
}
$obj
Write-EZLog -Category INF -Message "### End Get-FirewallState ###"
}
#region hardware DC configuration
#Hardware Configuration of all DCs (Logical CPU number,RAM, physical or virtual, OS, last boot)
function Get-AllDCHardware
{
param (
[string]$domain
)
Write-EZLog -Category INF -Message "### Start Get-AllDCHardware ###"
$obj=@()
(Get-ADDomainController -Filter {domain -eq $domain} -Server $domain) | Foreach-Object {
Write-EZLog -Category INF -Message "Process Domain controller $($_.hostname)"
$obj+=[PSCustomObject]@{
ServerName = $_.name
LogicalCPUNb = (Get-CimInstance win32_computersystem -ComputerName $_.hostname).numberOfLogicalProcessors
'RAM(GB)' = (Get-CimInstance win32_computersystem -ComputerName $_.hostname).TotalPhysicalMemory/1GB -as [INT]
Type = (get-CimInstance win32_computersystem -ComputerName $_.hostname).model
OS = (Get-CimInstance Win32_OperatingSystem -ComputerName $_.hostname).caption
LastBoot = (Get-CimInstance -ClassName win32_operatingsystem -ComputerName $_.hostname).lastbootuptime
}
Write-EZLog -Category INF -Message "object created. ServerName = $($obj.ServerName) ; LogicalCPUNb = $($obj.LogicalCPUNb) ; RAM(GB) = $($obj.'RAM(GB)')"
Write-EZLog -Category INF -Message "Type = $($obj.Type) ; OS = $($obj.OS) ; LastBoot = $($obj.LastBoot)"
Write-EZLog -Category INF -Message "End Domain controller $($_.hostname)"
}
$obj
Write-EZLog -Category INF -Message "### End Get-AllDCHardware ###"
}
$FirewallState = $FirewallState | ConvertTo-Html -Fragment
$DCHardware = $DCHardware | ConvertTo-Html -Fragment
$HTML = @"
<!DOCTYPE html>
<html>
<head>
<title>Report</title>
<meta name="generator" content="PowerShell" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
$HTMLCSS
</head>
<body>
$HTMLTitle
<h3> FSMO Domain Roles </h3>
$FSMODomain
<h3> Domain creation date </h3>
$DomainCreatedDate
$End Date $(get-date -Format "dd/MM/yyyy HH:mm")
</body>
</html>
"@
$HTML | out-file -FilePath $HTMLfilename
#endregion
Invoke-Item $HTMLfilename
}
}
foreach ($domain in (Get-ADForest).domains)
{
Write-EZLog -Category INF -Message "FirewallState" -ToScreen
$FirewallState = Get-FirewallState -domain $domain
Write-EZLog -Category INF -Message "DCHardware" -ToScreen
$DCHardware = Get-AllDCHardware -domain $domain
}
Dernière édition: il y a 3 ans 3 mois par Damien Commenge.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.110 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Optimisation d'un script