Obtener usuarios del sistema y almacenarlos en variables

Por un lado necesito saber de qué manera puedo obtener el listado de usuarios de un sistema y almacenarlos en variables, en esa parte se me complica ya que pueden haber varios usuarios y se torna variable en ese sentido.

Luego por otro lado necesito que me ayuden a determinar el usuario activo del momento, es decir yo intento esto:

FOR /F "delims=*" %d in ('query user /server:172.16.1.17^|findstr "console"') do ECHO %d

lo que me da como resultado "Oficina" cuando el usuario es "Oficina Contable", es decir varían los nombres, en otra pc hay usuarios como por ej "Oficina administrativa 2". La idea es extraer el usuario activo completo, seguramente hay otras maneras que no me las sé.

1 respuesta

Respuesta
1

Creo que no tengo suficiente conocimiento del entorno en el que trabajas como para poder decirte algo. Pero como nadie ha contestado en estos 8 días si quieres me puedes esbozar un poco ese entorno: versión de Windows, tipo de red (supongo que la típica de Windows), si estás hablando de PCs o si hay servidores también. Y no sé a que te refieres con "listado de usuarios", supongo que los que se han conectado en algún momento y no han cerrado la sesión y el activo sería uno de ellos, pero ¿cómo se sabe que otros usuarios no están activos? Por último, ¿el comando "query user" en que versión se ejecuta?

Hola, perdón la demora en revisar las notificaciones. Pero mas o menos intentaré pintar el panorama.

Tengo 3 pcs en la red

PC1 - Cant. de usuarios: 2 (Administrador y Administracion 1) - IP: 172.16.1.1

PC2 - Cant. de usuarios: 3 (Administrador, Contable 1, Of Cont 2) - IP: 172.16.1.2

PC3 - Cant. de usuarios: 4 (Administrador, User, User 2, Agro 2, Of Sur 2) - IP: 172.16.1.3

Lo que necesito es extraer el nombre del usuario activo, con la siguiente línea lo consulto

FOR /F "delims=*" %d in ('query user /server:172.16.1.1^|findstr "console"') do ECHO %d

lo que me da como resultado:

NOMBRE USUARIO        NOMBRE SESIÓN      ID. ESTADO  TIEMPO IN. TIEMPO SESIÓN
Administracion 1      console             1  Activo      ninguno   17/2/2021 07:33

El nombre de usuario que aparece en la 2da línea, es decir "Administracion 1" es lo que estaría necesitando, sea que me lo devuelva en una variable o bien en un echo. ¿cuál es el problema? que en ocasiones el nombre de usuario a extraer, contienen mas de 2 espacios y en el ejemplo del script que puse anteriormente, solamente logré extraer "Administracion" y no encuentro la manera de poder extraer "Administracion 1" o bien en el caso de la pc 3 "Of Sur 2".

Muchas gracias de antemano y espero puedan ayudarme, aun no logro entender bien la extracción de caracteres.

Por lo que he podido averiguar parece que Windows 10 Home no tiene instalado el software que permite ejecutar el comando QUERY. Por tanto no puedo hacer pruebas en mi entorno.

En principio si hubiera una forma de seleccionar los campos que vaya a mostrar ese comando se le podría decir que mostrara solamente el USERNAME/NOMBRE USUARIO, pero intuyo que no va a poder ser. La otra opción sería asumir que el nombre de usuario puede tener una longitud máxima de, digamos, 20 caracteres y tomar como nombre de usuario los 20 primeros caracteres de la variable del FOR. Seguramente luego habría que hacer un pequeño tratamiento para eliminar los espacios finales

Acabo de darme cuenta de un detalle que se me había escapado. En lo parámetros del FOR figura un "DELIMS=*" que no consigo entender. Parecería querer indicar que el carácter delimitador de los campos es el * en lugar de los valores por defecto (espacio y tabulador) pero me inclino porque se trata de un error y que lo que se quería hacer constar era "TOKENS=*" para que todo el contenido de la línea se almacenara en la variable %d

Lo que pasa es que mi problema principal es que en el aprendizaje hago ese tipo de cosas. Ahora intentando cosas logré conseguir el usuario que está logueado actualmente

FOR /F "tokens=2 delims=.\" %%s in ('REG QUERY \\172.16.1.1\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI^|find ".\"') DO (SET usuario=%%s)

Ahora lo que necesitaría es hacer un bucle para que las ips de la 1 a la 3 me tire un echo "el usuario logueado es ..."

No puedo probar en detalle el asunto de las IP pero creo que esto te podría funcionar:

@echo off
for %%a in (172.16.1.1 172.16.1.2 172.16.1.3) do (
    for /f "tokens=2 delims=.\" %%s in ('REG QUERY \\%%a\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI^|find ".\"') do set usuario=%%s&echo El usuario logueado es %%s
)

Prueba y me dices, si te parece

Ahora que lo reviso, y solo para sacar el mensaje, no sería necesario el SET y bastaría con:

@echo off
for %%a in (172.16.1.1 172.16.1.2 172.16.1.3) do (
    for /f "tokens=2 delims=.\" %%s in ('REG QUERY \\%%a\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI^|find ".\"') do echo El usuario logueado es %%s
)

¡Gracias! funciona, lo único que me hace es devolverme 2 echos iguales por cada ip, es decir

El usuario logueado es Administracion 1
El usuario logueado es Administracion 1
El usuario logueado es Of Cont 2
El usuario logueado es Of Cont 2
El usuario logueado es Agro 2
El usuario logueado es Agro 2

me pasó en otras veces cuando ponia un FOR dentro de otro FOR, pero la verdad que el resultado para almacenarlo dentro de una variable igual me sirve, en ese sentido no tengo problemas.

La razón de esta "duplicidad", analizando el contenido de la rama LogonUI en el registro de Windows, parece ser que el mismo usuario aparece dos veces, una en la clave LastLoggedOnUser y otra en la clave LastLoggedOnSAMUser. Puedes eliminarla incluyendo la opción "skip=1" en el FOR interno. Quedaría así:

@echo off
for %%a in (172.16.1.1 172.16.1.2 172.16.1.3) do (
    for /f "skip=1 tokens=2 delims=.\" %%s in ('REG QUERY \\%%a\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI^|find ".\"') do echo El usuario logueado es %%s
)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas