Contenidos
- ¿Más ejercicios sobre usuarios en PowerShell?
- Introducción
- Características
- Usuarios
- Grupos
¿Más ejercicios sobre usuarios en PowerShell?
Introducción
Los sistemas operativos actuales se pueden utilizar por uno o varios usuarios, en algunos sistemas pueden hacerlo simultáneamente y en otros no (aunque siempre existe la posibilidad de acceder remotamente a un equipo utilizando credenciales). Los usuarios se pueden crear localmente o en red, la gestión de usuarios locales sólo afecta al equipo desde el que se crean, modifican, eliminan, etc.
Los usuarios locales sólo sirven para iniciar sesión o acceder a recursos en el propio equipo, en cambio los usuarios en red pueden iniciar sesión (entrar) en cualquier equipo de la red.
En la mayoría de los sistemas operativos, las personas que los utilizan necesitan autenticarse mediante una cuenta de usuario y, además, tener autorización para utilizar recursos como, por ejemplo, un archivo, una carpeta, un dispositivo, etc. Cuando hablamos de recursos, nos referimos a un elemento del sistema operativo que se puede controlar.
Algunas de las gestiones sobre usuarios y grupos que veremos hacen referencia a configuraciones propias de sistemas operativos en red (Windows Server) con instalaciones de un Directorio Activo (Active Directory).
Más información
Características
Las principales características que están relacionadas con la gestión de usuario y grupos son (algunas características hacen referencia a sistemas operativos clientes y otras a servidores, aunque la mayoría a ambos):
- Cuenta de usuario
- Listas de control de acceso
- Control de cuentas de usuario
- Ejecutar como
- Perfil de usuario
- Directivas de Grupo
Cuenta de usuario
La cuenta de usuario consiste en un nombre de usuario y una contraseña (password), en algunos sistemas operativos estos dos elementos forman un conjunto de credenciales y sirven para identificar a una persona.
Utilizar contraseñas es un método para autenticarse, pero no es el único, hay otros métodos como, por ejemplo, el uso de tarjetas inteligentes que tiene la identidad grabada.
Las contraseñas deben satisfacer unos requisitos de complejidad, con los siguientes ejemplos tenemos algunos requisitos que deberían cumplir:
- La contraseña tiene una longitud correcta.
- La contraseña no aparece en los buscadores.
- La contraseña no debe aparecer en un diccionario.
- La contraseña no tiene un hash que aparece en los buscadores.
Más información
- https://www.jesusninoc.com/08/27/contrasenas-seguras-con-powershell-generar-contrasenas-seguras/
- https://www.jesusninoc.com/07/03/contrasenas-seguras-con-powershell-longitud-de-la-contrasena/
- https://www.jesusninoc.com/10/20/contrasenas-seguras-con-powershell-la-contrasena-aparece-en-el-diccionario-de-la-rae/
- https://www.jesusninoc.com/07/07/contrasenas-seguras-con-powershell-convertir-en-hash-una-contrasena/
- https://www.jesusninoc.com/07/05/contrasenas-seguras-con-powershell-la-contrasena-aparece-en-google/
- https://www.jesusninoc.com/07/06/contrasenas-seguras-con-powershell-la-contrasena-aparece-en-un-diccionario/
Los usuarios tienen distintos privilegios y restricciones, el usuario que más privilegios tiene es el administrador.
Ver cuentas de usuarios en el sistema
Get-LocalUser
Listas de control de acceso
Para utilizar recursos se requiere tener autorización, cada recurso tiene una lista donde aparecen los usuarios que pueden usar dicho recurso, estas listas se conocen como ACL (Access Control List, o Lista de control de acceso).
El funcionamiento es el siguiente: cuando un usuario intenta acceder a un recurso, éste comprueba en la lista de control de acceso si el usuario tiene permiso o no para utilizarlo. La lista de control de acceso se compone de identificadores de seguridad (SID, Security IDentifier) y permisos.
Los identificadores de seguridad son unos valores únicos de longitud variable que se utilizan para identificar a usuarios y grupos.
Ver el SID de un usuario
$objUser = New-Object System.Security.Principal.NTAccount("juan") $SID = $objUser.Translate([System.Security.Principal.SecurityIdentifier]) $SID.Value # Otra forma de ejecutarlo ([System.Security.Principal.NTAccount]("juan")).Translate([System.Security.Principal.SecurityIdentifier])
Más información
Control de cuentas de usuario
El Control de Cuentas de Usuario (en inglés se denomina UAC significan User Account Control) es una tecnología e infraestructura de seguridad que Microsoft introdujo con Windows Vista ahora presente en todas las versiones de Windows. Su objetivo es mejorar la seguridad de Windows al impedir que aplicaciones maliciosas hagan cambios no autorizados en el ordenador.
Esta característica de seguridad informa a los usuarios mediante mensajes sobre los cambios que se realizan en el equipo, las notificaciones se pueden configurar y pueden ser las siguientes:
- Notificar siempre. Notifica mediante un mensaje cuando un programa intenta instalar algo o realizar cambios en el equipo. También notifica si se realizan cambios en la configuración de Windows. Cuando se produce una notificación, el escritorio se atenúa (el escritorio permanece bloqueado y no se puede realizar ninguna acción).
- Predeterminado. Notifica cuando un programa intenta realizar cambios en el equipo atenuando el escritorio.
- Notificar cuando un programa intenta realizar cambios en el escritorio sin atenuar el escritorio.
- No notificar nunca los cambios que se realizan en el equipo.
Las notificaciones son distintas dependiendo del tipo de usuario que haya iniciado la sesión, en el caso de ser administrador, se solicita aceptar o denegar; si es un usuario normal, se solicitan las credenciales del administrador (usuario y contraseña).
Ejemplo
Ver el valor de la UAC (User Account Control, Control de Cuentas de Usuario)
cd HKLM:\ $RegKey ='HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system' Get-ItemProperty -Path $RegKey | select EnableLUA
Más información
- https://www.jesusninoc.com/01/15/deshabilitar-uac-desde-powershell/
- https://www.jesusninoc.com/02/04/ejercicios-de-powershell-intentar-saltar-la-uac-simulacion/
- https://www.jesusninoc.com/03/22/bypasses-uac-by-abusing-the-app-path-key-for-control-exe-only-tested-on-windows-10/
Ejecutar como
Iniciar sesión con credenciales de administrador puede suponer un riesgo para la seguridad del sistema operativo y de la red (en el caso de que el ordenador forme parte). El riesgo se debe a que los usuarios administradores pueden realizar cualquier tipo de cambio en el sistema y puede darse el caso de que el administrador ejecute un programa dañino para el sistema como, por ejemplo, un virus, por este motivo, es recomendable iniciar sesión con usuarios no administradores.
En PowerShell se pueden ejecutar cmdlets como administrador mediante el parámetro -Verb y el valor runAs
-Verb runAs
Ejemplo
Iniciar Windows PowerShell como administrador
Start-Process -FilePath "powershell" -Verb runAs
También se pueden ejecutar los cmdlet con los credenciales de otros usuarios con el cmdlet
Get-Credential
Ejemplos
Almacenar credenciales en una variable
$credencial = Get-Credential -Message Credenciales
Utilizar credenciales para ver la versión de la BIOS
$credencial = Get-Credential (Get-WmiObject Win32_BIOS -ComputerName ('localhost') -Credential $credenciales).Version
Más información
Perfil de usuario
Los perfiles de usuario definen entornos de escritorio personalizados, en ellos se incluye la configuración de cada usuario como, por ejemplo, la configuración de la pantalla, las conexiones de red y de impresoras, otras configuraciones especificadas, etc. El usuario o el administrador del sistema pueden definir las características del entorno del escritorio. La personalización del entorno de escritorio efectuada por un usuario no afecta a la configuración del resto de los usuarios.
Cuando los usuarios inician de nuevo la sesión en sus estaciones de trabajo, reciben la configuración de escritorio que tenían al terminar la última sesión.
Los perfiles de usuario se pueden ver utilizando la siguiente llamada WMI
Get-WmiObject Win32_UserProfile
Ejemplo
Ver la ruta de los perfiles de usuario
Get-WmiObject Win32_UserProfile | Select-Object LocalPath
En PowerShell se puede configurar el perfil que se utiliza cuando se inicia una sesión de consola o cuando se inicia PowerShell_ISE.
Ejemplo
Cargar un mensaje de bienvenida en el perfil de usuario en PowerShell
#Para poder utilizar el fichero del perfil es necesario habilitar la ejecución de scripts New-Item -Path $Profile.CurrentUserAllHosts -ItemType File -Force 'Write-Host "Buenos días"' | Add-Content -Path $Profile.CurrentUserAllHosts -Encoding Default
Directivas de Grupo
Las directivas permiten a los administradores configurar el sistema operativo, estas configuraciones se pueden hacer en local o en red, en este apartado veremos las dos configuraciones. Las configuraciones de Directivas de Grupo se realizan desde los servidores (Windows Server) y se aplican a los equipos clientes.
Las directivas locales se administran desde cualquier equipo abriendo la aplicación «Editar directivas de grupo local».
En general las directivas modifican el registro de Windows.
Algunos ejemplos de configuraciones de directivas de grupo:
- Ejecución de programas al iniciar sesión
- Ocultar unidades locales
- Bloquear el símbolo del sistema
- Bloquear el acceso al panel de control
- Bloquear la pantalla pasados unos minutos
- Cambiar el papel tapiz
- Restringir el uso de unidades ópticas
- Ejecución de un script
- Mapear unidades
Usuarios
Las personas que quieren utilizar un sistema operativo necesitan disponer de un nombre de usuario y una contraseña.
Los usuarios deberían ser únicos e individuales aunque a veces no es así, esto conlleva un importante riesgo de seguridad porque no se identifica correctamente a los usuarios dentro del sistema.
Para crear un usuario es necesario tener permisos especiales, no todos los usuarios pueden crear otros usuarios.
A la hora de crear un usuario hay que seguir algunas normas que facilitarán recordar los nombres y llevar un correcto control.
Cuando se instala el sistema operativo Windows se crean cuentas por defecto que van a permitir utilizarlo, son las siguientes:
- Cuenta de administrador. Tiene control total sobre el sistema operativo y puede realizar tareas como crear otras cuentas de usuarios, asignar permisos, ejecutar, instalar, borrar, etc. Esta cuenta se tiene que utilizar sólo en momentos puntuales. Una recomendación es mantener la cuenta con una contraseña segura, también cambiarle el nombre, pues el nombre que la cuenta utiliza por defecto es demasiado conocido.
- Cuenta de invitado. Es una cuenta que pueden utilizar los usuarios que no tienen una cuenta en el sistema operativo, esta cuenta tiene restringida la instalación de programas o hardware, así como cambiar cualquier configuración o contraseña. Esta cuenta está desactivada por defecto, es necesario activarla para poder utilizarla.
Como hemos dicho, el usuario administrador puede hacer de todo mientras que el usuario limitado tiene ciertas restricciones, puede, por ejemplo, ejecutar programas que ha instalado el administrador, pero él no puede instalarlos, tampoco tiene acceso a los archivos de otros usuarios.
Además de las cuentas que vienen instaladas por defecto en el sistema operativo, también se pueden crear otras cuentas. Los usuarios pueden ser administradores o usuarios limitados.
Ejemplo
Ver el usuario actual que ha iniciado sesión
([System.Security.Principal.WindowsIdentity]::GetCurrent()).name
Las operaciones con usuarios son tareas de administración que sólo pueden ser realizadas por usuarios administradores.
Las operaciones que se pueden realizar con los usuarios son:
Ver o listar usuarios
Mediante cmdlets
Get-LocalUser
Parámetros y alias de los parámetros para el cmdlet Get-LocalUser
Name {} SID {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv}
Mediante ADSI (Active Directory Service Interfaces)
$adsi = [ADSI]"WinNT://$env:COMPUTERNAME" $adsi.Children | Where-Object {$_.SchemaClassName -eq 'user'}
Mediante WMI (Windows Management Instrumentation)
Get-WmiObject Win32_UserAccount Get-WmiObject -Query "SELECT * FROM Win32_UserAccount"
También se pueden ver usuarios en equipos remotos mediante
Get-WmiObject Win32_UserAccount -ComputerName equipo2 -Credential usuario
Ejercicios avanzados
Ejercicios de PowerShell: crear una función que almacene los usuarios que están en el equipo y los guarde en formato QR
Ejercicios de PowerShell: crear un QR con los nombres de los usuarios que hay en el sistema y crear los usuarios nuevamente leyendo el código QR generado anteriormente
Más información
- https://www.jesusninoc.com/02/27/validar-credenciales-de-usuario-en-el-propio-ordenador-pidiendo-al-usuario-el-nombre-y-la-contrasena/
- https://www.jesusninoc.com/02/27/validar-credenciales-de-usuario-en-el-propio-ordenador-desde-powershell/
Crear usuarios
Mediante cmdlets
Para crear un usuario es necesario hacerlo como administrador y no hay que olvidar poner contraseña
#Ejecutar PowerShell como administrador #Crear la contraseña con SecureString $pass=ConvertTo-SecureString "11234aaa@@€dsf" -asplaintext -force #Crear usuario con contraseña New-LocalUser usuario -Password $pass
Parámetros y alias de los parámetros para el cmdlet New-LocalUser
AccountExpires {} AccountNeverExpires {} Description {} Disabled {} FullName {} Name {} Password {} NoPassword {} PasswordNeverExpires {} UserMayNotChangePassword {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf}
Mediante ADSI
##Ejecutar PowerShell como administrador $adsi = [ADSI]"WinNT://$env:COMPUTERNAME" $usuario = $adsi.Create('User', 'usuario') $usuario.SetPassword('[email protected]') $usuario.Put("description","Descripción usuario") $usuario.SetInfo()
El tema de la contraseña es importante y no se puede poner contraseñas que sea sencillo adivinar.
Para generar contraseñas seguras desde PowerShell podemos utilizar el siguiente código
$Assembly = Add-Type -AssemblyName System.Web [System.Web.Security.Membership]::GeneratePassword(10,3)
Más información
- https://www.jesusninoc.com/01/14/ejercicios-de-powershell-crear-usuarios-leyendo-de-un-fichero-xml/
- https://www.jesusninoc.com/01/14/ejercicios-de-powershell-crear-usuarios-con-nombres-aleatorios-utilizando-un-api-que-devuelve-el-resultado-en-formato-json/
- https://www.jesusninoc.com/03/13/ejercicios-de-powershell-restaurar-usuarios-que-se-han-creado-anteriormente-se-almacenan-en-un-fichero-y-se-vuelven-a-crear/
- https://www.jesusninoc.com/01/12/ejercicios-de-powershell-crear-usuarios-leyendo-de-un-fichero-el-user-y-password/
- https://www.jesusninoc.com/06/29/crea-un-nuevo-usuario-de-active-directory-en-azure/
Cambiar contraseña a un usuario
Mediante cmdlets
#El usuario tiene que existir $pass2=ConvertTo-SecureString "11234aaaf" -asplaintext -force Set-LocalUser -Name usuario -Password $pass2
Mediante ADSI
$usuario = [ADSI]"WinNT://$env:COMPUTERNAME/usuario,User" $usuario.description ='Contraseña cambiada al usuario' $usuario.SetPassword('[email protected]') $usuario.SetInfo()
Ejemplo
Cambiar la contraseña a un usuario
$pass2=ConvertTo-SecureString "11234aaaf" -asplaintext -force Set-LocalUser -Name juanito -Password $pass2
Modificar usuario
Mediante cmdlets
Set-LocalUser -Name usuario -Description "Usuario Nuevo"
Parámetros y alias de los parámetros para el cmdlet Set-LocalUser
AccountExpires {} AccountNeverExpires {} Description {} FullName {} InputObject {} Name {} Password {} PasswordNeverExpires {} SID {} UserMayChangePassword {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf}
Mediante ADSI
$usuario = [ADSI]"WinNT://$env:COMPUTERNAME/usuario,User" $usuario.description ='Descripción usuario nueva' $usuario.SetInfo()
Eliminar usuario
Mediante cmdlets
# Es necesario abrir PowerShell como administrador Remove-LocalUser usuario
Parámetros y alias de los parámetros para el cmdlet Remove-LocalUser
InputObject {} Name {} SID {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf}
Mediante ADSI
$usuario = [ADSI]"WinNT://$env:COMPUTERNAME" $usuario.Delete("User","usuario")
Más información
Utilizar credenciales
Almacenar credenciales
Cmdlet
Get-Credential
Parámetros y alias de los parámetros para el cmdlet Get-Credential
Credential {} Message {} UserName {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv}
Ejemplo
Almacenar credenciales en un fichero XML
Get-Credential | Export-Clixml -Path credenciales.xml
Utilizar credenciales almacenados
$credenciales=Import-Clixml -Path credenciales.xml #Utilizar credenciales en otro equipo remoto Get-WmiObject -Class Win32_BIOS -ComputerName 192.168.1.2 -Credential $credenciales
Grupos
Un grupo es un conjunto de usuarios que simplifica la administración y la asignación de permisos, concediendo permisos sobre recursos a todo un grupo de usuarios a la vez, en lugar de concederlos a cuentas de usuarios individuales. Los usuarios pueden pertenecer o no pertenecer a uno o varios grupos distintos.
En Windows los usuarios se pueden asociar en grupos y de esta forma se pueden asignar permisos para el acceso a determinados recursos. Los grupos locales predeterminados se crean automáticamente al instalar el sistema operativo.
La pertenencia a un grupo local supone para el usuario tener los permisos y la capacidad de realizar diversas tareas en el equipo local. Los grupos que por defecto se crean al instalar el sistema operativo son:
- Administradores. Los miembros de este grupo tienen control total del equipo, pueden asignar permisos a los usuarios según sea necesario.
Operadores de copia de seguridad. Los miembros de este grupo pueden hacer copias de seguridad, aunque los permisos de las carpetas que se van a copiar no lo permitan. - Operadores criptográficos. Los miembros de este grupo pueden realizar operaciones criptográficas.
- Usuarios COM distribuido. Los miembros de este grupo pueden iniciar, activar y usar objetos COM distribuidos.
- Invitados. Los miembros de este grupo disponen de un perfil temporal que se crea al iniciar la sesión y que se elimina cuando el miembro la cierra. La cuenta Invitado (que está deshabilitada de forma predeterminada) también es miembro del grupo de forma predeterminada.
- Usuarios. Los miembros del grupo Usuarios pueden realizar tareas habituales, como ejecutar aplicaciones, usar impresoras locales y de red, y bloquear el equipo. Los miembros de este grupo no pueden compartir directorios ni crear impresoras locales.
- Otros grupos. IIS_IUSRS, Operadores de configuración de red, Usuarios del registro de rendimiento, Usuarios del monitor de sistema, Usuarios avanzados, Usuarios de escritorio remoto, etc.
Las operaciones con usuarios son tareas de administración que sólo pueden ser realizadas por usuarios administradores. Las operaciones que se pueden realizar con los usuarios son:
Ver o listar grupos
Mediante cmdlets
Get-LocalGroup
Parámetros y alias de los parámetros para el cmdlet Get-LocalGroup
Name {} SID {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv}
Mediante ADSI (Active Directory Service Interfaces)
$adsi = [ADSI]"WinNT://$env:COMPUTERNAME" $adsi.Children | Where-Object {$_.SchemaClassName -eq 'group'} | Select-Object name
Mediante WMI (Windows Management Instrumentation)
Get-WmiObject Win32_Group Get-WmiObject -Query "SELECT * FROM Win32_Group"
Crear grupos
Mediante cmdlets
Para crear un grupo es necesario hacerlo como administrador
# Es necesario abrir PowerShell como administrador New-LocalGroup grupo
Parámetros y alias de los parámetros para el cmdlet New-LocalGroup
Description {} Name {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf}
Mediante ADSI
$adsi = [ADSI]"WinNT://$env:COMPUTERNAME" $grupo = $adsi.Create('Group', 'grupo') $grupo.SetInfo()
Más información
- https://www.jesusninoc.com/11/24/crear-un-grupo-local-en-windows-10-con-powershell-5-1/
- https://www.jesusninoc.com/06/29/crea-un-nuevo-grupo-de-active-directory-en-azure/
Añadir usuarios a grupos
Mediante cmdlets
Add-LocalGroupMember -Member usuario -Group administradores Get-LocalGroupMember administradores
Parámetros y alias de los parámetros para el cmdlet Add-LocalGroupMember
Group {} Member {} Name {} SID {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf}
Mediante ADSI
$grupo = [ADSI]"WinNT://$env:COMPUTERNAME/administradores,group" $grupo.add("WinNT://usuario,user")
Más información
- https://www.jesusninoc.com/12/02/anadir-usuarios-a-un-grupo-local-en-windows-10-con-powershell-5-1/
- https://www.jesusninoc.com/01/14/ejercicios-de-powershell-crear-varios-usuarios-leyendo-de-un-fichero-y-anadirlos-al-grupo-de-administradores/
Eliminar usuarios de grupos
Mediante cmdlets
Remove-LocalGroupMember -Member usuario -Group grupo
Parámetros y alias de los parámetros para el cmdlet Remove-LocalGroupMember
Group {} Member {} Name {} SID {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf}
Mediante ADSI
$grupo = [ADSI]"WinNT://$env:COMPUTERNAME/grupo1,group" $grupo.Remove("WinNT://juan,user")
Ejemplo
Eliminar un usuario de un grupo
# Es necesario abrir PowerShell como administrador Remove-LocalGroupMember -Member juanito -Group administradores
Eliminar grupos
Mediante cmdlets
Remove-LocalGroup grupo
Parámetros y alias de los parámetros para el cmdlet Remove-LocalGroup
InputObject {} Name {} SID {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf}
Mediante ADSI
$grupo = [ADSI]"WinNT://$env:COMPUTERNAME" $grupo.Delete("Group","grupo")
Ejemplo
Eliminar un grupo de usuarios
# Es necesario abrir PowerShell como administrador Remove-LocalGroup ventas