我一直在尝试使用以下代码获取当前登录用户的令牌信息:
[DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool WTSQueryUserToken(int sessionId, out IntPtr tokenHandle);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint WTSGetActiveConsoleSessionId();
static void Main(string[] args)
{
try
{
int sessionID = (int)WTSGetActiveConsoleSessionId();
if (sessionID != -1)
{
System.IntPtr currentToken = IntPtr.Zero;
bool bRet = WTSQueryUserToken(sessionID, out currentToken);
Console.WriteLine("bRet : " + bRet.ToString());
}
}
catch (Exception)
{
}
}
问题在于,bRet始终为false且currentToken始终为0。 我将sessionid视为1。
有人能告诉我这里出了什么问题吗?
我想使用此令牌信息将其从Windows服务传递给CreateProcessAsUser函数。
谢谢, 拉姆
答案 0 :(得分:1)
您是将此代码作为Windows服务运行还是仅在普通的Console或WinForms应用程序中运行? WTSQueryUSerToken只能由在LocalSystem帐户下运行的应用程序调用,这可以通过将其作为Windows服务运行来实现。