Как вы находите текущего пользователя в среде Windows?


159

При запуске сценария командной строки возможно ли получить имя текущего пользователя?



1
@PeterMortensen, я не думаю, что тема супер связана с этим. Один из них - об использовании .NET, а другой - об использовании cmd API. Помимо того факта, что они оба хотят одну и ту же информацию, есть, конечно, тонны других API, которые также делают схожие вещи
KyleMit,

Ответы:


202

Вы можете использовать переменную username: %USERNAME%


91

Имя пользователя:

echo %USERNAME%

Доменное имя:

echo %USERDOMAIN%

Вы можете получить полный список переменных среды, запустив команду setиз командной строки.


Дополнительная информация со всеми переменными среды делает этот замечательный расширенный ответ.
bballdave025

63

Просто используйте эту команду в командной строке

C:\> whoami

Это хороший ответ, но есть некоторые оговорки. Если я войду whoami, я получу desktop-machine\bballdave025. Есть две части, видимые через: 1) echo %USERNAME%результат bballdave025; 2) echo %USERDOMAIN%результат DESKTOP-MACHINE. Я полагаю, можно сказать, что «полное имя пользователя» доступно через echo %USERDOMAIN%\%USERNAME%(этот результат DESKTOP-MACHINE\bballdave025соответствует совпадению whoami, игнорируя регистр) или даже через echo %USERNAME%@%USERDOMAIN%результат bballdave025@DESKTOP-MACHINE. Все зависит от того, что нужно пользователю (для нас, ОП) , т.е. важна ли доменная часть.
bballdave025

46

Это должно быть в %USERNAME%. Очевидно, что это может быть легко подделано, поэтому не полагайтесь на это в целях безопасности.

Полезный совет: введите setв командной строке список всех переменных среды.


2
Ваша сетевая рабочая конфигурация | find "User name" 'комментарий очень полезен. Это должен был быть ответ, а не просто комментарий
Alpay

17

%USERNAME% является правильным ответом в пакетном и других средах Windows.

Другим вариантом является использование %USERPROFILE%для получения пути пользователя, например C:\Users\username.


6

Ответ зависит от того, на каком языке «сценария командной строки» вы находитесь.

Cmd

В старой cmd.exeкомандной строке или в .batили.cmd сценарии вы можете использовать следующее:

%USERNAME% - Получает только имя пользователя.

%USERDOMAIN% - Получает домен пользователя.

PowerShell

В командной строке PowerShell .ps1или .psm1сценарии a или вы можете использовать следующее:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name- Дает вам полное имя пользователя (например, домен \ имя пользователя). Это также самый безопасный метод, потому что он не может быть переопределен пользователем, как другие $Envпеременные ниже.

$Env:Username - Получает только имя пользователя.

$Env:UserDomain - Получает домен пользователя.

$Env:ComputerName - Получает имя компьютера.


Это отличный ответ, так как этот вопрос зависит от «оболочки». Есть много оболочек, которые вы можете использовать с Windows. Не только CMD. В наши дни большинство людей перешли на PowerShell, а есть и другие. stackoverflow.com/questions/17349022/…
G_Style

5

% USERNAME% выдаст вам имя пользователя текущего запущенного процесса. В зависимости от того, как вы запускаете ваш пакетный файл, это не обязательно совпадает с именем текущего пользователя. Например, вы можете запускать пакетный файл через запланированное задание, из службы и т. Д.

Вот более надежный способ получения имени пользователя, вошедшего в систему в данный момент, путем удаления имени пользователя, запустившего задачу 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

4

Я использую этот метод при написании командных файлов для тестирования.

echo %userdomain%\%username%

Поскольку вы должны включить пароль в виде обычного текста, если требуется аутентификация, я буду использовать его только в полностью закрытой среде, где другие пользователи не смогут его просмотреть, или если пользователь, увидев пароль, не будет иметь последствий.

Надеюсь, это поможет кому-то.


4

Меня всегда раздражало, что в Windows нет более полезных небольших утилит для написания сценариев Unix, таких как who / whoami , sed и AWK . В любом случае, если вам нужно что-то надежное, получите Visual Studio Express и скомпилируйте следующее:

#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv) {
    printf("%s", GetUserName());
}

И просто используйте это в вашем командном файле.


Да, было бы неплохо иметь встроенный.
Geo

8
Я согласен, что sed & awk был бы полезен, но это дает вам 50% пути: net config Workstation | find "User name"
the_mandrill

9
whoamiдоступно начиная с Windows Vista.
Джои

2
Правда, утилита whoami включена в Vista. Для XP он находится в инструментах поддержки SP2, а для W2K - в наборе ресурсов.
RealHowTo

4

В большинстве случаев переменная% USERNAME% будет именно тем, что вам нужно.

echo %USERNAME%

Однако если вы используете командную оболочку с повышенными привилегиями,% USERNAME% сообщит имя администратора вместо вашего собственного имени пользователя. Если вы хотите узнать последнее, запустите:

for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u

1

В этом основное отличие переменной username от команды 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)

0

В стандартном контексте каждый подключенный пользователь содержит процесс explorer.exe: команда [tasklist / V | find "explorer"] возвращает строку, содержащую владельца процесса explorer.exe, с адаптированным регулярным выражением можно получить требуемый стоимость. Это также отлично работает под Windows 7.

В редких случаях файл explorer.exe заменяется другой программой, фильтр поиска можно адаптировать к этому случаю. Если команда возвращает пустую строку, вероятно, ни один пользователь не вошел в систему. В Windows 7 также можно запустить [запрос сеанса | найти ">"].


0

Чтобы найти ответ BlueBearr наилучшим образом (хотя я запускаю свой пакетный скрипт, например, с правами SYSTEM), я должен что-то добавить к нему. Поскольку в моей языковой версии для Windows (польском) строка, которая должна быть поймана с помощью "%% a %% b" == "Имя пользователя:", становится ОЧЕНЬ СЛОЖНОЙ (она содержит некоторые диакритические знаки на моем языке), я пропускаю первые 7 строк и оперировать 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.