我正在尝试从 Windows 7 上的 Windows 服务启动一个进程。
这是我获取用户令牌的代码。
uint sessionId = Kernel32.WTSGetActiveConsoleSessionId();
var userTokenPtr = new IntPtr();
if (!WtsApi32.WTSQueryUserToken(sessionId, out userTokenPtr))
{
int lastError = Marshal.GetLastWin32Error();
throw new Win32Exception(lastError);
}
这些是 DllImport 语句:
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);
}
我从这个答案中获取了代码并按原样复制了它:https ://stackoverflow.com/a/11266955/410075
它总是抛出 Win32Exception 并显示消息“尝试引用不存在的令牌”。这是数据:sessionId = 1 和 lastError = 1008。
我试图将其运行为:
- 调试过程(使用 Visual Studio 托管过程)
- 调试过程(没有 Visual Studio 托管过程)
- 管理员用户
- 提升的管理员用户
- Windows 服务。
- 以管理员用户身份登录的 Windows 服务。
- 当我向上帝、撒旦、Buddah 和 Rael 祈祷时。
我还为可执行文件创建了一个清单以要求管理员提升。
没有任何效果,它总是抛出完全相同的异常。我没主意了...