Получить имя пользователя для входа в систему с повышенными правами со стандартной учетной записью пользователя - PullRequest
1 голос
/ 24 апреля 2020

В моем пакетном скрипте, запущенном в Windows 7, у меня есть несколько предложений IF, таких как:

IF "%USERNAME%"=="foo" GOTO bar

К сожалению, когда я запускаю этот пакетный скрипт с повышенными правами " Запуск от имени администратора"из контекстного меню %USERNAME% - это всегда имя пользователя администратора, а не имя текущего активного пользователя входа в систему.

То же самое относится к whoami в пакетном скрипте с повышенными правами.

QUERY USER дает мне список всех пользователей, которые в настоящее время вошли в систему, а не только одного пользователя, которого я ищу.

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

Есть ли способ получить текущее имя пользователя для активного входа в систему вместо администраторов имя пользователя?

1 Ответ

1 голос
/ 25 апреля 2020

WMI C ComputerSystem Get UserName

@echo off
setlocal

rem Get logon username without the leading "computername\" string.
set "user="

for /f "skip=1 tokens=1,* delims=\" %%A in (
    'wmic computersystem get username ^|findstr /r /v "^$"'
) do for %%C in (%%~B) do if not defined user set "user=%%~C"

echo "%user%"
pause

Использование опции for /f skip=1, поскольку 1-я строка - это заголовок UserName, который не нужен. Разделите на \, так как значение будет похоже на computername\username и получите остаток во 2-м токене. Трубопровод к findstr, чтобы игнорировать пустые строки. 2-е for l oop получит первое значение, свободное от пробельных символов.

Piping wmic выводит к powershell, чтобы очистить выходные тесты лучше, чем piping к findstr, и использование 2-й for l oop не требуется.

@echo off
setlocal

rem Get logon username without the leading "computername\" string.
set "user="

for /f "skip=1 tokens=1,* delims=\" %%A in ('
    wmic computersystem get username ^|
    powershell -noprofile -command "$input.trim()"
') do set "user=%%~B"

echo "%user%"
pause

Используйте command /? для получения дополнительной помощи. Большинство команд в коде отображают справку с аргументом /? в командной строке.

Запрос псевдонима пользователя QUser

@echo off
setlocal

rem Get logon username.
set "user="

for /f %%A in ('quser^|findstr /b /c:">"') do set "user=%%~A"

if defined user if "%user:~0,1%" == ">" set "user=%user:~1%"

echo "%user%"
pause

Ведущий > в quser ( псевдоним для query user) указывает на текущее имя пользователя, а не администратора.

При необходимости используйте %user% вместо %username%.

Примечания:

  • Из-за for /f l oop, получающего имя пользователя из опции по умолчанию token=1, если имя пользователя содержит пробел или табуляцию, тогда будут получены только символы, предшествующие пробелу или вкладка.

  • В 64-разрядной ОС quser.exe существует в System32, а не в SysWOW64. 32-разрядный cmd.exe в 64-разрядной ОС может не распознаваться как команда.

Ссылки:

...