2015-01-22 3 views
5

Пример: Я вошел в систему как пользователь TestUser. От этого пользователя я собираюсь запустить командную строку в качестве администратора с именем AdminUser.Получить в настоящее время пользователя на Windows

Возможно ли из этой командной строки определить имя текущего входа в TestUser?

У меня уже есть запланированная задача, которая всегда работает как AdminUser, но в ее действии (пакетный файл) мне нужно имя текущего пользователя.

Любые идеи?

+0

Можете ли вы пояснить, что подразумевается под «в настоящее время зарегистрированным пользователем»? Вы ограничиваете это консолью? Подключены ли подключения к удаленным рабочим столам? Если это серверная ОС, как бы вы выбрали между RDP-чиллерами? – mojo

+0

не уверен, потому что не может попробовать в данный момент, но выполняет ли 'tasklist/v | find" explorer.exe "' help? – Stephan

+1

Возможный дубликат * [Как найти текущего пользователя в среде Windows?] (Http://stackoverflow.com/questions/1607271/how-do-you-find-the-current-user-in-a- окна-среда) *. –

ответ

5

Насколько я знаю, на самом деле это невозможно. В зависимости от того, как много вы знаете о среде пользователей, следующий может быть обходным путем, однако:

Команды

qwinsta 

даст вам список сеансов для компьютера. В течение этих сеансов один из них будет активным, поэтому, если эта программа используется в интерактивном сеансе, в основном это будет содержать «зарегистрированный пользователь», как вы его описали (это намного сложнее, может быть, многие пользователи вошли в систему но только один может быть активным, и я просто надеюсь, что вы знаете достаточно о сценарии использования вашей программы, чтобы использовать это). Вы можете анализировать выходные данные и работать с этим именем пользователя.

Конечно, это грязный хак, и он предполагает, что во время выполнения вашей задачи нет никаких шансов, что пользователи изменятся.

Кроме того, хотя я выбрал qwinsta.exe, потому что это очень простой подход, который не требует вызовов API или что-то еще, я все еще не уверен, обладает ли CMD достаточными возможностями синтаксического анализа, чтобы получить необходимую информацию для вас.

+0

Спасибо. Это решение, как правило, работает. Но в случае, если нет. Я скажу тебе почему. В основном мне нужно запустить командный файл только при выходе администратора. Поэтому моя задача запускается в событии безопасности 4647 (событие выхода). Поэтому я тестирую ваше предложение, и активных сеансов больше нет. Я пытался выполнить это через скрипты групповой политики с помощью реестра, но он очень нестабилен и не работает для меня. – dEVIANT

+1

Значит, вам не нужен активный пользователь, но последний активный? В таком случае я бы предложил другое обходное решение. Если вы не можете гарантировать удаленные сеансы, вы можете попробовать ключ HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Authentication \ LogonUI \ LastLoggedOnUser, это в основном ключевые окна, используемые для отображения последнего пользователя на экране входа в систему. Удаленные сеансы там не сохраняются ... Если у вас есть они, я бы сказал, напишите программу, которая перезаписывает reg-файл или файл с помощью userinfo при каждом входе в систему и запрашивает вашу собственную информацию позже. – Syberdoor

+0

Отлично! Это работает очень хорошо! – dEVIANT

4

%username% переменная содержит .. ну, имя пользователя.

echo/%username%

EDIT

Как вы сказали, потому что вы находитесь в запланированное задание, вы можете получить имя пользователя из реестра Windows

@echo off 
for /f "tokens=3" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData\1 /v LoggedOnUserName') do (
set "user=%%a") 
set "user=%user:.\=%" 
echo/%user% 

Теперь %user% переменная содержит вошедшего имя пользователя.

+1

Да, но это вернет AdminUser, поскольку он является исполнителем запланированных задач. Даже если в Windows вы зарегистрированы как TestUser.Я пробую это, также также whoami command :) – dEVIANT

+0

Моя ошибка, проверьте правильность ответа! – Rafael

+1

Это не сработает, если есть пользователи с отключенными сеансами. Однако, если dEVIANT может управлять этим сценарием, это намного менее сумасшествие, чем моя идея. – Syberdoor

0

Вот быстрый способ, чтобы это произошло с помощью пакетного файла будет команда:.

for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do set tempVar=%%j 

echo %tempVar% покажет то, что пользователь фактически вошли в систему не пользователь, который запустил пакетный файл.