2013-05-18 3 views
3

이것은 내 코드는 C#으로 Windows 7에서 "시도가 존재하지 않는 토큰을 참조하려고했습니다"발생 사용자 토큰을 얻으십시오. WTSQueryUserToken는 항상 내가 윈도우 7</p> <p>에 Windows 서비스에서 프로세스를 시작하기 위해 노력하고있어

uint sessionId = Kernel32.WTSGetActiveConsoleSessionId(); 
var userTokenPtr = new IntPtr(); 
if (!WtsApi32.WTSQueryUserToken(sessionId, out userTokenPtr)) 
{ 
    int lastError = Marshal.GetLastWin32Error(); 
    throw new Win32Exception(lastError); 
} 

은 같이 DllImport 문이다 : 그것은 항상 시도가 있었다 "메시지와 함께 Win32Exception을 던졌습니다 https://stackoverflow.com/a/11266955/410075

:처럼 나는이 대답에서 코드를 가져다가 그것을 복사

public class Kernel32 
{ 
    [DllImport("kernel32.dll", EntryPoint = "WTSGetActiveConsoleSessionId")] 
    public static extern uint WTSGetActiveConsoleSessionId(); 
} 

public class WtsApi32 
{ 
    [DllImport("Wtsapi32.dll", EntryPoint = "WTSQueryUserToken")] 
    public static extern bool WTSQueryUserToken(UInt32 sessionId, out IntPtr phToken); 
} 

존재하지 않는 토큰을 참조하도록 만들었습니다 ". 이 데이터입니다 : sessionId가 = 1 lastError = I는이를 실행하려고했다 (1008)

:

  • 디버그 과정을 (비주얼 스튜디오 호스팅 프로세스)
  • 디버그 프로세스를 (없이 은 Visual Studio 호스팅 프로세스)
  • 정보를 관리자
  • 상승 된 관리 사용자
  • Windows 서비스.
  • Windows 사용자가 관리자로 로그인했습니다.
  • 나는 하나님, 사탄, 불다, 라엘에게기도하고있었습니다.

또한 관리자 권한 상승이 필요한 실행 파일에 대한 매니페스트를 만들었습니다.

아무것도 작동하지 않으며 항상 똑같은 예외가 발생합니다. 나는 아이디어가 없습니다 ...

+2

** SetLastError = true를 WTSQueryUserToken의 DllImport 특성에 추가해야합니다. 그렇지 않으면 GetLastWin32Error가 의미가 없습니다. 또한 설명서에서 규정 한대로 LocalSystem 계정의 컨텍스트에서이를 실행하고 있습니까 ("관리 사용자"가 아님)? –

+0

그건 RTFM 순간 중 하나입니다 ... 내가 놓친 것은 LocalSystem 계정으로 실행하는 것뿐이었습니다. 나는 내 자신의 사용자가 프로세스를 자체적으로 생성 할 수있는 권한을 가지고 있다고 생각했지만 그렇지 않습니다. –

+0

당신은 이것을 답으로 추가 할 수 있습니다. 당신이 충분히받을만한 포인트를 원한다면 나는 그것을 받아 들일 것입니다. 아니면 오늘 나중에 할 것입니다. –

답변

2

WTSQueryUserToken의 DllImport 속성에 SetLastError = true를 추가해야합니다. 그렇지 않으면 은 의미가 없습니다.

또한, 당신은 로컬 시스템의 맥락에서이 코드를 실행해야합니다 (다만 "관리자 사용자") as stipulated in the documentation 계정 :

는 로그온 한 사용자 에 의해 지정의 기본 액세스 토큰을 가져옵니다 세션 ID 이 함수를 성공적으로 호출하려면 호출 응용 프로그램이 LocalSystem 계정의 컨텍스트에서 실행 중이어야하며 SE_TCB_NAME 권한이 있어야합니다.