2015-01-22 3 views
5

예 : 사용자 TestUser로 로그인했습니다. 이 사용자로부터 AdminUser라는 관리자로 명령 줄을 실행하려고합니다.현재 Windows에 로그온 한 상태로 로그온하십시오.

이 명령 줄에서 현재 로그인 한 TestUser의 이름을 확인할 수 있습니까?

AdminUser로 항상 실행중인 예약 된 작업이 있지만 작업 (배치 파일)에서 현재 로그인 한 사용자의 이름이 필요합니다.

아이디어가 있으십니까?

+0

"현재 로그인 한 사용자"의 의미를 명확히 할 수 있습니까? 이걸 콘솔로 제한하고 있습니까? 원격 데스크톱 연결이 중요합니까? 이것이 서버 OS 인 경우 어떻게 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- windows-environment) *. –

답변

5

내가 아는 한, 이것은 실제로 가능하지 않습니다.

명령

qwinsta 

는 당신에게 컴퓨터에 대한 세션의 목록을 제공합니다 : 는 사용자의 환경에 대해 얼마나 알고 있는지에 따라 다음 그러나 해결 될 수 있습니다. 이 세션들 중에 하나가 활성화 될 것입니다. 따라서이 프로그램이 대화식 세션에서 사용된다면 이것은 설명 된대로 기본적으로 "로그인 한 사용자"를 포함하게 될 것입니다 (실제로 훨씬 더 복잡합니다. 로그온 한 사용자가 많을 수 있습니다 그러나 오직 하나만 활성화 될 수 있으며, 나는 그것을 사용하기위한 프로그램의 사용 시나리오에 대해 충분히 알고 있기를 바랍니다.) 출력을 구문 분석하고 해당 사용자 이름으로 작업 할 수 있습니다.

물론 이것은 더러운 해킹이며 사용자 작업이 실행되는 동안 사용자가 변경 될 가능성은 없다고 가정합니다.

또한 API 호출이 필요없는 매우 기본적인 접근 방식이므로 qwinsta.exe를 선택했지만 CMD에 필요한 정보를 얻기에 충분한 구문 분석 기능이 있는지 확실하지 않습니다.

+0

감사합니다. 이 솔루션은 정상적으로 작동합니다. 하지만 내 경우에는. 나는 왜 너에게 말할 것이다. 기본적으로 나는 관리자 로그 아웃에서만 배치 파일을 실행해야합니다. 그래서 내 작업은 보안 이벤트 4647 (로그 오프 이벤트)에서 트리거됩니다. 그래서 제안을 테스트하고 더 이상 진행중인 세션이 없습니다. 그룹 정책을 통해 레지스트리를 통해 스크립트를 로그 오프하려고 시도했지만 매우 불안정하고 저에게 적합하지 않습니다. – dEVIANT

+1

따라서 활성 사용자는 필요하지 않지만 마지막 사용자는 필요하지 않습니까? 이 경우 나는 또 다른 해결 방법을 제안 할 것이다. 원격 세션을 보장 할 수 없다면 HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Authentication \ LogonUI \ LastLoggedOnUser 키를 사용해보십시오. 기본적으로이 키는 Windows에서 로그온 화면의 마지막 사용자를 표시하는 데 사용됩니다. 원격 세션은 거기에 저장되지 않습니다 ... 만약 당신이 그들에게 나는 모든 로그인에 대한 사용자 정보와 reg 키 또는 파일을 덮어 쓰고 나중에 자신의 정보를 쿼리하는 프로그램을 작성한다고 말할 것입니다 – Syberdoor

+0

그레이트! 이것은 아주 잘 작동합니다! – dEVIANT

4

%username% 변수에 .. 글쎄, 사용자 이름.

echo/%username%

편집

당신은 당신이 예약 된 작업이기 때문에, 당신은

@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% 변수는 기록이 포함되어 Windows 레지스트리에서 사용자 이름을 얻을 수 말했듯 사용자 이름.

+1

예, 예약 된 작업의 실행자이므로 AdminUser를 반환합니다. Windows에서 TestUser로 로그인 한 경우에도 마찬가지입니다.나는 또한 whoami 명령을 사용해보십시오 :) – 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% 실제로 로그인 한 어떤 사용자가 표시됩니다 배치 파일을 실행하지 사용자.

관련 문제