Usando PowerShell Dinámico para Obtener Usuarios Actuales

Cuando trabajas con Windows, en algún momento probablemente necesitarás saber qué cuentas de usuario están actualmente conectadas a una computadora. Afortunadamente, puedes utilizar PowerShell para obtener los usuarios actuales en computadoras locales o remotas.

¿Tienes contraseñas comprometidas en tu Active Directory? Descúbrelo con Specops Password Auditor Free.

En este tutorial, aprenderás varias formas de usar PowerShell para obtener los usuarios actuales en una computadora. Los métodos que aprenderás incluirán comandos nativos, clases .NET, y cmdlets específicos de Windows Management Instrumentation (WMI).

¿Estás listo para descubrir quién está merodeando en tu computadora? ¡Comencemos!

Requisitos previos

En este tutorial, aprenderás mejor siguiendo los ejemplos. Y para hacerlo, necesitarás una computadora que funcione con cualquier versión moderna de Windows, como Windows 10, Windows Server 2012 o posterior.

Este tutorial utilizará una computadora con Windows Server 2019 llamada DC1.

¿Por qué usar PowerShell para obtener usuarios actuales conectados a una computadora?

Es cierto que hay formas de iniciar sesión en un equipo sin PowerShell. Después de todo, los administradores del sistema debían tener alguna manera de hacerlo incluso antes de PowerShell, ¿verdad? Si es así, ¿por qué usar PowerShell?

Hacer la misma tarea en PowerShell tiene ventajas al tratar los resultados como objetos que se pueden manipular. Por ejemplo, si ejecutas un script que solicita las credenciales del usuario, PowerShell puede poblar programáticamente el nombre de usuario, y solo necesitas escribir la contraseña manualmente.

Otro ejemplo del mundo real es exportar la lista de usuarios actualmente conectados a un servidor a un archivo. Se hace utilizando PowerShell para obtener los usuarios actuales y luego exportar el resultado a archivos CSV, HTML o XML. Después, varios flujos de trabajo de automatización pueden utilizar esta salida.

Puede haber miles de razones para usar PowerShell para obtener usuarios actuales, pero al final todo se reduce a tus necesidades. Y este tutorial te enseñará las diferentes formas de lograr ese objetivo.

Consultando la Clase Win32_ComputerSystem

Comencemos con los cmdlets nativos de PowerShell llamados Get-WMIObject y Get-CimInstance. Estos cmdlets te permiten consultar información, incluido el usuario actualmente conectado, utilizando las clases de Instrumentación de Administración de Windows (WMI) en un equipo local o remoto.

Get-WMIObject es el cmdlet más antiguo (obsoleto) y solo está disponible hasta Windows PowerShell 5.1. Por otro lado, Get-CIMInstance es el cmdlet más nuevo y seguro, y está disponible hasta las últimas versiones de PowerShell.

Para obtener más información, visita Get-CIMInstance Vs. Get-WMIObject: ¿Cuál es la diferencia?

Para obtener el usuario actual mediante PowerShell, invoca el cmdlet dirigido a la clase Win32_ComputerSystem. La clase Win32_ComputerSystem incluye diversas propiedades, entre ellas la propiedad Username. Para hacerlo, abre una ventana de PowerShell y ejecuta los comandos a continuación.

# Utilizando el cmdlet Get-WMIObject y retornando solo la propiedad Username
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# Utilizando el cmdlet Get-CimInstance y retornando solo la propiedad Username
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

Nota: Consultar la clase Win32_ComputerSystem solo devolverá el nombre de usuario de quien haya iniciado sesión directamente en la computadora (sesión de consola). Si el usuario ha iniciado sesión de forma remota (por ejemplo, Escritorio remoto), el nombre de usuario estará en blanco.

Ambos comandos devuelven el mismo resultado, como se muestra a continuación. Si el usuario actual es una cuenta de dominio, el comando devolverá el dominio y el nombre de usuario (dominio\nombredeusuario). Pero para una cuenta de usuario local, la salida sería computadora\nombredeusuario.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject y Get-CimInstance tienen un parámetro llamado -computerName, que acepta el nombre de la computadora para consultar. El uso de este parámetro significa que puedes consultar la misma información desde una máquina remota en la red.

Pero si solo necesitas obtener el nombre de usuario sin el dominio, una solución es dividir la salida usando el método split(). Para hacerlo, ejecuta el siguiente comando en PowerShell.

# El comando a continuación dividirá la propiedad del nombre de usuario en dos usando el carácter de barra invertida '\' como delimitador.
# La parte [1] al final indica al comando que devuelva solo el resultado en el índice 1.
# Los índices comienzan con 0, lo que significa que especificar el índice 1 mostrará el resultado en la segunda posición.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

Como resultado, PowerShell devuelve solo la parte del usuario, como se muestra en la captura de pantalla a continuación.

Splitting the username property

Leyendo las Variables de Entorno de Windows

Otra forma de usar PowerShell para obtener el usuario actual en una computadora es recuperar valores de las variables de entorno. Las variables de entorno representan los datos del sistema operativo, incluido el nombre de usuario del usuario actual, entre otros.

Hay tres formas de interactuar con las variables de entorno. Cualquiera que elijas devolverá el mismo resultado.

El controlador de PowerShell para Env

PowerShell almacena en caché las variables de entorno y las pone a disposición a través de un controlador de PowerShell (PSDrive) llamado el controlador Env:. Los controladores PSDrive son ubicaciones de datos a las que se puede acceder como una unidad en la computadora (por ejemplo, C:), pero solo son accesibles dentro de PowerShell.

PowerShell crea automáticamente la unidad Env: tan pronto como abres una sesión de PowerShell. Y debido a que Env: es una unidad, puedes obtener su contenido invocando el cmdlet Get-ChildItem, de manera similar a cómo listarías el contenido de una unidad o carpeta del sistema de archivos.

Usando la unidad Env: en PowerShell, obtén el usuario actual ejecutando el siguiente comando.

Get-ChildItem Env:\USERNAME

La captura de pantalla a continuación muestra el resultado esperado. Como puedes ver, el comando devuelve el elemento USERNAME y su valor correspondiente, que es el usuario actualmente registrado.

Getting the Env:\USERNAME item

Para obtener solo el valor del nombre de usuario, modifica el comando como se muestra a continuación y ejecútalo nuevamente en PowerShell.

(Get-ChildItem Env:\USERNAME).Value

Y como se muestra a continuación, el comando solo devuelve el valor del nombre de usuario como una cadena.

Getting the Env:\USERNAME value

La variable $env

Además de acceder a las variables de entorno como una PSDrive tratándolas como archivos en una unidad, otra forma es acceder a la unidad Env como una variable. Es decir, puedes hacer referencia a las variables de entorno utilizando la sintaxis siguiente.

# El signo $ indica una variable
# env es la unidad Env
# <variable> es el nombre de la variable que desea obtener
$env:<variable>

Según la sintaxis mencionada, ejecute el siguiente comando en PowerShell para obtener el usuario actual.

$env:username

Como muestra la captura de pantalla a continuación, el comando devuelve el valor del nombre de usuario.

Getting the username variable value

La Clase Environment de .NET

PowerShell es un lenguaje y shell orientado a objetos. Básicamente, todo en lo que trabajas dentro de PowerShell es un objeto. Cuando ejecutas un comando, la salida es un objeto. Si declaraste una variable, esa variable es un objeto en sí misma. Tienes la idea.

Estos objetos tienen una estructura que define el tipo de datos que representan, similar a los planos. Y estos planos se llaman clases .NET o simplemente clases.

En cuanto a las variables de entorno, la clase asociada a ella es la clase Environment. Entonces, ¿cómo se utiliza la clase Environment en PowerShell para obtener el usuario actual?

Al igual que la variable $env, la clase Environment tiene una propiedad Username, cuyo valor es el nombre de usuario del usuario actual. Para obtener el valor de la propiedad de nombre de usuario, ejecute el siguiente comando en PowerShell.

[System.Environment]::UserName
Getting the environment username property value

Además de la propiedad Username, la clase Environment también tiene un método para obtener el valor de una variable de entorno. El nombre del método es GetEnvironmentVariable.

Para obtener el usuario actual utilizando este método, ejecute el siguiente comando.

[System.Environment]::GetEnvironmentVariable('username')
Getting the environment variable value

Usando la Clase .NET WindowsIdentity

La clase WindowsIdentity es otra clase de .NET que puedes invocar en PowerShell para obtener el usuario actual. Esta clase tiene un método llamado GetCurrentName, que devuelve un objeto que representa al usuario actual de Windows.

Para obtener los detalles del usuario actual, ejecuta el siguiente comando.

[System.Security.Principal.WindowsIdentity]::GetCurrent()

Como puedes ver a continuación, el comando devuelve las propiedades del objeto de usuario actual, incluida la propiedad Name. El valor de la propiedad Name sigue la convención dominio\usuario.

Getting the current Windows user

Para devolver solo la parte del nombre de usuario, modifica el comando anterior para seleccionar solo la propiedad Name y aplicar la técnica de división de cadenas. Para hacerlo, copia el siguiente comando y ejecútalo en PowerShell.

([System.Security.Principal.WindowsIdentity]::GetCurrent().Name).Split('\')[1]
Returning only the username part

Usando el comando whoami

Otro comando útil que te permite obtener rápidamente el usuario actual es el comando whoami. Este comando es un archivo ejecutable que puedes encontrar en la carpeta %WINDIR%\System32 con el nombre de archivo whoami.exe.

Para obtener el nombre de usuario del usuario actual, ejecuta el siguiente comando.

whoami

El comando luego devuelve el resultado en el formato dominio nombredeusuario, como se muestra en la captura de pantalla a continuación.

Getting the username using whoami

Para obtener el nombre de usuario sin el dominio, aplica la técnica de división de cadenas que aprendiste anteriormente en este tutorial ejecutando el siguiente comando.

(whoami).Split('\')[1]
Getting the username without the domain

El comando whoami también puede devolver el nombre distintivo completo (FQDN) actual del usuario y el nombre principal de usuario (UPN). Esta salida del comando podría ser útil si tienes la intención de ejecutar un script que recupere la identidad actual del usuario más allá del nombre de usuario.

Ejecuta el siguiente comando en PowerShell para obtener el FQDN y UPN del usuario actual.

# Obtén el FQDN del usuario actual
whoami /fqdn

# Obtén el UPN del usuario actual
whoami /upn
Getting the current user’s FQDN and UPN

Nota: Los valores de FQDN y UPN solo están disponibles si el usuario actualmente conectado es un usuario de dominio. Si intentas obtener estos valores para un usuario local, el comando devolverá un error, como se muestra a continuación.

Error getting the UPN and FQDN of a non-domain user account

Usando el comando query

Si eres un administrador del sistema o un usuario de dominio, es probable que hayas iniciado sesión en una máquina remota a través del Protocolo de Escritorio Remoto (RDP) al menos una vez, tal vez para gestionar recursos o utilizar aplicaciones. Sea cual sea la razón, querrías saber quién está actualmente conectado y utilizando los recursos del sistema.

Afortunadamente, Windows tiene una herramienta de línea de comandos incorporada llamada query que puede listar todos los usuarios que han iniciado sesión actualmente en una computadora. El comando también te muestra si el usuario inició sesión a través de una sesión de escritorio remoto o localmente en la computadora.

El comando query tiene dos parámetros pertinentes para obtener los usuarios que han iniciado sesión; session y user. El parámetro session lista las sesiones de la computadora, mientras que el parámetro user lista los usuarios y sus sesiones.

El comando query session tiene un alias llamado qwinsta, mientras que el alias del comando para query user es quser.

Por ejemplo, ejecuta el siguiente comando para listar las sesiones en DC1.

# Consultar sesiones en DC1
qwinsta /server:dc1

La captura de pantalla a continuación muestra la salida del comando. En este ejemplo, dos usuarios iniciaron sesión en la computadora DC1: uno en la sesión de consola y otro a través de RDP. Como puedes ver, qwinsta devuelve todas las sesiones, incluso aquellas que no pertenecen a usuarios.

Querying sessions

Si ejecutas qwinsta o quser por sí mismo sin el argumento /server:<computer>, ambos comandos consultarán la computadora local de forma predeterminada.

A continuación, para listar todos los usuarios con sesiones activas, ejecuta el comando user a continuación.

# consultar usuarios en DC1
quser /server:dc1

Después de ejecutar el comando, notarás de inmediato que quser devuelve las sesiones y usuarios como el comando qwinsta. Pero esta vez, no hay sesiones en blanco.

También hay dos columnas adicionales: IDLE TIME, que muestra el tiempo de inactividad de los usuarios, y LOGON TIME, que muestra la marca de tiempo del inicio de sesión de los usuarios.

Querying users

En resumen, al comparar los resultados de qwinsta y quser, quser es el comando más apropiado en PowerShell para obtener los usuarios actuales.

¿Tienes contraseñas comprometidas en tu Directorio Activo? Descúbrelo con Specops Password Auditor Free.

Conclusión

Mientras hay muchas formas en PowerShell de obtener los usuarios actuales conectados, el mejor método depende del resultado que deseas obtener y cómo lo utilizarás.

Los cmdlets nativos relacionados con WMI y el comando query te permiten obtener los usuarios conectados en una computadora local o remota. El uso de clases .NET y variables de entorno ofrece formas rápidas de obtener los mismos resultados, pero solo en la computadora local.

Ya sea que planees ejecutar un script o mostrar los resultados manualmente en la pantalla, hay un método que se ajustará a tus necesidades para usar PowerShell y obtener el usuario actual. ¿Qué sigue? Quizás aprender cómo analizar los resultados del comando query y convertirlos en objetos de PowerShell escribiendo funciones con RegEx?

Source:
https://adamtheautomator.com/powershell-get-current-user/