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

159

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

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

Ответы:

202

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

JRL
источник
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в командной строке список всех переменных среды.

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

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

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

Recon
источник
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 - Получает имя компьютера.

deadlydog
источник
Это отличный ответ, так как этот вопрос зависит от «оболочки». Есть много оболочек, которые вы можете использовать с 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
BlueBearr
источник
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)
integratorIT
источник
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
ITMarka
источник