19:54 (25-05-2012)
Windowstecnico
Publicada el 01-02-2012 17:39 0 4

Cambia la contraseña del administrador de múltiples ordenadores con PowerShell

Enviar a Twitter Enviar a Facebook Compartir en Questionity

 

image

En esta ocasión vamos a analizar un script de PowerShell el cual le permitirá cambiar la contraseña de administrador local en varios equipos remotos. También se podría utilizar el script para cambiar la contraseña de otras cuentas.

 

Haciendo un poco de historia, hace no mucho tiempo los administradores de sistemas se veían con la tediosa labor de cambiar la contraseña de administrador   de forma manual en todos sus ordenadores a su cargo. Cuando esta labor son 10-20 ordenadores no es algo tan complicado, pero. ¿Qué pasaría sin son mas de mil, o de dos mil? Exacto, al administrador le tocaría pasarse toda la semana cambiando contraseñas. Debido a ello en ese entonces ya se avanzo mucho en el tema de la automatización.

 

Y las cosas han evolucionado hasta el hecho de utilizar lenguajes de programación como VBScript (Visual Basic Script) para automatizar tareas.

 

En estos días toda esta misión de automatización se ha convertido en una tarea mucho más fácil debido a la introducción de PowerShell.

Por lo tanto, en esta ocasión vamos a ver cómo podemos cambiar la contraseña de administrador local para una serie de ordenadores usando un script de PowerShell.

Cambiar la contraseña de administrador con PowerShell

$password = Read-Host "Enter the password" -AsSecureString

$confirmpassword = Read-Host "Confirm the password" -AsSecureString

$pwd1_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))

$pwd2_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($confirmpassword))

if($pwd1_text -ne $pwd2_text) {

    Write-Error "Entered passwords are not same. Script is exiting"

    exit

}

Como podrías darte cuenta, en el código anterior se pide a confirmar la contraseña, con lo cual si no se ha introducido la contraseña correctamente el script se ejecutará de nuevo.

También se esta declarando que la contraseña sea un campo seguro, para que nadie pueda ver lo que se esta escribiendo en dicho campo.

Tras escribir la contraseña y confirmarla, las dos siguientes líneas de código dotnet, convierten estas dos líneas en texto plano para compararlos.

 

Si la comparación falla, el script finaliza, en caso contrario continua.

 

Ahora nosotros tenemos el password, ahora es el momento de leer la lista de equipos desde un archivo de texto.

 

Lista de lectura de los ordenadores

if(!(Test-Path $InputFile)) {

    Write-Error "File ($InputFile) not found. Script is exiting"

    exit

}

$Computers = Get-Content -Path $InputFile

 

Antes de leer el archivo de texto, estoy haciendo una comprobación para ver si ese archivo existe o no. Si el archivo no se encuentra, el script finaliza. De lo contrario, el script lee el contenido del archivo con el "cmdlet Get-Content" y almacena la lista de equipos en un array llamado "$Computers"

 

Ahora que ya tenemos la lista de equipos, podemos empezar a cambiar la contraseña de cada equipo. Eso es lo que el código de abajo no.

Cambiando la contraseña en varios equipos

foreach ($Computer in $Computers) {

    $Computer    =    $Computer.toupper()

    $Isonline    =    "OFFLINE"

    $Status        =    "SUCCESS"

    Write-Verbose "Working on $Computer"

    if((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {

Más sobre

        $Isonline = "ONLINE"

        Write-Verbose "`t$Computer is Online"

    } else { Write-Verbose "`t$Computer is OFFLINE" }

        try {

        $account = [ADSI]("WinNT://$Computer/Administrator, user")

        $account.psbase.invoke("setpassword", $pwd1_text)

        Write-Verbose "`tPassword Change completed successfully"

    }

    catch {

        $status = "FAILED"

        Write-Verbose "`tFailed to Change the administrator password. Error: $_"

    }

    $obj = New-Object -TypeName PSObject -Property @{

         ComputerName = $Computer

         IsOnline = $Isonline

         PasswordChangeStatus = $Status

    }

    $obj | Select ComputerName, IsOnline, PasswordChangeStatus

   

    if($Status -eq "FAILED" -or $Isonline -eq "OFFLINE") {

        $stream.writeline("$Computer `t $isonline `t $status")

    }

           

}

Aquí se puede apreciar que estoy recorriendo cada equipo que se encuentra en el array que hemos creado anteriormente ($Computers), y en primer lugar estamos verificando que cada equipo este online o no utilizando el cmdlet Test-Connection (Un cmdlet , pronunciado "command-let", es la unidad de funcionalidad más pequeña del Shell de administración de Exchange). Este cmdlet realiza un "ping" enviando un paquete ICMP al equipo destino. Si el ping es exitoso, el script cambia el password.

Para hacer esto yo estoy haciendo uso de la interfaz de Windows NT, que es famosa desde los días de VBScript.

Después de obtener la referencia a la cuenta del administrador invoco un método llamado " SetPassword" para cambiar la password. Si algo fallo durante el cambio de contraseña, el error será capturado por el bloque catch para que quede registrado.

 

Pues esto seria todo, si el script ha hecho su trabajo el resultado se vería por la consola.

image

 

Como podrías darte cuenta en la salida, el script crea una lista de equipos en los que la contraseña ha fallado. El archivo de " failed-computers.txt " se almacena en el directorio donde el script cogió la lista de equipos. Si desea proporcionar un directorio diferente en el que desea almacenar los archivos, sólo tiene que pasar el nombre del directorio al parámetro - OutputDirectory durante la ejecución del script.

Algunos consejos para el uso de este script

Utiliza el comando de tipo de "Get-Help. \ Update-LocalAdministratorPassword.ps1-detalladas" en una consola de PowerShell para obtener ayuda.

• Use la opción – Verbose desde   la línea de comandos si desea ver la información de depuración y mensajes de error en cada etapa.

• Pasar el nombre del archivo al script es opcional. El script le preguntará por el archivo si no lo has pasado.

• Utilizando este script puede cambiar la contraseña de cualquier cuenta local. Basta con sustituir "administrador" con el nombre de cuenta que desea cambiar la contraseña.

 

Si quieres aprender mucho más sobre los secretos de lo sistemas Microsoft Windows, deberías leer el libro de Sergio de los Santos "Máxima Seguridad en Windows: Secretos Técnicos" y, por último, te recordamos que si te ha gustado el artículo puedes suscribirte al Canal RSS de Windows Técnico para estar al día de las novedades e información técnica de interés.

 

Añade tu comentario

Comentarios de Cambia la contraseña del administrador de múltiples ordenadores con PowerShell

Nombre: (opcional)
Añade tu comentario:
Inserta el código de verificación:
 
 

Sobre esta noticia

Autor: Windowstecnico (169 noticias)

Fuente: windowstecnico.com

Visitas de esta noticia: 329

Tipo: Reportaje

Esta noticia se publica con licencia: Distribución gratuita

Regístrate en Globedia