이것은 내 코드는 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 사용자가 관리자로 로그인했습니다.
- 나는 하나님, 사탄, 불다, 라엘에게기도하고있었습니다.
또한 관리자 권한 상승이 필요한 실행 파일에 대한 매니페스트를 만들었습니다.
아무것도 작동하지 않으며 항상 똑같은 예외가 발생합니다. 나는 아이디어가 없습니다 ...
** SetLastError = true를 WTSQueryUserToken의 DllImport 특성에 추가해야합니다. 그렇지 않으면 GetLastWin32Error가 의미가 없습니다. 또한 설명서에서 규정 한대로 LocalSystem 계정의 컨텍스트에서이를 실행하고 있습니까 ("관리 사용자"가 아님)? –
그건 RTFM 순간 중 하나입니다 ... 내가 놓친 것은 LocalSystem 계정으로 실행하는 것뿐이었습니다. 나는 내 자신의 사용자가 프로세스를 자체적으로 생성 할 수있는 권한을 가지고 있다고 생각했지만 그렇지 않습니다. –
당신은 이것을 답으로 추가 할 수 있습니다. 당신이 충분히받을만한 포인트를 원한다면 나는 그것을 받아 들일 것입니다. 아니면 오늘 나중에 할 것입니다. –