none
Création script PowerShell pour sauvegarde de log RRS feed

  • Question

  • Bonjour,

    Il y a quelques jour mon patron ma demandé de créer un script powershell pour sauvegarder les logs de nos serveur... problème => je n'y connais rien en script !!! (voila ce que c'est de passer pour le geek de service...)

    J'ai fait des recherches sur le net mais... je commence un peu à désespérer ^^

    Voila ce que j'ai réussi à faire pour l'instant :

    Param(
          $LogsArchive = "X:\BACKUP_LOGS\LOGS_ARCHIVE",
          $List_SVR = "X:\BACKUP_LOGS\SCRIPTS\LISTE_SVR.txt"
         )
        
    
    Function Test-ComputerConnection
    {
    ForEach($Computer in $Computers)
    {
     $Result = Get-WmiObject -Class win32_pingstatus -Filter "address='$computer'"
     If($Result.Statuscode -eq 0)
      {
        #if($computer.length -ge 1)
           # {
            Write-Host "- $Computer... OK"
            Get-BackUpFolder
           # } #end if (suppr ghost)
      } #end if
       else { "- $computer injoignable" }
     } #end Foreach
    } #end Test-ComputerConnection
    
    
    
    Function Get-BackUpFolder
    {
     $Folder1 = $computer
     $Folder2 = "{0:yyyy}" -f [DateTime]::now
     $Folder3 = "{0:MMMM}" -f [DateTime]::now
     $Folder4 = "{0:dd}" -f [DateTime]::now
      New-Item "$LogsArchive\$folder1\$folder2\$folder3\$folder4" -type Directory -force | out-Null
      If(!(Test-Path "\\$computer\c$\LogFolder\$folder"))
        {
          New-Item "\\$computer\c$\LogFolder\$folder" -type Directory -force | out-Null
        } #end if
     Backup-EventLogs($Folder)
    } #end Get-BackUpFolder
    
    
    
    Function Backup-EventLogs
    {
     $Eventlogs = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $computer
     Foreach($log in $EventLogs)
            {
                $path = "\\{0}\c$\LogFolder\$folder\{1}.evt" -f $Computer,$log.LogFileName
                $ErrBackup = ($log.BackupEventLog($path)).ReturnValue
                Copy-EventLogsToArchive -path $path -Folder $Folder
            } #end foreach log
    } #end Backup-EventLogs
    
    
    
    Function Copy-EventLogsToArchive($path, $folder)
    {
     Copy-Item -path $path -dest "$LogsArchive\$folder1\$folder2\$folder3\$folder4" -force
     remove-item -path "\\$computer\c$\LogFolder\*.evt"
    } # end Copy-EventLogsToArchive
    
    
    If($List_SVR) { $Computers = Get-Content -path $List_SVR; Test-ComputerConnection; exit }
    


    Pour le lancer j'ai créé une tache planifié sur mon serveur qui exécute tous les jours le .bat suivant :

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -file X:\BACKUP_LOGS\SCRIPTS\SCRIPT_SVG_LOGS_SVR.ps1
    
    pause


    Quelqu'un pourrait-il m'aider ? où ai-je merdé ? d’après powershell le problème viendrait de la ligne 58

    Copy-Item -path $path -dest "$LogsArchive\$folder1\$folder2\$folder3\$folder4" -force


    Je suis prêt à recommencer du début si vous avez quelque chose de plus simple et/ou efficace (ou qui fonctionne tout simplement ^^)


    Merci d'avance, cordialement.

    vendredi 11 août 2017 07:31

Réponses

  • Le script ci-dessus fonctionne parfaitement bien sur mon environnement.

    La ligne \\{0}\c$\LogFolder\$folder avec $folder=null et {0}="nom_ordinateur" donne \\nom_ordinateur\c$\LogFolder\\ qui est un chemin UNC valide malgré le \\.

    Le fichier *.evt est donc copié dans le dossier local de l'ordinateur C:\LogFolder grâce à la ligne :

    $ErrBackup = ($log.BackupEventLog($path)).ReturnValue

    Ensuite le fichier *.evt est copié dans "$LogsArchive\$folder1\$folder2\$folder3\$folder4" (C:\Temp\nom_ordinateur\2017\août\11) grâce à la ligne :

     Copy-Item -path $path -dest "$LogsArchive\$folder1\$folder2\$folder3\$folder4" -force

    Puis le fichier *.evt est supprimé de C:\LogFolder grâce à la ligne

     remove-item -path "\\$computer\c$\LogFolder\*.evt"

    Si vous tenez absolument à supprimer les journaux d'événements du serveur, vous pouvez le faire. Mais êtes vous certain de vouloir le faire ? Cela peut poser des problèmes de supervision de la sécurité !

    Si c'est vraiment le cas, vous pouvez utiliser le script ci-dessous (à adapter à vos besoins) qui efface TOUS les fichiers journaux d'un serveur :

    @for /f %%i in ( 'wevtutil el' ) do wevtutil cl "%%i" >NUL 2>&1
    wevtutil.exe cl "Microsoft-Windows-Diagnosis-DPS/Operational"
    wevtutil.exe cl "Microsoft-Windows-User Profile Service/Operational"
    wevtutil.exe cl "Microsoft-Windows-Windows Defender/Operational"
    wevtutil.exe cl "Microsoft-Windows-Windows Defender/WHC"
    wevtutil.exe cl "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall"
    wevtutil.exe cl System

    Testez le afin de vérifier que c'est bien ce que vous voulez.

    A vos risques et périls.


    Claude Couderc Consultant IIS, SharePoint, Exchange http://coudr.com

    vendredi 11 août 2017 11:46
  • Chaque fichier journal dispose d'une taille limite. Si cette taille est atteinte, les événements les plus récents écrasent par défaut les plus anciens. Il n'est donc pas nécessaire de les effacer.

    Le programme wevtutil.exe est livré avec Windows.

    La ligne 

    @for /f %%i in ( 'wevtutil el' ) do wevtutil cl "%%i" >NUL 2>&1

    liste tous les fichiers journaux (%%i) du serveur et les efface (commande cl)

    Les autres lignes effacent des journaux individuels qui, pour une raison qui m'échappe, ne sont pas effacés avec la première commande.

    Pour avoir l'aide de wevtutil :

    wevtutil  /?

    Il existe un paramètre /r pour accéder un ordinateur distant.


    Claude Couderc Consultant IIS, SharePoint, Exchange http://coudr.com

    • Marqué comme réponse Mira_eressea jeudi 24 août 2017 13:11
    vendredi 11 août 2017 12:55

Toutes les réponses

  • Bonjour,

    Sur mon environnement, votre script fonctionne parfaitement.

    J'ai uniquement modifié les valeurs des paramètres 

          $LogsArchive
          $List_SVR

    est-ce que les valeurs de $LogsArchive et $List_SVR sont corrects ?

    est-ce que les dossiers existent bien (sauf ceux qui sont créés par le script ) ?


    Claude Couderc Consultant IIS, SharePoint, Exchange http://coudr.com



    vendredi 11 août 2017 07:50
  • Merci pour votre réponse ! je crois que j'ai trouvé d'où venait l'erreur... la variable $folder qui sert dans le chemin de sauvegarde n'a pas de valeur, du coup lors du Copy-Item le script cherchait le chemin: \\nom_serveur\c:\LogFolder\\application.evt qui doit être un chemin incorrect... j'ai modifié la variable (en lui attribuant le nom de la machine) resultat le chemin devient : \\nom_serveur\c:\LogFolder\nom_serveur\application.evt Et ça fonctionne ! Mais du coup je comprends pas pourquoi le script fonctionnait en l'état dans votre environnement... Une autre question: comment faire pour supprimer les logs une fois la sauvegarde effectué ? Que ça soit dans le journal d’événement du serveur mais aussi dans le répertoire que j'ai créé pour la sauvegarde (à savoir c:\LogFolder)?
    vendredi 11 août 2017 10:04
  • Le script ci-dessus fonctionne parfaitement bien sur mon environnement.

    La ligne \\{0}\c$\LogFolder\$folder avec $folder=null et {0}="nom_ordinateur" donne \\nom_ordinateur\c$\LogFolder\\ qui est un chemin UNC valide malgré le \\.

    Le fichier *.evt est donc copié dans le dossier local de l'ordinateur C:\LogFolder grâce à la ligne :

    $ErrBackup = ($log.BackupEventLog($path)).ReturnValue

    Ensuite le fichier *.evt est copié dans "$LogsArchive\$folder1\$folder2\$folder3\$folder4" (C:\Temp\nom_ordinateur\2017\août\11) grâce à la ligne :

     Copy-Item -path $path -dest "$LogsArchive\$folder1\$folder2\$folder3\$folder4" -force

    Puis le fichier *.evt est supprimé de C:\LogFolder grâce à la ligne

     remove-item -path "\\$computer\c$\LogFolder\*.evt"

    Si vous tenez absolument à supprimer les journaux d'événements du serveur, vous pouvez le faire. Mais êtes vous certain de vouloir le faire ? Cela peut poser des problèmes de supervision de la sécurité !

    Si c'est vraiment le cas, vous pouvez utiliser le script ci-dessous (à adapter à vos besoins) qui efface TOUS les fichiers journaux d'un serveur :

    @for /f %%i in ( 'wevtutil el' ) do wevtutil cl "%%i" >NUL 2>&1
    wevtutil.exe cl "Microsoft-Windows-Diagnosis-DPS/Operational"
    wevtutil.exe cl "Microsoft-Windows-User Profile Service/Operational"
    wevtutil.exe cl "Microsoft-Windows-Windows Defender/Operational"
    wevtutil.exe cl "Microsoft-Windows-Windows Defender/WHC"
    wevtutil.exe cl "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall"
    wevtutil.exe cl System

    Testez le afin de vérifier que c'est bien ce que vous voulez.

    A vos risques et périls.


    Claude Couderc Consultant IIS, SharePoint, Exchange http://coudr.com

    vendredi 11 août 2017 11:46
  • en fait ce serait tout l’intérêt du script, on sauvegarde les logs sur un espace distant et sécurisé et on efface les logs sur serveur car sinon jour apres jour les journaux de logs ne cesseront de grandir non ?

    Désolé d'abuser de votre temps et de vos connaissances mais pourriez vous détailler la commande que vous m'avez donné ? Histoire que je comprenne vraiment ce qu'elle fait et que je puisse l'adapter a mes besoin :-)

    vendredi 11 août 2017 12:48
  • Chaque fichier journal dispose d'une taille limite. Si cette taille est atteinte, les événements les plus récents écrasent par défaut les plus anciens. Il n'est donc pas nécessaire de les effacer.

    Le programme wevtutil.exe est livré avec Windows.

    La ligne 

    @for /f %%i in ( 'wevtutil el' ) do wevtutil cl "%%i" >NUL 2>&1

    liste tous les fichiers journaux (%%i) du serveur et les efface (commande cl)

    Les autres lignes effacent des journaux individuels qui, pour une raison qui m'échappe, ne sont pas effacés avec la première commande.

    Pour avoir l'aide de wevtutil :

    wevtutil  /?

    Il existe un paramètre /r pour accéder un ordinateur distant.


    Claude Couderc Consultant IIS, SharePoint, Exchange http://coudr.com

    • Marqué comme réponse Mira_eressea jeudi 24 août 2017 13:11
    vendredi 11 août 2017 12:55
  • Merci pour toutes ces infos !

    J'ai testé la commande "wevtutil el" et c'est vrai qu'il y a beaucoup de journaux....plus que de journaux sauvegardé en fait ! Comment puis-je supprimer uniquement les journaux que j'ai sauvegardé ?

    De plus j'ai essayé d'adapter mon script pour mes machines clients mais la plupart me retournent le message d'erreur "serveur RPC non disponible" j'ai donc cherché sur internet et j'ai essayé de résoudre le problème (j'ai désactivé le par-feu sur une machine test et vérifié que le service "Appel de procédure distante (RPC)" était bien lancé mais toujours rien.... pouvez-vous m'aider ?

    samedi 12 août 2017 15:34
  • Postez votre script.

    Claude Couderc Consultant IIS, SharePoint, Exchange http://coudr.com



    samedi 12 août 2017 15:39
  • Bonjour, désolé du temps de réponse j'étais en déplacement.

    Le script :

    Param(
          $LogsArchive = "X:\BACKUP_LOGS\LOGS_ARCHIVE\WKS",
          $List_SVR = "X:\BACKUP_LOGS\SCRIPTS\LISTE_WKS_INTRA.txt"
         )
        
    
    Function Test-ComputerConnection
    {
    ForEach($Computer in $Computers)
    {
     $Result = Get-WmiObject -Class win32_pingstatus -Filter "address='$computer'"
     If($Result.Statuscode -eq 0)
      {
       Write-Host "- $Computer... OK"
       Get-BackUpFolder
      } #end if
       else { "- $computer injoignable" }
     } #end Foreach
    } #end Test-ComputerConnection
    
    
    
    Function Get-BackUpFolder
    {
     $Folder1 = $computer
     $Folder2 = "{0:yyyy}" -f [DateTime]::now
     $Folder3 = "{0:MMMM}" -f [DateTime]::now
     $Folder4 = "{0:dd}" -f [DateTime]::now
      New-Item "$LogsArchive\$folder1\$folder2\$folder3\$folder4" -type Directory -force | out-Null
      If(!(Test-Path "\\$computer\c$\LogFolder\$folder"))
        {
          New-Item "\\$computer\c$\LogFolder\$folder" -type Directory -force | out-Null
        } #end if
     Backup-EventLogs($Folder)
    } #end Get-BackUpFolder
    
    
    
    Function Backup-EventLogs
    {
     $Eventlogs = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $computer
     Foreach($log in $EventLogs)
            {
                $path = "\\{0}\c$\LogFolder\$folder\{1}.evt" -f $Computer,$log.LogFileName
                $ErrBackup = ($log.BackupEventLog($path)).ReturnValue
                Copy-EventLogsToArchive -path $path -Folder $Folder
            } #end foreach log
    } #end Backup-EventLogs
    
    
    
    Function Copy-EventLogsToArchive($path, $folder)
    {
     Copy-Item -path $path -dest "$LogsArchive\$folder1\$folder2\$folder3\$folder4" -force
    } # end Copy-EventLogsToArchive
    
    
    
    # *** Entry Point To Script ***
    
    If($List_SVR) { $Computers = Get-Content -path $List_SVR; Test-ComputerConnection; exit }
    


    mercredi 16 août 2017 13:19
  • bonjour,

    je ne vois pas la commande wevtutil


    Claude Couderc Consultant IIS, SharePoint, Exchange http://coudr.com

    mercredi 16 août 2017 13:31
  • Normal il n'y est pas ^^ tant que le script ne fonctionne pas de façon optimale je préfère ne pas ajouter de code (source d'erreur supplémentaire...)
    mercredi 16 août 2017 15:15
  • pouvez vous m'aider pour mon problème de "serveur RPC non disponible" ?
    jeudi 17 août 2017 08:19
  • personne pour m'aider ?
     :'(
    lundi 21 août 2017 08:53