Hola, chicos del scripting! Copia de seguridad de registros de eventos con un script de Windows PowerShell

The Microsoft Scripting Guys

Acceso rápido! Calor húmedo sweltering, rápida, toma de la respiración era la primera cosa que Jason y habían observado cuando se descarga en el aeropuerto en Kuala Lumpur, Malasia. Antes de que se había llegado el bordillo, un controlador de cab descriptivo tenían nuestros bolsas en el enlace y abierta la puerta para nosotros. El viaje era brisk a través de palm tree–lined carreteras que condujo a Kuala Lumpur ciudad centro (KLCC). Tan pronto como se introduce la autopista, se podría ver la glistening parte superior de la Torre de Patronus marcar KLCC desde millas inmediatamente en cada dirección. Hemos en Ciudad para impartir una clase de Operations Framework (MOF) a un grupo de empleados de Microsoft.

El resaltado de la clase MOF era una simulación de aeropuerto absolutamente nadie nunca obtuvo derecha en el primer intento. Pero era que parte del punto de la clase: mejora del proceso. Se había impartido la clase más de veinte veces y nadie nunca se realizó correctamente en el primer día. Apenas algunas clases hecho a través de la simulación en el último día de la clase. Hasta ahora.

Al final del primer día, llegó el momento para redondear uno de la simulación. Jason y intercambian glances saber como nos proporcionó las instrucciones. Los alumnos sat con atención rapt y, a continuación, como el reloj iniciado ticking, en lugar de la habitual alto ejecutar de confusión codificado, los alumnos silenciosamente obtuvo juntos en un pequeño huddle. Habló rápidamente para unos cinco minutos como un alumno abre su equipo portátil y empezaron a hacer notas. A continuación, se tranquila activa y realizado para ganar el juego en la primera ronda.

¿Cómo lo hacen? Simplemente dirige todo su atención a los elementos esenciales del escenario. Se omite toda la información que no sean esencial y crea un nuevo proceso que resuelve el problema. Porque centra en el problema principal, estuvieran libres de las reglas de trabajo complicado y podían centrarse su energía de la tarea en cuestión.

Las reglas de trabajo demasiado complejo pueden mermar la productividad. Secuencia de comandos hoy creció fuera de un situación un cliente que se enfrentan en el que estaban gastos varias horas en un día copia los registros de sucesos de seguridad de varios servidores de red y copiarlos en una ubicación de almacenamiento central donde estaban posterior de seguridad en cinta. Después de que hemos obtenido más allá de sus reglas de trabajo complejos, podemos crear un script personalizado que ha exactamente lo que necesitan. Esta secuencia de comandos había guarda a ese cliente de 10 horas una semana y horas 500 un año que se encuentra en mano de obra que previamente había empleado administrar registros de sucesos.

Cuando se trabaja con tiempo de espera de trabajo complicado reglas, nos centramos más atención y energía de la tarea en cuestión, que consiste en proporcionar servicios de TI. Echemos un vistazo en una secuencia de comandos que puede utilizarse para realizar una copia de seguridad, archivar y borrar registros de eventos a través de la red. La secuencia de comandos BackUpAndClearEventLogs.ps1 completa se muestra en la figura 1 .

Figura 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

Lo primero que en la secuencia de comandos es de BackUpAndClearEventLogs.ps1 utilizamos la instrucción de parámetros para crear algunos parámetros de línea de comandos para la secuencia de comandos, así:

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

Podemos utilizar varios parámetros para dar a la secuencia de comandos mucha flexibilidad. -LogsArchive parámetro sirve para definir la ubicación del archivo de registro de sucesos. Se establece este en una ubicación predeterminada en la unidad C:\, pero mediante - LogsArchive, puede elegir cualquier ubicación que tenga sentido para su entorno informático.

-Lista parámetro le permite proporcionar una lista de los equipos de la secuencia de comandos a través de un archivo de texto. Este parámetro espera que la ruta de acceso completa a un archivo de texto que contiene los nombres de equipo. La sintaxis para el archivo de texto es sencilla; simplemente coloca el nombre de cada equipo que desea trabajar en su propia línea individual.

-Equipos parámetro le permite proporcionar una lista de equipos desde la línea de comandos al ejecutar la secuencia de comandos. Para utilizar este parámetro, coloque dentro de un conjunto de nombres de equipo de comillas separados por comas. Lo ideal es que puede utilizar este parámetro si desea comprobar sólo un pequeño número de equipos.

A continuación incluyen cuatro parámetros conmutados. Uno de los más interesantes es un parámetro conmutado denominado –AD, que permite consultar Active Directory para obtener una lista de equipos. Tiene sentido utilizar este modificador si va a comprobar un gran número de registros de sucesos en todos los equipos de la red. Por supuesto, en una red grande Esto podría tardar bastante. Si desea ejecutar el script en el equipo local, utilice el Localhost modificador-, que indica la secuencia de comandos ejecutar en el equipo local. Además de copias de seguridad el evento se registra y archivado ellos a una ubicación central, puede también vacía el contenido de los registros de eventos utilizando el - borrar cambiado parámetro. Para obtener información de Ayuda, ejecute la secuencia de comandos utilizando - ayuda. Ahora llegamos a la primera función en nuestra secuencia de comandos. La función Get ADComputers es una consulta utilizada para recuperar una lista de todas las cuentas de equipo en Active Directory. Esta función no requiere los parámetros de entrada. Cuando se llama a la función, utiliza el cmdlet New-Object para crear una instancia de una clase DirectoryServices.DirectorySearcher de Microsoft .NET Framework. Nos no pase ninguna información al cmdlet New-Object, por tanto, la clase DirectoryServices.DirectorySearcher se crea utilizando el constructor predeterminado. La nueva clase DirectorySearcher se almacena en la variable de ds $, tal como se muestra aquí:

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

Después de que tengamos una instancia de la clase DirectorySearcher, podemos utilizar la propiedad Filter para crear un filtro de búsqueda para reducir el número de elementos que se recuperan. Filtros de búsqueda LDAP se documentan en" Sintaxis de filtro de búsqueda." El atributo que queremos se denomina ObjectCategory y estamos buscando un valor de "Equipo". Una vez se haya creado nuestro filtro, utilizamos el método FindAll del objeto DirectorySearcher:

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

Los resultados desde el método FindAll son canalizados al cmdlet ForEach-Object, que se utiliza para recorrer en iteración la colección de objetos de DirectoryEntry que son devueltas por FindAll. Dentro del bloque de secuencia de comandos, delineado por las llaves, utilizamos la variable automática $ _ para hacer referencia al actual elemento en la canalización. Podemos tener acceso a las propiedades del objeto DirectoryEntry y devolver el dnshostname:

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

Ahora vamos a crear la función ComputerConnection de prueba para asegurarse de que el equipo está en la red y ejecución. Se va a evitar problemas de tiempo de espera y que la secuencia de comandos sea más eficaz. Nos empezar por utilizar la palabra clave Function, a continuación, especifique el nombre de la función y abrir el bloque de secuencia de comandos:

Function Test-ComputerConnection
{

A continuación necesitamos recorra la colección de equipos que se almacena en la variable de equipos $, que se va a realizar mediante la instrucción ForEach con la variable de equipo $ como el enumerador. A continuación, abrimos el bloque de secuencia de comandos con una llave izquierda:

 ForEach($Computer in $Computers)
{

Es necesario utilizar la clase WMI Win32_PingStatus hacer ping al equipo remoto. Para ello, podemos usar el cmdlet Get-WmiObject y especificar la clase Win32_PingStatus y crear un filtro que examina la propiedad de dirección para ver si coincide con el valor almacenado en la variable de equipo $. Podemos almacenar los resultados de esta consulta WMI en un resultado $ con nombre variable, tal como se muestra aquí:

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

Ahora nos evaluar el código de estado devuelto por la consulta WMI. Si el código de estado es igual a cero, no hubo errores y el equipo está en funcionamiento:

  If($Result.Statuscode -eq 0)
   {

Por alguna extraña razón, en mi equipo la consulta devuelve un equipo fantasma que se evalúa como presente pero que no tienen un nombre. Para deshacerse del equipo fantasma, he agregado una línea de código para asegurarse de que el nombre de equipo fue al menos un carácter de largo:

     if($computer.length -ge 1) 
        { 

A continuación ofrecemos un poco de comentarios para el usuario mostrando un mensaje de estado que indica que se procesan en el equipo. Usamos el cmdlet Write-host para proporcionar esta información:

         Write-Host "+t Processing $Computer"

Ahora, utilizamos la función Get BackupFolder para buscar la carpeta que se utilizará para la copia de seguridad:

         Get-BackUpFolder 
        }
   } #end if

Si el equipo no está accesible, no hay ningún punto intento de realizar una copia el registro de sucesos de seguridad ya nos no pueda llegar a él. Podemos mostrar un mensaje de estado que indica se omita el equipo y salir de la función:

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

Después de evaluar la accesibilidad del equipo, es hora de crear la función Get BackupFolder:

Function Get-BackupFolder
{

La siguiente línea de código es algo odd-looking y, por lo tanto, un poco confuso:

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

Estamos utilizando el operador de formato (-f) para realizar algunas sustituciones de valores dentro de la cadena que se utilizará para el nombre de carpeta. La cadena contiene el número 1 en un par de llaves, los registros de palabra rodeados por guiones y otro par de llaves envolvente el número 0 seguido de un montón de cartas.

Echemos un paso en un momento. El operador – f realiza una sustitución de valores contenidos en la cadena. Como con una matriz, el primer elemento empieza en 0, el segundo en 1. Los elementos en el lado derecho del operador – f son los valores de sustitución que se colocan en las ranuras apropiadas en el lado izquierdo.

Antes de llegar la secuencia de comandos principal, vamos a unos instantes a considerar un ejemplo para aclarar cómo sustitución se lleva a cabo en la secuencia de comandos. Observe cómo se pueden sustituir la palabra uno para la parte de {0} y la palabra, dos para la parte {1} en el código siguiente:

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

Nos probablemente debería ha reorganizar nuestro código para que el primer elemento estaba en la primera posición. En su lugar, se ha escrito tales que el segundo elemento es en la primera posición, y el primer elemento en la segunda posición. Si se hubiera movido cosas alrededor de un poco, la línea de código se han buscado algo así:

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} en el comando anterior se utiliza para proporcionar la fecha y hora actuales. No deseamos la presentación normal del objeto DateTime que se muestra aquí porque es demasiado larga y contiene caracteres que no están permitidos para un nombre de carpeta. La presentación predeterminada para el objeto DateTime es martes 07 de abril de 2009 6:45:37 PM.

Los patrones de letra que siguen el carácter de dos puntos en nuestra secuencia de comandos se utilizan para controlar la forma que se mostrará los valores de DateTime. En nuestro caso, el mes va seguido del día, el año y el minuto. Estas cadenas de formato DateTime se documentan en Cadenas de formato DateTime personalizado. También se tratan en un artículo reciente en el Centro de secuencias de comandos de Microsoft " ¿Cómo puedo comprobar el tamaño del registro de sucesos y luego la copia de seguridad e IT archivar si es más que el medio completo?"

A continuación creamos la carpeta de archivo de registro de eventos. Para crear la carpeta, se usa el cmdlet New-Item y especificar el tipo como directorio. Utilizamos la variable LogsArchive $ y el modelo que se almacena en la variable de carpeta $ para crear la ruta al archivo. Se utiliza el parámetro - force para habilitar la creación de la ruta de acceso completa, si es necesario. Como no están interesados en comentarios de este comando, se los resultados de canalización la Out-Null cmdlet, se muestra aquí:

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

También debemos determinar si existe la carpeta de registro en el equipo. Para ello, utilice el cmdlet Test-Path, así:

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

El cmdlet Test-Path devuelve un $ true o false valor de $ booleano. Preguntar, "¿es la carpeta de registro existe?" Colocar no operador (!) delante del cmdlet Test-Path indica estamos interesados sólo si la carpeta no existe.

Si la carpeta de registro no existe en el equipo remoto, utilizamos el cmdlet New-Item para crearlo. Se tiene un valor codificado de LogFolder, pero puede cambiarlo. Como en el cmdlet New-Item anterior, se utiliza el parámetro - force para crear la ruta de acceso completa y los resultados de la canalización el Out-Null cmdlet:

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

Queremos llamar a la función EventLogs de copia de seguridad, que realiza la copia de seguridad real de los registros de sucesos. Pasamos la ruta almacenada en la variable de la carpeta $ cuando llamamos a la función:

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

A continuación, se cree la función EventLogs de copia de seguridad:

Function Backup-EventLogs
{

Utilizamos la clase WMI Win32_NTEventLogFile para realizar la copia de seguridad real. Para ello, podemos llamar al cmdlet Get-WmiObject y asígnele el nombre de clase de Win32_NTEventLogFile, así como la nombre de equipo contenida en la variable de equipo $. Almacenamos el objeto WMI resultante en la variable de Eventlogs $:

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

Al realizar una consulta WMI genérica, sin filtrar, se devuelven objetos de registro de sucesos que representan cada registro de eventos en el equipo. Estos son los registros de eventos clásicos que se muestra en la figura 2 .

Para trabajar con estos registros de sucesos, es necesario utilizar la instrucción ForEach para recorrer la colección de objetos WMI. Se utiliza el registro de $ variable como nuestro enumerador para mantener nuestro lugar como le guiamos paso a través de la colección:

fig02.gif

Figura 2 Win32_NTEventLogFile recupera registros de eventos clásico

 ForEach($log in $EventLogs)
        {

Ahora debemos crear la ruta de acceso. Una vez más, utilizamos el operador de formato para hacer algunas sustitución de modelo. {0} Es un marcador de posición para nombre de equipo en la ruta que se utilizará para la event logs. El {1} es un marcador de posición que se utiliza para contener el nombre del archivo de registro que se utilizará cuando copia de seguridad del registro de eventos:

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

Ahora llamamos al método BackupEventLog desde la clase WMI Win32_NTEventLogFile. Se pasa la ruta de acceso al método BackupEventLog y recuperar el valor devuelto de la llamada al método. Almacenamos el valor devuelto en la variable de ErrBackup de $ tal como se muestra aquí:

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

Si la secuencia de comandos se ejecuta con el modificador –clear, la variable $ borrar sería presente y, en ese caso, tendríamos que borrar registros de sucesos. Por tanto, podemos utilizar la si instrucción para determinar si la variable desactive $ está presente:

            if($clear)
               {

Antes de que se vacíe los registros de sucesos, nos gustaría asegurarse de que el registro de sucesos se correctamente hace una copia de seguridad. Para ello, nos inspeccione el valor almacenado en la variable de ErrBackup $. Si es igual a cero, sabemos no se produjeron errores durante la operación de copia de seguridad y que es seguro continuar con vaciar los registros de sucesos:

                if($ErrBackup -eq 0)
                  {

Se llama al método ClearEventLog desde la clase WMI Win32_NTEventLogFile y se recuperar la propiedad ReturnValue desde la llamada al método. La propiedad ReturnValue se almacena en la variable de errClear $ tal como se muestra aquí:

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

Si el valor de la variable de ErrBackup $ no es igual a 0, nos no espera borrar los registros de sucesos. En su lugar, podemos mostrar un mensaje de estado que indica que no hemos podidos borrar el registro de sucesos porque la operación de copia de seguridad. Para proporcionar información, la solución de problemas adicionales se muestra el código de estado que se ha recuperado de la operación de copia de seguridad:

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

Después, los registros de sucesos se copie a la ubicación de almacenamiento. Para ello, podemos llamar a la función Copiar EventLogsToArchive y asígnele la ruta de acceso a los registros de sucesos y la carpeta para el destino:

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

Copia EventLogsToArchive utiliza el cmdlet Item copiar para copiar los registros de sucesos a la ubicación de almacenamiento. Nuevo utilizar el parámetro - force para crear la carpeta si no existe:

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

Ahora necesitamos crear texto de ayuda para la secuencia de comandos. Para ello, se cree una función Get HelpText que almacena la información de Ayuda en una única variable: helpText $. El texto de Ayuda se escribe como una cadena de aquí, que permite dar formato al texto como se desee que aparezca en la pantalla sin relativos a nosotros mismos con escape las comillas. Esto facilita mucho para nosotros escribir una cadena grande como la figura 3 .

Figura 3 Get HelpText función

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

Para mostrar el texto de Ayuda, utilizamos la variable por nombre:

  $helpText
}

A continuación, podemos analizar la entrada de línea de comandos que se muestra aquí:

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 la $ AD variable está presente, la secuencia de comandos se ejecutó con el opción-AD modificador y llenar, por lo tanto, la variable de equipos de $ con la información obtenida de la función Get ADComputers. Utilizamos la función ComputerConnection de prueba, que determinará si el equipo está en línea y vuelva a copia los registros de sucesos. A continuación, salimos de la secuencia de comandos. Si la variable de lista $ está presente, se utiliza el cmdlet Get-Content para leer un archivo de texto y llenar la variable de equipos $. A continuación, nos llame la función de prueba ComputerConnection y salir de la secuencia de comandos. Si la variable de LocalHost $ está presente, se llene la variable de equipos $ leer el valor directamente desde la variable de entorno computerName. A continuación, nos llame la función de prueba ComputerConnection y salir de la secuencia de comandos.

Si la variable de equipos $ está presente, significa que se ejecutó la secuencia de comandos y que los nombres de equipo se han proporcionado desde la línea de comandos. Será necesario dividir estos nombres de equipo en una matriz. Para ello, se utiliza el método split del objeto de cadena:

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

Si se ejecutó la secuencia de comandos con el ayuda modificador-, se llame a la función Get HelpText, mostrar la Ayuda y salir de la secuencia de comandos:

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

Si no existen parámetros, se muestra un mensaje que estados le faltan parámetros y llamamos Get-Help Probar función:

"Missing parameters" ; Get-HelpText

La secuencia de comandos BackupAndClearEventLogs.ps1 se puede adaptar fácilmente para atender sus necesidades de la red. Por ejemplo, puede modificar la consulta de Active Directory para que devuelve sólo los servidores desde una unidad organizativa determinada, o puede agregar una consulta WMI adicional para filtrar aún más los equipos que se procesan. Esperamos que disfrute de la secuencia de comandos y utilizarla donde trabaja. Visite nosotros y a la comunidad de los creadores de secuencias de comandos en el Centro de secuencias de comandosen donde también puede detectar nuestro diaria Hey, Scripting Guy! artículos.

Ed Wilson , un experto en secuencias de comandos conocido, es el autor de ocho libros, incluyendo Windows PowerShell Scripting Guide Microsoft Press (2008) y Microsoft Press Microsoft Windows PowerShell Step by Step (2007). Ed contiene más de 20 certificaciones del sector, incluidos Microsoft Certified Systems Engineer (MCSE) y Certified Information Systems Security Professional (CISSP). En su tiempo libre disfruta carpintería, Mundo submarino fotografía y actividades subacuáticas. Y té.

Carlos Liebendorfer es wordsmith y longtime editor Web de Microsoft. Carlos aún no se pueden creer existe un trabajo que se paga en él para trabajar con palabras cada día. Uno de sus cosas favoritas es humor irreverente, por lo que debe ajustar derecha en aquí. Considera su logro mayor en la vida que su hija magnificent.