Quando si esegue uno script da riga di comando, è possibile ottenere il nome dell'utente corrente?
Quando si esegue uno script da riga di comando, è possibile ottenere il nome dell'utente corrente?
Risposte:
Nome utente:
echo %USERNAME%
Nome del dominio:
echo %USERDOMAIN%
È possibile ottenere un elenco completo di variabili di ambiente eseguendo il comando set
dal prompt dei comandi.
Basta usare questo comando nel prompt dei comandi
C:\> whoami
whoami
, ottengo desktop-machine\bballdave025
. Ci sono due parti, viste tramite: 1) echo %USERNAME%
, risultato bballdave025
; 2) echo %USERDOMAIN%
, risultato DESKTOP-MACHINE
. Suppongo che si possa dire che il 'nome utente completo' è disponibile tramite echo %USERDOMAIN%\%USERNAME%
(questo risultato DESKTOP-MACHINE\bballdave025
, corrisponde a quello di whoami
, ignorando il caso), o anche tramite echo %USERNAME%@%USERDOMAIN%
, risultato bballdave025@DESKTOP-MACHINE
. Tutto dipende da ciò di cui l'utente (per noi, l'OP) ha bisogno , ovvero se la parte del dominio è importante.
Dovrebbe essere dentro %USERNAME%
. Ovviamente questo può essere facilmente falsificato, quindi non fare affidamento su di esso per la sicurezza.
Suggerimento utile: digitare set
un prompt dei comandi elencherà tutte le variabili di ambiente.
%USERNAME%
è la risposta corretta in batch e altro in ambienti Windows.
Un'altra opzione è utilizzare %USERPROFILE%
per ottenere il percorso dell'utente, come C:\Users\username
.
La risposta dipende dalla lingua dello "script della riga di comando" in cui ci si trova.
Nel vecchio cmd.exe
prompt dei comandi o in uno script .bat
o .cmd
, è possibile utilizzare quanto segue:
%USERNAME%
- Ottiene solo il nome utente.
%USERDOMAIN%
- Ottiene il dominio dell'utente.
Nel comando PowerShell richiesta o una .ps1
o .psm1
script, è possibile utilizzare il seguente:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- Ti dà il nome utente completo (ad esempio Dominio \ Nome utente). Questo è anche il metodo più sicuro perché non può essere ignorato dall'utente come le altre $Env
variabili seguenti.
$Env:Username
- Ottiene solo il nome utente.
$Env:UserDomain
- Ottiene il dominio dell'utente.
$Env:ComputerName
- Ottiene il nome del computer.
% USERNAME% ti darà il nome utente del processo attualmente in esecuzione. A seconda di come si esegue il file batch, questo non è necessariamente lo stesso del nome dell'utente corrente. Ad esempio, potresti eseguire il tuo file batch attraverso un'attività pianificata, da un servizio, ecc.
Ecco un modo più sicuro per ottenere il nome utente dell'utente attualmente connesso raschiando il nome dell'utente che ha avviato l'attività explorer.exe:
for /f "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do if /i "%%a %%b"=="User Name:" set _currdomain_user=%%c
for /f "TOKENS=1,2 DELIMS=\" %%a in ("%_currdomain_user%") do set _currdomain=%%a & set _curruser=%%b
Uso questo metodo per scrivere file batch per i test.
echo %userdomain%\%username%
Poiché è necessario includere la password in testo semplice se è richiesta l'autenticazione, la userò solo in un ambiente completamente privato in cui altri utenti non possono visualizzarla o se un utente che vede la password non avrebbe conseguenze.
Spero che questo aiuti qualcuno.
Mi ha sempre infastidito il fatto che Windows non abbia alcune delle piccole utili utility di scripting di Unix, come who / whoami , sed e AWK . Ad ogni modo, se vuoi qualcosa di infallibile, ottieni Visual Studio Express e compila quanto segue:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s", GetUserName());
}
E basta usarlo nel file batch.
net config Workstation | find "User name"
whoami
è disponibile a partire da Windows Vista.
Nella maggior parte dei casi, la variabile% USERNAME% sarà quella che desideri.
echo %USERNAME%
Tuttavia, se stai eseguendo una shell cmd elevata,% USERNAME% riporterà il nome dell'amministratore invece del tuo nome utente. Se vuoi conoscere quest'ultimo, esegui:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
Questa è la principale differenza tra la variabile username e il comando whoami:
C:\Users\user.name>echo %username%
user.name
C:\Users\user.name>whoami
domain\user.name
DOMAIN = bios name of the domain (not fqdn)
In un contesto standard, ogni utente connesso possiede un processo explorer.exe: il comando [tasklist / V | find "explorer"] restituisce una riga che contiene il proprietario del processo explorer.exe, con un regex adattato è possibile ottenere il necessario valore. Questo funziona perfettamente anche con Windows 7.
In rari casi explorer.exe è sostituito da un altro programma, il filtro find può essere adattato per corrispondere a questo caso. Se il comando restituisce una riga vuota, è probabile che nessun utente sia connesso. Con Windows 7 è anche possibile eseguire [sessione di query | trova ">"].
Per quanto riguarda trovare la risposta di BlueBearr al meglio (mentre io sto eseguendo il mio script batch con ad es. I diritti di SISTEMA) devo aggiungere qualcosa ad esso. Perché nella mia versione in lingua di Windows (polacco) la riga che deve essere catturata da "%% a %% b" == "Nome utente:" viene REALMENTE COMPLICATA (contiene alcuni caratteri diacritici nella mia lingua) Salto le prime 7 righe e operare l'8.
@for /f "SKIP= 7 TOKENS=3,4 DELIMS=\ " %%G in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do @IF %%G==%COMPUTERNAME% set _currdomain_user=%%H