Hé, vous le scripteur ! Sauvegarde de vos journaux des événements avec un Script PowerShell de Windows

The Microsoft Scripting Guys

Conseil de dernière minute ! Souffle prise, du pense-bête sweltering chaleur humid était la première chose que Jason et remarqué lorsque nous prix à quai à l'aéroport dans Kuala Lumpur, Malaisie. Avant que nous a atteint la courbe, un pilote cab convivial devaient nos sacs dans le tronc et porte ouverte pour nous. Le déplacement a été brisk via palm tree–lined routes qui ont conduit à KLCC (Kuala Lumpur Ville centre). Dès que nous avons entré l'autoroute, nous pourrait voir glistening en haut de la problème Patronus marquer KLCC de miles rangement dans chaque direction. Nous n'avons ville pour animer une classe Microsoft Operations Framework (MOF) à un groupe d'employés.

La surbrillance de la classe MOF est une simulation d'aéroport absolument aucun utilisateur n'a jamais droite de la première tentative. Mais qui n'était une partie du point de la classe, amélioration des processus. Nous a appris la classe plus de 20 fois, et n'a réussi jamais sur le premier jour. Certaines classes rendu à peine par la simulation sur le dernier jour de la classe. Jusqu'à présent.

À la fin du premier jour, il était temps pour un rond de la simulation. Jason et échangés glances savoir que nous a donné les instructions. Les stagiaires sat avec attention rapt, puis que l'horloge démarré ticking, au lieu du habituelle bruyants de confusion brouillée, les stagiaires en mode silencieux obtenu ensemble dans une petite huddle. Ils parlait rapidement pour environ cinq minutes comme un stagiaire ouvert son ordinateur portable et a commencé à apporter des commentaires. Puis calmement activée autour d'elles s'est poursuivie pour gagner le jeu dans le premier tour.

Leur comment il ? Ils dirigés simplement tous leur attention sur les éléments essentiels du scénario. Ils ignoré toutes les informations non essentielles et créé un nouveau processus a résolu le problème. Car ils concentré sur le problème principal, il s'agissait libre des règles de travail complexes, et ils pouvaient leur énergie vous concentrer sur la tâche en cours.

Règles de travail trop complexes peuvent gêner la productivité. Script aujourd'hui a augmenté d'un situation un client face dans lequel ils ont été passer plusieurs heures par jour sauvegarde des journaux des événements à partir de différents serveurs de réseau et les copier dans un emplacement central où ils étaient ultérieures sauvegardé sur bande. Une fois que nous avons au-delà de leurs règles de travail complexes, nous avons pu créer un script personnalisé qui n'a exactement ce dont ils besoin. Ce script enregistré ce client 10 heures par semaine et 500 heures par an en main de œuvre que qu'ils avaient précédemment a passé à gestion des journaux des événements.

Lorsque nous prenons délai d'expiration des règles de travail complexes, nous pouvez vous concentrer plus attention et d'énergie de la tâche en cours, qui consiste à fournir des services informatiques. Jetons un coup de œil un script qui peut être utilisé pour sauvegarder, archiver et effacer les journaux des événements sur le réseau. Tout le script BackUpAndClearEventLogs.ps1 est illustré figure 1 .

La figure 1 BackUpAndClearEventLogs.ps1

Param(
       $LogsArchive = "c:\logarchive", 
       $List,
       $computers,
       [switch]$AD, 
       [switch]$Localhost,
       [switch]$clear,
       [switch]$Help
     )
Function Get-ADComputers
{
 $ds = New-Object DirectoryServices.DirectorySearcher
 $ds.Filter = "ObjectCategory=Computer"
 $ds.FindAll() | 
     ForEach-Object { $_.Properties['dnshostname']}
} #end Get-AdComputers

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 "+ Processing $Computer"
         Get-BackUpFolder 
        }
   } #end if
   else { "Skipping $computer .. not accessible" }
 } #end Foreach
} #end Test-ComputerConnection



Function Get-BackUpFolder
{
 $Folder = "{1}-Logs-{0:MMddyymm}" -f [DateTime]::now,$computer
  New-Item "$LogsArchive\$folder" -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
            if($clear)
               {
                if($ErrBackup -eq 0)
                  {
                   $errClear = ($log.ClearEventLog()).ReturnValue
                  } #end if
                else
                  { 
                    "Unable to clear event log because backup failed" 
                    "Backup Error was " + $ErrBackup
                  } #end else
               } #end if clear
            Copy-EventLogsToArchive -path $path -Folder $Folder
        } #end foreach log
} #end Backup-EventLogs

Function Copy-EventLogsToArchive($path, $folder)
{
 Copy-Item -path $path -dest "$LogsArchive\$folder" -force
} # end Copy-EventLogsToArchive

Function Get-HelpText
{
 $helpText= `
@"
 DESCRIPTION:
 NAME: BackUpAndClearEventLogs.ps1
 This script will backup, archive, and clear the event logs on 
 both local and remote computers. It will accept a computer name,
 query AD, or read a text file for the list of computers. 

 PARAMETERS: 
 -LogsArchive local or remote collection of all computers event logs
 -List path to a list of computer names to process
 -Computers one or more computer names typed in
 -AD switch that causes script to query AD for all computer accounts
 -Localhost switch that runs script against local computer only
 -Clear switch that causes script to empty the event log if the back succeeds
 -Help displays this help topic

 SYNTAX:
 BackUpAndClearEventLogs.ps1 -LocalHost 

 Backs up all event logs on local computer. Archives them to C:\logarchive.

 BackUpAndClearEventLogs.ps1 -AD -Clear

 Searches AD for all computers. Connects to these computers, and backs up all event 
 logs. Archives all event logs to C:\logarchive. It then clears all event logs 
 if the backup operation was successful. 

 BackUpAndClearEventLogs.ps1 -List C:\fso\ListOfComputers.txt

 Reads the ListOfComputers.txt file to obtain a list of computer. Connects to these 
 computers, and backs up all event logs. Archives all event logs to C:\logarchive. 

 BackUpAndClearEventLogs.ps1 -Computers "Berlin,Vista" -LogsArchive "\\berlin\C$\fso\Logs"

 Connects to a remote computers named Berlin and Vista, and backs up    all event 
 logs. Archives all event logs from all computers to the path c:\fso\Logs directory on 
   a remote computer named Berlin. 

BackUpAndClearEventLogs.ps1 -help

Prints the help topic for the script
"@ #end helpText
  $helpText
}

# *** Entry Point To Script ***

If($AD) { $Computers = Get-ADComputers; Test-ComputerConnection; exit }
If($List) { $Computers = Get-Content -path $list; Test-ComputerConnection; exit }
If($LocalHost) { $computers = $env:computerName; Test-ComputerConnection; exit }
If($Computers) 
  { 
   if($Computers.Contains(",")) {$Computers = $Computers.Split(",")} 
   Test-ComputerConnection; exit 
  }
If($help) { Get-HelpText; exit }
"Missing parameters" ; Get-HelpText

La première chose que nous en BackUpAndClearEventLogs.ps1 script est utilisez l'instruction de paramètre pour créer certains paramètres de ligne de commande pour le script, comme suit :

Param(
       $LogsArchive = "c:\logarchive", 
       $List,
       $Computers,
       [switch]$AD, 
       [switch]$Localhost,
       [switch]$Clear,
       [switch]$Help
     )

Nous utilisons plusieurs paramètres pour donner la script une grande souplesse. -LogsArchive paramètre sert à définir l'emplacement de l'archive du journal des événements. Nous définissons ce sur un emplacement par défaut sur le lecteur C:\, mais en utilisant - LogsArchive, vous pouvez choisir n'importe quel emplacement adaptée à votre environnement informatique.

-Liste paramètre vous permet de fournir une liste d'ordinateurs pour le script via un fichier texte. Ce paramètre s'attend le chemin d'accès complet à un fichier texte contenant les noms d'ordinateur. La syntaxe pour le fichier texte est simple ; vous placer uniquement le nom de chaque ordinateur que vous souhaitez travailler avec sur sa propre ligne distincte.

-Ordinateurs paramètre permet de fournir une liste d'ordinateurs à partir de la ligne de commande lorsque vous exécutez le script. Pour utiliser ce paramètre, vous placez dans un ensemble de noms d'ordinateur entre guillemets séparés par des virgules. Dans l'idéal, vous devez utiliser ce paramètre si vous souhaitez Vérifiez simplement un petit nombre d'ordinateurs.

Viennent ensuite quatre paramètres commutés. Parmi les plus utiles est un paramètre commuté appelé –AD, qui permet d'interroger Active Directory pour obtenir une liste des ordinateurs. Il est judicieux d'utiliser ce commutateur si vous prévoyez à un grand nombre de journaux des événements sur tous les ordinateurs de votre réseau. Bien entendu, sur un grand réseau cela peut prendre assez longtemps. Si vous souhaitez exécuter le script sur votre ordinateur local, utilisez le paramètre-commutateur Localhost, qui indique au script à exécuter sur l'ordinateur local. Outre les journaux de sauvegarde de l'événement et leur archivage vers un emplacement central, vous pouvez également vide le contenu des journaux des événements en utilisant le - effacer basculé paramètre. Pour obtenir des informations d'aide, exécutez le script à l'aide - aide. Nous sont maintenant à la fonction première de notre script. La fonction Get-ADComputers est une requête utilisée pour récupérer une liste de tous les comptes d'ordinateur dans Active Directory. Cette fonction ne nécessite aucun paramètre d'entrée. Lorsque la fonction est appelée, il utilise la cmdlet New-Object pour créer une instance d'une classe DirectoryServices.DirectorySearcher à partir de Microsoft .NET Framework. Nous ne transmettez pas les informations à la cmdlet New-Object, c'est pourquoi la classe DirectoryServices.DirectorySearcher est créée à l'aide du constructeur par défaut. La nouvelle classe DirectorySearcher est stockée dans la variable de ds $, comme illustré ici :

Function Get-ADComputers
{
$ds = New-Object DirectoryServices.DirectorySearcher

Une fois que nous avez une instance de la classe DirectorySearcher, nous pouvons utiliser la propriété Filter pour créer un filtre de recherche pour réduire le nombre d'éléments qui sont récupérés. Filtres de recherche LDAP sont décrites dans» Syntaxe du filtre de recherche." L'attribut que nous voulons est appelé ObjectCategory et nous recherchons une valeur de «Ordinateur». Après que nous avons créé notre filtre, nous utiliser la méthode FindAll de l'objet DirectorySearcher :

 $ds.Filter = "ObjectCategory=Computer"
$ds.FindAll() | 

Les résultats de la méthode FindAll sont pipelined à la cmdlet ForEach-Object, qui est utilisée pour parcourir la collection d'objets DirectoryEntry qui sont retournées par FindAll. À l'intérieur du bloc de script, délimité par des crochets accolades, nous utilisons la variable $ _ automatique pour faire référence à l'élément en cours sur le pipeline. Nous accéder aux propriétés de l'objet DirectoryEntry et renvoyer le dnshostname :

     ForEach-Object {$_.Properties['dnshostname']}
} #end Get-ADComputers

Nous allons maintenant créer la fonction ComputerConnection Test pour vérifier que l'ordinateur est sur le réseau et en cours d'exécution. Ce sera ainsi éviter les problèmes d'expiration et le script plus efficace. Nous commencer en utilisant le mot clé Function, puis spécifiez le nom de la fonction et ouvrir le bloc de script :

Function Test-ComputerConnection
{

Nous devons ensuite parcourir la collection d'ordinateurs stocké dans la variable $ ordinateurs, qui nous nous chargeons l'instruction ForEach avec la variable d'ordinateur $ en tant que l'énumérateur. Nous avons alors ouvrir le bloc de script à l'aide une accolade gauche :

 ForEach($Computer in $Computers)
{

Nous devons utiliser la classe WMI Win32_PingStatus sur l'ordinateur distant. Pour ce faire, nous, utilisez la cmdlet Get-WmiObject et spécifier la classe Win32_PingStatus et créer un filtre qui examine la propriété adresse si elle correspond à la valeur stockée dans la variable ordinateur $. Nous stocker les résultats de cette requête WMI dans un résultat $ nommé variable, comme illustré ici :

  $Result = Get-WmiObject -Class Win32_PingStatus -Filter "address='$computer'"

Nous évaluons maintenant le code d'état renvoyé par la requête WMI. Si le code d'état est égal à zéro, sans erreurs et l'ordinateur est en cours d'exécution :

  If($Result.Statuscode -eq 0)
   {

Pour une raison étrange, sur mon ordinateur la requête renvoie un ordinateur fantôme il évalue comme présent mais qui n'avaient pas un nom. Pour vous débarrasser de l'ordinateur fantôme, j'ai ajouté une ligne de code pour vous assurer que le nom de l'ordinateur a au moins un caractère long :

     if($computer.length -ge 1) 
        { 

Ensuite nous fournir un peu de commentaires à l'utilisateur en affichant un message d'état indiquant que nous traitez l'ordinateur. Nous utilisons la cmdlet Write-Host pour cette commentaires :

         Write-Host "+t Processing $Computer"

Maintenant nous appeler la fonction Get-BackupFolder pour rechercher le dossier à utiliser pour la sauvegarde :

         Get-BackUpFolder 
        }
   } #end if

Si l'ordinateur n'est pas accessible, il n'existe aucun point lors de la tentative de sauvegarder le journal des événements car nous ne pourront pas accéder. Il affiche un message d'état indiquant que nous ignore l'ordinateur et quitter la fonction :

   else { "Skipping $computer .. not accessible" }
 } #end Foreach
} #end Test-ComputerConnection

Après avoir évalué l'accessibilité de l'ordinateur, il est temps de créer la fonction Get-BackupFolder :

Function Get-BackupFolder
{

La ligne suivante de code est quelque peu odd-looking et donc un peu à confusion :

$Folder = "{1}-Logs-{0:MMddyymm}" -f [DateTime]::now,$computer

Nous utilisons l'opérateur du format (-f) pour effectuer certaines valeurs substitution dans la chaîne que nous utiliserons pour le nom du dossier. La chaîne contient le numéro 1 dans une paire d'accolades, les journaux mot entourées par des tirets et une autre paire d'accolades entourant le numéro 0 suivie d'une série de lettres.

Prenons cette une étape à la fois. L'opérateur – f effectue une substitution de valeurs contenues dans la chaîne. Tout comme avec un tableau, le premier élément commence à 0, le second à 1. Les éléments sur le côté droit de l'opérateur – f sont les valeurs de substitution qui sont placés dans les emplacements appropriés sur le côté gauche.

Avant d'arriver sur le script principal, nous allons prendre un instant à considérer un exemple pour clarifier la substitution est effectuée dans le script. Notez comment nous remplacer le mot un pour la partie {0} et le mot deux pour la partie {1} dans le code suivant :

PS C:\Users\edwilson> $test = "{0}-first-{1}-second" -f "one","two"
PS C:\Users\edwilson> $test
one-first-two-second

Nous probablement doit avoir réorganisé notre code afin que le premier élément lors de la première position. Au lieu de cela, nous ont écrit il telle que le deuxième élément est en première position, et le premier élément est en deuxième position. Si nous a déplacé éléments, la ligne de code sont avons vu quelque chose comme ceci :

PS C:\Users\edwilson> $computer = "localhost"
PS C:\Users\edwilson> $Folder = "{0}-Logs-{1:MMddyymm}" -f $computer, [DateTime]::now
PS C:\Users\edwilson> $Folder
localhost-Logs-04070938

{1:MMddyymm} dans la commande ci-dessus est utilisé pour fournir la date et heure actuelles. Nous ne voulons pas l'affichage normal de l'objet DateTime qui est présenté ici car il est trop long et comporte des caractères qui ne sont pas autorisés pour un nom de dossier. L'affichage par défaut pour l'objet DateTime est mardi avril 07, 2009 6:45:37 PM.

Les modèles de lettre qui suit le caractère deux-points dans notre script sont utilisés pour contrôler la façon dont les valeurs DateTime seront affichera. Dans notre cas, le mois est suivi par le jour, l'année et la minute. Ces chaînes de format DateTime sont documentés à Chaînes de Format DateTime personnalisées. Ils ont été également abordées dans un article récent sur le Centre de scripts Microsoft " Comment peut vous vérifier la taille de mon journal des événements et puis sauvegarder et archiver IT s'il est plus à moitié plein ?"

Ensuite nous créez un dossier archive journal des événements. Pour créer le dossier, nous utilisez la cmdlet New-Item et spécifiez le type comme répertoire. Nous utilisons la variable LogsArchive $ et le modèle que nous stockés dans la variable de dossier $ pour créer le chemin d'accès à l'archive. Nous utilisons le - paramètre force pour activer création du chemin complet, si elle est requise. Étant donné que nous ne sont pas intéressés par les commentaires de cette commande, nous pipeline les résultats de la Out-Null cmdlet, illustré ici :

New-Item "$LogsArchive\$folder" -type Directory -force | Out-Null

Nous devons également déterminer si le dossier du journal existe sur l'ordinateur. Pour cela nous utilisez la cmdlet test-Path, comme suit :

  If(!(Test-Path "\\$computer\c$\LogFolder\$folder"))
    {

La cmdlet test-Path renvoie une $ true ou une valeur booléenne false $. Demander, "Est le dossier du journal?" Placement non (!) en regard de la cmdlet test-Path indique nous intéresse uniquement si le dossier n'existe pas.

Si le dossier du journal n'existe pas sur l'ordinateur distant, nous utilisons la cmdlet New-Item pour sa création. Nous ont une valeur codée en dur LogFolder, mais vous pouvez le modifier. Comme dans la cmdlet New-Item précédente, nous utilisons le paramètre - force pour créer le chemin d'accès complet et les résultats de pipeline le Out-Null applet de commande :

      New-Item "\\$computer\c$\LogFolder\$folder" -type Directory -force | out-Null
    } #end if

Maintenant, nous voulons appeler la fonction sauvegarde EventLogs qui effectue la sauvegarde des journaux des événements réelle. Nous transmettons le chemin stocké dans la variable de dossier $ lorsque nous appelons la fonction :

 Backup-EventLogs($folder)
} #end Get-BackUpFolder

Créez ensuite la fonction sauvegarde EventLogs :

Function Backup-EventLogs
{

Nous utilisons la classe Win32_NTEventlogFile WMI pour effectuer la sauvegarde réelle. Pour ce faire, nous appelons la cmdlet Get-WmiObject et lui donner le nom de classe de Win32_NTEventLogFile ainsi nom de l'ordinateur contenues dans la variable d'ordinateur $. Nous enregistrons l'objet WMI qui en résulte dans la variable Eventlogs $ :

$Eventlogs = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $computer

En effectuant une requête WMI générique et non filtrée, nous retournent des objets journal représentant chaque journal des événements sur l'ordinateur. Voici les journaux des événements classiques illustrés figure 2 .

Pour travailler avec ces journaux d'événements, nous devons utiliser l'instruction ForEach pour parcourir la collection d'objets WMI. Nous utilisons le journal de $ variable comme notre énumérateur pour maintenir notre place que nous parcourir la collection :

fig02.gif

La figure 2 journaux d'événements classique récupérées par Win32_NTEventLogFile

 ForEach($log in $EventLogs)
        {

Nous devons maintenant créer le chemin d'accès. Une fois encore, nous utilisons l'opérateur du format pour effectuer une substitution de modèle. {0} Est un espace réservé pour le nom de l'ordinateur dans le chemin qui sera utilisé pour l'event logs. Le {1} est un espace réservé qui est utilisé pour contenir le nom du fichier journal qui sera utilisé lors de la sauvegarde le journal des événements :

            $path = "\\{0}\c$\LogFolder\$folder\{1}.evt" -f $Computer,$log.LogFileName

Maintenant nous appeler la méthode BackupEventLog à partir de la classe Win32_NTEventlogFile WMI. Nous transmettre le chemin d'accès à la méthode BackupEventLog et en extraire la valeur de retour de l'appel de méthode. Nous stocker la valeur de retour dans la variable de ErrBackup $ comme indiqué ici :

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

Si le script est exécuté avec le commutateur –clear, la variable $ clair devrait être présente et, dans ce cas, nous devons doit effacer les journaux des événements. Par conséquent, nous utilisons la si instruction afin de déterminer si $ désactivez variable est présent :

            if($clear)
               {

Avant de nous vider les journaux des événements, nous aimerions vous assurer que le journal des événements a été correctement sauvegardé. Pour ce faire, nous inspecter la valeur stockée dans la variable ErrBackup $. Si elle est égale à zéro, nous savons il n'existait aucuns erreurs pendant l'opération de sauvegarde et qu'il est sûr procéder à vider les journaux des événements :

                if($ErrBackup -eq 0)
                  {

Nous appelons la méthode ClearEventLog de la classe Win32_NTEventlogFile WMI et récupérer la propriété ReturnValue de l'appel de méthode. Nous enregistrons la propriété ReturnValue dans la variable errClear $ comme indiqué ici :

                   $errClear = ($log.ClearEventLog()).ReturnValue
                  } #end if

Si la valeur de la variable ErrBackup $ n'est pas égale à 0, nous n'out pas effacer les journaux des événements. Au lieu de cela, nous affiche un message d'état indiquant qu'impossible d'effacer le journal des événements car l'opération de sauvegarde a échoué. Pour fournir plus des informations sur la résolution de problèmes, nous indiquent le code état qui a été extrait de l'opération de sauvegarde :

                else
                  { 
                    "Unable to clear event log because backup failed" 
                    "Backup Error was " + $ErrBackup
                  } #end else
               } #end if clear

Nous Copiez ensuite les journaux des événements vers l'emplacement d'archivage. Pour ce faire, nous appeler la fonction Copier EventLogsToArchive et lui donner le chemin d'accès dans les journaux des événements et le dossier pour la destination :

            Copy-EventLogsToArchive -path $path -Folder $Folder
        } #end foreach log
} #end Backup-EventLogs

Copie EventLogsToArchive utilise la cmdlet Copy-Item pour copier les journaux des événements à l'emplacement d'archivage. Nous utilisons à nouveau le paramètre - force pour créer le dossier s'il n'existe pas :

Function Copy-EventLogsToArchive($path, $folder)
{
 Copy-Item -path $path -dest "$LogsArchive\$folder" -force
} # end Copy-EventLogsToArchive

Nous devons maintenant créer un texte d'aide pour le script. Pour ce faire, nous créer une fonction Get-HelpText qui stocke les informations d'aide dans une variable unique: $ helpText. Le texte d'aide est écrit comme une chaîne d'ici, ce qui vous permet de nous mettre en forme le texte comme nous souhaitez qu'il apparaisse dans l'écran sans nous-mêmes concernant avec séquence d'échappement entre guillemets. Il est ainsi beaucoup plus facile pour nous permettant de taper une grande chaîne telle que celle de la figure 3 .

La figure 3 obtenir HelpText fonction

Function Get-HelpText
{ 
 $helpText= `
@"
 DESCRIPTION:
 NAME: BackUpAndClearEventLogs.ps1
 This script will backup, archive, and clear the event logs on 
 both local and remote computers. It will accept a computer name,
 query AD, or read a text file for the list of computers. 
 PARAMETERS: 
 -LogsArchive local or remote collection of all computers event logs
 -List path to a list of computer names to process
 -Computers one or more computer names typed in
 -AD switch that causes script to query AD for all computer accounts
 -Localhost switch that runs script against local computer only
 -Clear switch that causes script to empty the event log if the back succeeds
 -Help displays this help topic
 SYNTAX:
 BackUpAndClearEventLogs.ps1 -LocalHost 
Backs up all event logs on local computer. Archives them to C:\logarchive.
 BackUpAndClearEventLogs.ps1 -AD -Clear
 Searches AD for all computers. Connects to these computers, and backs up all event 
 logs. Archives all event logs to C:\logarchive. It then clears all event logs if the
 backup operation was successful. 
 BackUpAndClearEventLogs.ps1 -List C:\fso\ListOfComputers.txt
 Reads the ListOfComputers.txt file to obtain a list of computer. Connects to these 
 computers, and backs up all event logs. Archives all event logs to C:\logarchive. 
 BackUpAndClearEventLogs.ps1 -Computers "Berlin,Vista" -LogsArchive "\\berlin\C$\fso\Logs"
 Connects to a remote computers named Berlin and Vista, and backs up all event 
 logs. Archives all event logs from all computers to the path c:\fso\Logs directory on 
 a remote computer named Berlin. 
 BackUpAndClearEventLogs.ps1 -help
 Prints the help topic for the script
 "@ #end helpText

Pour afficher le texte d'aide, nous appeler la variable par un nom :

  $helpText
}

Ensuite, nous analyser l'entrée de ligne de commande indiquée ici :

If($AD) { $Computers = Get-ADComputers; Test-ComputerConnection; exit }
If($List) { $Computers = Get-Content -path $list; Test-ComputerConnection; exit }
If($LocalHost) { $computers = $env:computerName; Test-ComputerConnection; exit }

Si le $ variable AD est présent, le script a été exécuté avec - Active Directory commutateur et nous avons donc remplir la variable ordinateurs $ avec les informations obtenues à partir de la fonction Get-ADComputers. Nous appelons ensuite la fonction Test ComputerConnection, qui détermine si l'ordinateur est en ligne et en haut les journaux des événements. Puis nous quitter le script. Si la variable de liste $ est présente, nous utilisons la cmdlet Get-Content pour lire un fichier texte et remplir la variable ordinateurs $. Ensuite appeler la fonction Test ComputerConnection et quitter le script. Si la variable de LocalHost $ est présente, nous remplir la variable ordinateurs $ en lisant la valeur directement à partir de la variable d'environnement computerName. Ensuite appeler la fonction Test ComputerConnection et quitter le script.

Si la variable ordinateurs $ est présente, cela signifie que le script a été exécuté et que les noms d'ordinateur ont été fournis depuis la ligne de commande. Nous devons introduire ces noms d'ordinateurs dans un tableau. Pour ce faire, nous utilisons la méthode split de l'objet string :

If($Computers) 
  { 
   if($Computers.Contains(",")) {$Computers = $Computers.Split(",")} 
   Test-ComputerConnection; exit 
  }

Si le script a été exécuté avec l'option-commutateur aide, nous appeler la fonction Get-HelpText, afficher l'aide et quitter le script :

If($help) { Get-HelpText; exit }

Si aucun paramètre n'est présent, nous afficher un message que états nous vous manque des paramètres, puis appeler Get-Help testent fonction :

"Missing parameters" ; Get-HelpText

Le script BackupAndClearEventLogs.ps1 peut être facilement adapté pour répondre à vos besoins de votre réseau. Par exemple, vous pouvez modifier la requête Active Directory afin qu'il renvoie uniquement des serveurs à partir d'une unité d'organisation particulière, ou vous pouvez ajouter une requête WMI supplémentaire pour filtrer davantage les ordinateurs qui sont traitées. Nous espérons que vous appréciez le script et pouvez l'utiliser dans laquelle vous travaillez. Visitez la communauté des scripteurs et nous sur la Centre de scriptsà partir de laquelle vous pouvez également intercepter notre quotidien Hey, Scripting Guy ! articles.

Ed Wilson , un expert en script connu, est l'auteur de huit livres, notamment Windows PowerShell Scripting Guide Microsoft Press (2008) et Microsoft Windows PowerShell Step by Step Microsoft Press (2007). Ed conserve plus de 20 certifications industrie, y compris (Microsoft Certified Systems ENGINEER) et Certified Information Systems Security Professional (CISSP). Pendant son temps libre, il aime woodworking, Fonds marins photographie et plongée. Et thé.

Craig Liebendorfer est wordsmith et longtime éditeur Web Microsoft. Craig ne pensez toujours d'un travail paie lui pour travailler avec mots chaque jour. Un des ses choses préférées est irrévérencieux d'humour, afin qu'il doit ajuster droite ici. Il considère que sa réalisation plus élevée dans la vie à sa fille magnifique.