Algunas características de PowerShell al usar cuentas de usuario

Pensé que era bastante bueno en powershell, pero nunca tuve que trabajar con credenciales de usuario. Sin embargo, ahora estoy en una búsqueda de trabajo y en una de las entrevistas me dieron una tarea de prueba para escribir un guión que se suponía que debía:

  1. Verifique la disponibilidad y el estado (habilitado / deshabilitado) de la cuenta de usuario.
  2. Compruebe si la cuenta está incluida en el grupo Administradores
  3. Si no hay una cuenta, cree una cuenta y agréguela al grupo de administradores, marque las casillas "Denegar cambio de contraseña por usuario" y "La contraseña no ha caducado"
  4. Si la cuenta existe, pero está deshabilitada o no está incluida en el grupo Administradores, habilite la cuenta y agréguela al grupo Administradores, marque las casillas junto a "Denegar el cambio de contraseña por el usuario" y "La contraseña no ha caducado"
  5. El script no debe depender del idioma del sistema operativo.


Pensé que no había nada complicado, y lo primero que decidí verificar fue el usuario administrador en mi computadora. Sin pensarlo dos veces, conduje un comando:

Get-User admin 

Y luego recibí un error

Get-User : "Get-User" , , .

Un poco desconcertado porque no reconocí un comando tan útil y descubrí que el comando Get-User solo funciona en la consola Powershell para Exchange. Para trabajar con usuarios locales, debe usar Get-Localuser y para usuarios de dominio Get-Aduser . Al darme cuenta de mi error, entré:

 Get-Localuser admin 

Y obtuve una respuesta

 Name Enabled Description ---- ------- ----------- Admin True     / 

Bueno, ahora no es un gran problema verificar si el usuario está allí o no, pero aquí nuevamente estaba esperando otra captura. Usar la instrucción condicional if else no resultó ser tan fácil.

El hecho es que si el usuario está en el sistema, entonces la salida no es el valor verdadero, sino que un conjunto completo de datos, con el nombre, la descripción del usuario, está habilitada o no. Y si no hay usuario, powershell arroja un error. Después de deambular por Internet, descubrí que para estos fines es mejor usar el operador try catch .

 $user = 'admin' try { Get-LocalUser $user -ErrorAction Stop | Out-Null write-host  $user  -foregroundcolor Green } Catch { write-host  $user  -foregroundcolor Red } 

Agregué la variable $ user para facilitar el cambio de nombres de usuario en todo el script. ErrorAction Stop es necesario para que el script no se interrumpa en este paso debido a un error. Signo | separa los pasos de la canalización y Out-Null ocultará la salida del texto de error. También agregué salida de texto con resaltado, para la conveniencia de verificar el script.

A continuación, quería verificar si la cuenta está habilitada o deshabilitada. Como ya dije, el comando Get-LocalUser produce un conjunto completo de datos y para la verificación, necesitaba seleccionar solo un parámetro habilitado con un valor de verdadero o falso. Para hacer esto, utilicé el siguiente comando:

 (Get-LocalUser $user).enabled 

Después de asegurarme de que funciona, hice la siguiente comprobación y agregué un comando de habilitación de usuario.

 $user = 'admin' if ((Get-LocalUser $user).enabled -eq "True") { write-host    -foregroundcolor Green } else { write-host    -foregroundcolor Red Enable-LocalUser $user write-host    -foregroundcolor Green } 

Para habilitar al usuario, es naturalmente necesario ejecutar la consola con derechos de administrador.

En el segundo párrafo de la tarea, fue necesario determinar si el usuario está en el grupo de administradores. Para verificar si un usuario está en un grupo particular, hay un comando Get-LocalGroupMember. Sin embargo, el nombre del grupo de administradores varía según el idioma del sistema operativo. Por lo tanto, tuve que usar el SID estándar S-1-5-32-544. También revisé a través de un intento de captura.

 $user = 'admin' try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host  $user     -foregroundcolor Green } Catch { write-host  $user      -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host  $user     -foregroundcolor Green } 

Si el usuario no es miembro del grupo, se agregarán administradores.
En la siguiente etapa, tuve la tarea de determinar si el usuario tiene la configuración de cambio de contraseña deshabilitada o no. Luego me encontré con otras trampas. El hecho es que si el usuario tiene una contraseña ilimitada, el parámetro PasswordExpires no devuelve ningún valor. Y si esta casilla de verificación está desactivada, los diferentes usuarios tendrán una fecha de cambio de contraseña diferente. Todavía se me ocurrió salir de esta situación:

 if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host      -foregroundcolor Green } else { write-host     -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host      -foregroundcolor Green } 

Luego, necesitaba crear un usuario. Tampoco esperaba que una captura me estuviera esperando aquí. Al crear un usuario con el comando

 new-LocalUser -User $user -password P@ssW0rD! 

Error devuelto:

"Password". "P@ssW0rD!" "System.String" "System.Security.SecureString".

El hecho es que el parámetro -password debe usar SecureString, en lugar de la cadena de texto habitual. Para hacer esto, hice la variable $ contraseña y la convertí en cadena de seguridad.

 $password = convertto-securestring "P@ssW0rD!" -asplaintext -force 

Y el script en sí para crear un usuario y agregarlo al grupo de administradores

 new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user 

El script terminado que tiene en cuenta todas las condiciones que obtuve de esta manera:

 $user = 'admin' $password = convertto-securestring "P@ssW0rD!" -asplaintext -force try { Get-LocalUser $user -ErrorAction Stop | Out-Null cls write-host  $user  -foregroundcolor Green if ((Get-LocalUser $user).enabled -eq "True") { write-host    -foregroundcolor Green } else { write-host    -foregroundcolor Red Enable-LocalUser $user write-host    -foregroundcolor Green } if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host      -foregroundcolor Green } else { write-host     -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host      -foregroundcolor Green } try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host  $user     -foregroundcolor Green } Catch { write-host  $user      -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host  $user     -foregroundcolor Green } } Catch { cls write-host  $user  -foregroundcolor Red new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host  $user       -foregroundcolor Green } 

Post scriptum

Sin embargo, almacenar la contraseña de administrador en un script no es la mejor práctica de seguridad. Para hacer esto, puede usar el hash de contraseña, no la contraseña en sí.

 $user = 'admin1' $hash = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000048baf1b47a72d845b4eeda8659da9fd70000000002000000000010660000000100002000000004d2a3bf03aac92c2e172dc002d1fe8759da4655850462aface5c25f52921e05000000000e8000000002000020000000bfa652b6f7cc6845e3cee1831b54ab93dc272d0b2203024c3de8bc4789a2698a10000000923fb50dcf01125913534d0c1ba6d827400000002757df7d8a8b39c8e84b81323acff1d72419580a0022cf610926e5f081a2e895320088d482eb407f8157aad82f091abee7427b357e871d12238a8f74131238e7" $hash $password = ConvertTo-SecureString -String $hash $password new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user 

Para obtener un hash de contraseña, puede usar el siguiente script

 $Secure = Read-Host -AsSecureString $Secure $hash = ConvertFrom-SecureString -SecureString $Secure $hash 

Que pide una contraseña desde el teclado.

Y una pequeña bonificación para mostrar todos los registros deshabilitados

 Get-LocalUser | Where-Object {$_.enabled -eq $false} 

Espero que el tiempo que pase ayude a alguien en su trabajo. Y para usted será útil no olvidar esta invaluable experiencia.

Source: https://habr.com/ru/post/es418859/


All Articles