При запуске сценария командной строки возможно ли получить имя текущего пользователя?
При запуске сценария командной строки возможно ли получить имя текущего пользователя?
Ответы:
Имя пользователя:
echo %USERNAME%
Доменное имя:
echo %USERDOMAIN%
Вы можете получить полный список переменных среды, запустив команду set
из командной строки.
Просто используйте эту команду в командной строке
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
. Все зависит от того, что нужно пользователю (для нас, ОП) , т.е. важна ли доменная часть.
Это должно быть в %USERNAME%
. Очевидно, что это может быть легко подделано, поэтому не полагайтесь на это в целях безопасности.
Полезный совет: введите set
в командной строке список всех переменных среды.
Ответ зависит от того, на каком языке «сценария командной строки» вы находитесь.
В старой cmd.exe
командной строке или в .bat
или.cmd
сценарии вы можете использовать следующее:
%USERNAME%
- Получает только имя пользователя.
%USERDOMAIN%
- Получает домен пользователя.
В командной строке PowerShell .ps1
или .psm1
сценарии a или вы можете использовать следующее:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- Дает вам полное имя пользователя (например, домен \ имя пользователя). Это также самый безопасный метод, потому что он не может быть переопределен пользователем, как другие $Env
переменные ниже.
$Env:Username
- Получает только имя пользователя.
$Env:UserDomain
- Получает домен пользователя.
$Env:ComputerName
- Получает имя компьютера.
% 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
Я использую этот метод при написании командных файлов для тестирования.
echo %userdomain%\%username%
Поскольку вы должны включить пароль в виде обычного текста, если требуется аутентификация, я буду использовать его только в полностью закрытой среде, где другие пользователи не смогут его просмотреть, или если пользователь, увидев пароль, не будет иметь последствий.
Надеюсь, это поможет кому-то.
Меня всегда раздражало, что в Windows нет более полезных небольших утилит для написания сценариев Unix, таких как who / whoami , sed и AWK . В любом случае, если вам нужно что-то надежное, получите Visual Studio Express и скомпилируйте следующее:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
printf("%s", GetUserName());
}
И просто используйте это в вашем командном файле.
net config Workstation | find "User name"
whoami
доступно начиная с Windows Vista.
В большинстве случаев переменная% USERNAME% будет именно тем, что вам нужно.
echo %USERNAME%
Однако если вы используете командную оболочку с повышенными привилегиями,% USERNAME% сообщит имя администратора вместо вашего собственного имени пользователя. Если вы хотите узнать последнее, запустите:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
В этом основное отличие переменной 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)
В стандартном контексте каждый подключенный пользователь содержит процесс explorer.exe: команда [tasklist / V | find "explorer"] возвращает строку, содержащую владельца процесса explorer.exe, с адаптированным регулярным выражением можно получить требуемый стоимость. Это также отлично работает под Windows 7.
В редких случаях файл explorer.exe заменяется другой программой, фильтр поиска можно адаптировать к этому случаю. Если команда возвращает пустую строку, вероятно, ни один пользователь не вошел в систему. В Windows 7 также можно запустить [запрос сеанса | найти ">"].
Чтобы найти ответ 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