2010-05-21 52 views
0

我一直在试图让当前登录使用下面的代码用户的令牌信息:无法获取当前用户的令牌信息

[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) 
     { 
     } 
    } 

的问题是,布雷特永远是假的,currentToken总是0. 我得到的sessionid为1.

有人能告诉我这里出了什么问题吗?

我想使用这个令牌信息从Windows服务传递给CreateProcessAsUser函数。

感谢, 拉姆

回答

1

你运行此代码作为Windows服务或只是一个正常的控制台或WinForms应用程序? WTSQueryUSerToken只能由在LocalSystem帐户下运行的应用程序调用,可以通过将其作为Windows服务运行来实现。

+0

非常感谢Chris ...我知道WTSQueryUSerToken()只能用于服务。我曾试着从一个控制台应用程序中尝试它,并认为它对于服务也是一样的......我将这个代码包含在我的服务中,并在短时间内恢复...... – Ram 2010-05-21 11:41:18

+0

这在作为Windows服务运行时起作用...非常感谢,Chris ... – Ram 2010-05-21 11:50:29

+0

@Ram,太棒了!很高兴帮助。 – 2010-05-21 11:51:11