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

Windows Técnico

Sindicación

Proximos HOLs

Loading...

 

clip_image001[4]

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 los 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 evolucionaron 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 confirmar la contraseña, con lo cual si no se ha introducido la contraseña correctamente tendremos que ejecutar el script 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)) {
        $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.



clip_image003[4]

 

 

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


El 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 deseáis ver el script completo haced clic aquí.

 

Si quieres aprender mucho más sobre los secretos de los 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. 

 

clip_image001[6]


Enviado feb 01 2012, 05:39 por Jhonattan Fiestas

Comentarios

José escrito re: Cambia la contraseña del administrador de múltiples ordenadores con PowerShell
en 02-02-2012 18:50

Muy buen post, Al ejecutarlo luego de validar el pass correctamente me arroja el siguiente error: No se puede enlazar el argumento al parametro ´Patch´ porque es Nulo.

¿que hago mal?

Gracias!!! :-))

José escrito re: Cambia la contraseña del administrador de múltiples ordenadores con PowerShell
en 02-02-2012 18:51

Muy buen post, Al ejecutarlo luego de validar el pass correctamente me arroja el siguiente error: No se puede enlazar el argumento al parametro ´Patch´ porque es Nulo.

¿que hago mal?

Gracias!!! :-))

Jhonattan Fiestas escrito re: Cambia la contraseña del administrador de múltiples ordenadores con PowerShell
en 02-02-2012 21:23

Hola Jose, en primer lugar gracias por el comentario.

Lo primero que te comentare es que al parecer en el post no se ve completamente la parte de:

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

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

ya que al no poder escribir todo ese texto en una sola linea de la pagina, solo queda visible una parte y la otra se queda solapada con el marco derecho de la pagina.

Sin embargo he cortado la linea por donde he visto que se podria comprender mejor la linea de codigo, y de esa forma mira si es eso lo que te falta y por lo cual no te funciona bien el script.

Por otro lado he agregado al post un enlace hacia el script completo, que despues de la explicacion aportada no deberia ser dificil de comprender.

Sin mas espero que la explicacion haya sido de ayuda y logres sacarle el maximo partido al script.

Si necesitas mas ayuda o sigue fallando el script no dudes en volver a comentar e intentaremos ver el motivo del fallo.

Un saludo

miguel escrito re: Cambia la contraseña del administrador de múltiples ordenadores con PowerShell
en 02-09-2012 23:55

Imagino que debe haber un dominio configurado en dicha red para que funcione el script. O con un grupo de trabajo, o sin nada mientras las direcciones ip estén en el mismo rango funcionaría, ¿?...

Muchas gracias y enhorabuena por la calidad del blog!

evil escrito re: Cambia la contraseña del administrador de múltiples ordenadores con PowerShell
en 01-16-2013 21:26

buenas tardes

muy bueno pero necesito cambiar la contraceña administrador a varios equipos con W7. esto funciona con este SO?

me interesa porque poseeo un proyecto de mas de 250 Equipos con W7

Añadir un comentario

(requerido)  
(opcional)
(requerido)  
Recordarme
If you can't read this number refresh your screen
Enter the numbers above: