2015-01-22 11 views
5

Esempio: Ho effettuato l'accesso come utente TestUser. Da questo utente ho intenzione di eseguire una riga di comando come amministratore denominato AdminUser.Ottieni l'utente attualmente connesso su Windows

E 'possibile da questa riga di comando per determinare il nome dell'utente attualmente connesso a TestUser?

ho già programmato compito che è sempre in esecuzione come AdminUser, ma nella sua azione (file batch), ho bisogno di nome utente attualmente connesso.

Qualche idea?

+0

Potete chiarire cosa si intende per "utente attualmente registrato"? Stai limitando questo alla console? Conta le connessioni desktop remoto? Se questo è un SO server, come sceglieresti tra i cilent RDP? – mojo

+0

non sono sicuro, perché non si può provare al momento, ma 'tasklist/v | find" explorer.exe "' help? – Stephan

+1

Possibile duplicato di * [Come si trova l'utente corrente in un ambiente Windows?] (Http://stackoverflow.com/questions/1607271/how-do-you-find-the-current-user-in-a- finestre-ambiente) *. –

risposta

5

Per quanto ne so, questo non è possibile. A seconda di quanto si sa circa l'ambiente degli utenti, di seguito potrebbe essere una soluzione per quanto:

Il comando

qwinsta 

vi darà un elenco di sessioni per il computer. All'interno di queste sessioni ne sarà attivo uno solo, quindi se questo programma viene utilizzato in una sessione interattiva solo questo in pratica conterrà l'utente "loggato" come lo hai descritto (è molto più complicato in realtà, potrebbero esserci molti utenti connessi ma solo uno può essere attivo e spero solo che tu ne sappia abbastanza sullo scenario di utilizzo del tuo programma per farne uso). Potresti analizzare l'output e lavorare con quel nome utente.

Naturalmente questo è un hack sporco e si presume che durante la fase di esecuzione del vostro compito non v'è alcuna possibilità che gli utenti cambiano.

Anche se ho scelto qwinsta.exe perché è un approccio di base che non richiede chiamate API o qualcosa che non sono ancora sicuro se il CMD ha sufficienti capacità di analisi per ottenere le informazioni necessarie per voi.

+0

Grazie. Questa soluzione funzionerà normalmente. Ma nel caso in cui no. Ti dirò perché. Fondamentalmente ho bisogno di eseguire il file batch solo su log out di amministrazione. Quindi il mio compito è attivato sull'evento di sicurezza 4647 (evento di disconnessione). Così collaudo la tua proposta e non ci sono più sessioni attive. Stavo cercando di eseguire questo tramite gli script di registro dei criteri di gruppo via registro, ma è molto instabile e non funziona per me. – dEVIANT

+1

Quindi non è necessario l'utente attivo, ma l'ultimo attivo? In tal caso, proporrei un'altra soluzione alternativa. Se non si è in grado di garantire sessioni remote, è possibile provare la chiave HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Authentication \ LogonUI \ LastLoggedOnUser. In pratica, la chiave utilizzata da Windows consente di visualizzare l'ultimo utente nella schermata di accesso. Le sessioni remote non vengono salvate lì ... Se li hai, direi scrivere un programma che sovrascrive una chiave di reg o un file con userinfo su ogni accesso e interrogare le tue informazioni in un secondo momento – Syberdoor

+0

Great! Funziona molto bene! – dEVIANT

4

%username% variabile contiene .. beh, il nome utente.

echo/%username%

EDIT

Come hai detto, perché siete in un'operazione pianificata, è possibile ottenere il nome utente dal Registro di Windows

@echo off 
for /f "tokens=3" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData\1 /v LoggedOnUserName') do (
set "user=%%a") 
set "user=%user:.\=%" 
echo/%user% 

Ora %user% variabile contiene connesso nome utente.

+1

Sì, ma questo restituirà AdminUser, poiché è l'esecutore delle attività pianificate. Anche se in Windows sei registrato come TestUser.Provo questo, anche il comando whoami :) – dEVIANT

+0

La mia colpa, controlla la risposta alla modifica! – Rafael

+1

Questo non funzionerà se ci sono utenti con sessioni disconnesse. Tuttavia se dEVIANT può escludere questo scenario è molto meno pazzo della mia idea. – Syberdoor

0

Ecco un modo veloce per fare questo accadere utilizzando un file batch sarebbe questo comando:.

for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do set tempVar=%%j 

echo %tempVar% mostrerà tutto ciò che un utente sia effettivamente collegato Non l'utente che ha lanciato il file batch.