Ist es beim Ausführen eines Befehlszeilenskripts möglich, den Namen des aktuellen Benutzers abzurufen?
Ist es beim Ausführen eines Befehlszeilenskripts möglich, den Namen des aktuellen Benutzers abzurufen?
Antworten:
Nutzername:
echo %USERNAME%
Domainname:
echo %USERDOMAIN%
Sie können eine vollständige Liste der Umgebungsvariablen abrufen, indem Sie den Befehl set
an der Eingabeaufforderung ausführen.
Verwenden Sie einfach diesen Befehl in der Eingabeaufforderung
C:\> whoami
whoami
, bekomme ich desktop-machine\bballdave025
. Es gibt zwei Teile, gesehen über: 1) echo %USERNAME%
, Ergebnis bballdave025
; 2) echo %USERDOMAIN%
, Ergebnis DESKTOP-MACHINE
. Ich denke, man könnte sagen, dass der 'vollständige Benutzername' über echo %USERDOMAIN%\%USERNAME%
(dieses Ergebnis DESKTOP-MACHINE\bballdave025
entspricht dem von whoami
, Groß- und Kleinschreibung ignorieren) oder sogar über echo %USERNAME%@%USERDOMAIN%
Ergebnis verfügbar ist bballdave025@DESKTOP-MACHINE
. Es hängt alles davon ab, was der Benutzer (für uns das OP) benötigt , dh ob der Domain-Teil wichtig ist.
Es sollte in sein %USERNAME%
. Offensichtlich kann dies leicht gefälscht werden, verlassen Sie sich also aus Sicherheitsgründen nicht darauf.
Nützlicher Tipp: Wenn Sie set
eine Eingabeaufforderung eingeben, werden alle Umgebungsvariablen aufgelistet.
%USERNAME%
ist die richtige Antwort im Batch und anderen in Windows-Umgebungen.
Eine andere Option besteht darin %USERPROFILE%
, den Pfad des Benutzers abzurufen, z C:\Users\username
.
Die Antwort hängt davon ab, in welcher "Befehlszeilenskript" -Sprache Sie sich befinden.
In der alten cmd.exe
Eingabeaufforderung oder in einem .bat
oder .cmd
Skript können Sie Folgendes verwenden:
%USERNAME%
- Ruft nur den Benutzernamen ab.
%USERDOMAIN%
- Ruft die Domain des Benutzers ab.
In der PowerShell-Eingabeaufforderung oder einem .ps1
oder .psm1
Skript können Sie Folgendes verwenden:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- Gibt Ihnen den vollständig qualifizierten Benutzernamen (z. B. Domain \ Benutzername). Dies ist auch die sicherste Methode, da sie vom Benutzer nicht wie die anderen folgenden $Env
Variablen überschrieben werden kann .
$Env:Username
- Ruft nur den Benutzernamen ab.
$Env:UserDomain
- Ruft die Domain des Benutzers ab.
$Env:ComputerName
- Ruft den Namen des Computers ab.
% USERNAME% gibt Ihnen den Benutzernamen des aktuell ausgeführten Prozesses. Abhängig davon, wie Sie Ihre Batchdatei ausführen, entspricht dies nicht unbedingt dem Namen des aktuellen Benutzers. Beispielsweise können Sie Ihre Batchdatei über eine geplante Aufgabe, einen Dienst usw. ausführen.
Hier ist eine sicherere Methode, um den Benutzernamen des aktuell angemeldeten Benutzers zu ermitteln, indem Sie den Namen des Benutzers löschen, der die Aufgabe explorer.exe gestartet hat:
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
Ich benutze diese Methode beim Schreiben von Batch-Dateien zum Testen.
echo %userdomain%\%username%
Da Sie das Kennwort im Klartext einfügen müssen, wenn eine Authentifizierung erforderlich ist, werde ich es nur in einer vollständig privaten Umgebung verwenden, in der andere Benutzer es nicht anzeigen können oder wenn ein Benutzer, der das Kennwort sieht, keine Konsequenzen hat.
Hoffe das hilft jemandem.
Es hat mich immer geärgert, dass Windows einige der nützlicheren kleinen Skript-Dienstprogramme von Unix nicht hat, wie who / whoami , sed und AWK . Wenn Sie etwas kinderleichtes möchten, holen Sie sich Visual Studio Express und kompilieren Sie Folgendes:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s", GetUserName());
}
Und verwenden Sie das einfach in Ihrer Batch-Datei.
net config Workstation | find "User name"
whoami
ist ab Windows Vista verfügbar.
In den meisten Fällen entspricht die Variable% USERNAME% Ihren Wünschen.
echo %USERNAME%
Wenn Sie jedoch eine erhöhte Cmd-Shell ausführen, gibt% USERNAME% den Administratornamen anstelle Ihres eigenen Benutzernamens an. Wenn Sie Letzteres wissen möchten, führen Sie Folgendes aus:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
Dies ist der Hauptunterschied zwischen der Benutzernamenvariablen und dem whoami-Befehl:
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 einem Standardkontext enthält jeder verbundene Benutzer einen explorer.exe-Prozess: Der Befehl [tasklist / V | find "explorer"] gibt eine Zeile zurück, die die Eigentümer des explorer.exe-Prozesses enthält. Mit einem angepassten regulären Ausdruck kann der erforderliche Prozess abgerufen werden Wert. Dies läuft auch perfekt unter Windows 7.
In seltenen Fällen wird explorer.exe durch ein anderes Programm ersetzt. Der Suchfilter kann an diesen Fall angepasst werden. Wenn der Befehl eine leere Zeile zurückgibt, ist wahrscheinlich kein Benutzer angemeldet. Unter Windows 7 ist es auch möglich, [Abfragesitzung | find ">"] auszuführen.
Um die BlueBearr-Antwort am besten zu finden (während ich mein Batch-Skript mit z. B. SYSTEM-Rechten ausführe), muss ich etwas hinzufügen. Da in meiner Windows-Sprachversion (polnisch), die von "%% a %% b" abgefangen werden soll, == "Benutzername:" WIRKLICH KOMPLIZIERT wird (es enthält einige diakritische Zeichen in meiner Sprache), überspringe ich die ersten 7 Zeilen und operieren am 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