Búsqueda de sitios web

Administrar el administrador local con PowerShell


En la HTA, utilicé ADSI para conectarme a la computadora remota y obtener la cuenta de administrador local. El objeto que obtiene tiene una propiedad PasswordAge que es el número de segundos desde que se cambió la contraseña. Así que aquí hay un ejemplo de código.

$computers="chi-win8-01","chi-win81","chi-core01","chi-fp02","chi-hvr2"
$account="administrator"
#get password age
$computers | foreach {
 [int]$Age = ([adsi]"WinNT://$_/$account,user").passwordage.value/86400
 $LastChange=(Get-Date).AddHours(-$age)
 New-Object -TypeName PSObject -Property @{
  Computername = $_
  Account = $Account
  Age = $Age
  LastChange = $LastChange
 }
}

En este ejemplo, estoy definiendo una lista de nombres. Pero puedes leer fácilmente el contenido de un archivo de texto con Get-Content o consultar Active Directory. Debido a que es posible que haya cambiado el nombre de la cuenta de administrador, o tal vez necesite verificar una cuenta local diferente, he creado una variable para el nombre de la cuenta. Luego, PowerShell toma cada nombre de computadora y crea una conexión ADSI a la cuenta de administrador, obteniendo el valor de la contraseña y dividiéndolo por la cantidad de segundos en un día. Entonces $Age se convierte en la antigüedad de la contraseña de la cuenta en días. Como PowerShell tiene que ver con los objetos, creo un objeto personalizado con información relevante. Aquí está el resultado.

Quizás se pregunte por qué utilicé ForEach-Object en lugar del enumerador ForEach. Esto se debe a que este último no escribe nada en la canalización y es posible que desee guardar los resultados en un archivo de texto o exportarlos a un CSV.

$computers="chi-win8-01","chi-win81","chi-core01","chi-fp02","chi-hvr2"
$account="administrator"
#get password age
$computers | foreach {
 [int]$Age = ([adsi]"WinNT://$_/$account,user").passwordage.value/86400
 $LastChange=(Get-Date).AddHours(-$age)
 New-Object -TypeName PSObject -Property @{
  Computername = $_
  Account = $Account
  Age = $Age
  LastChange = $LastChange
 }
} | Export-CSV -path c:\work\local-admin-report.csv -notypeinformation

Tenga en cuenta que simplemente estoy demostrando algunos ejemplos de PowerShell. Lo ideal sería crear una herramienta para obtener la información de la contraseña que pudiera combinar con otras herramientas de PowerShell. De hecho, lo que te he dado ya está cerca de ser una función, pero te dejaré ver si puedes resolverlo. Desea poder ejecutar un comando como este:

get-content computers.txt | get-localpasswordAge | export-csv -path c:\work\age.csv

El comando del medio es la herramienta que construirás.

Ahora bien, ¿qué pasa con el cambio de contraseña? Esto también se puede lograr con un comando de una línea.

([adsi]"WinNT://COMPUTER01/administrator,user").setpassword("P@ssw0rd")

Si quisiera cambiar la contraseña de todas las máquinas sobre las que informó, no le tomaría mucho trabajo modificar el código "obtener". Como puede ver, usar ADSI en PowerShell es tan fácil, si no más, que usarlo en VBScript.

Hay algunas advertencias:

  • No olvide que el apodo de WinNT distingue entre mayúsculas y minúsculas.
  • No existe una forma sencilla de utilizar credenciales alternativas.
  • No hay soporte WhatIf, a menos que escriba un script que lo proporcione.

Mis ejemplos de código aquí tienen como objetivo ser educativos. Debería tomarse el tiempo para crear y probar una solución más sólida según sus necesidades. Entonces, la próxima vez que crea que necesita VBScript, deténgase y avance a PowerShell Place.

Artículos relacionados