Question Optimisation d'un script

Plus d'informations
il y a 3 ans 3 mois #30326 par Laurent Dardenne
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

Tutoriels PowerShell

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

Plus d'informations
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 :
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.

Plus d'informations
il y a 3 ans 3 mois #30340 par Arnaud Petitjean
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... :huh:

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.

Plus d'informations
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.
Dernière édition: il y a 3 ans 3 mois par Damien Commenge.

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

Plus d'informations
il y a 3 ans 3 mois #30352 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Optimisation d'un script
Salut,
j'ai relu ton post, mais pour

Damien Commenge écrit: Si tu as 5 minutes pour regarder mon script, tu vas peut être mieux comprendre ce que je veux dire

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.

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.

Plus d'informations
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.

#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
Propulsé par Kunena