it-swarm.com.ru

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

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

135
Geo

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

177
JRL

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

echo %USERNAME%

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

echo %USERDOMAIN%

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

76
Magnus Lindhe

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

C:\> whoami
51
Freeman

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

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

44
the_mandrill

%USERNAME%- правильный ответ в пакетном режиме и в среде Windows.

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

14
Recon

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

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

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

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

4
Chris K

% 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
3
BlueBearr

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

echo %userdomain%\%username%

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

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

2
Chad Harrington Mitchell

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

echo %USERNAME%

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

for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
2
Jean-François Larvoire

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

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

0
Armand Poulenard

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

Cmd

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

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

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

PowerShell

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

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

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

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

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

0
deadlydog

Насколько лучше найти ответ 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
0
ITMarka