WbitQueryUserToken在32位Windows(64位工作)之后“Win32Exception:操作成功完成”

时间:2012-07-05 18:54:36

标签: c# .net winapi interop win32exception

我正在开发一个C#中的小型Windows服务,需要在某些时候与Win32 API互操作。我收到以下异常,这对我来说没有意义:

System.ComponentModel.Win32Exception: The operation completed successfully

在此C#代码段的最后一行之后:

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

以下是我在WTSQueryUserToken中声明WtsApi32的方式:

[DllImport("Wtsapi32.dll", EntryPoint="WTSQueryUserToken")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSQueryUserToken
(
    [In, MarshalAs(UnmanagedType.U8)] ulong sessionId, 
    [Out] out IntPtr phToken
);

一些事实:

  • 这适用于64位Win7,但在32位Win7上失败
  • 执行此操作时无法访问10,000 handle limit,这是一个非常小的Windows服务中的第一个Win32调用。
  • 我认为可能存在一些潜在的Win32错误但是有些错误用0覆盖了错误代码,因此给了我“成功”错误消息,但我不知道如何确认甚至诊断它。
  • 当我捕获异常时,sessionId为1且userTokenPtr为0.但是,GetLastError返回0,所以我不知道发生了什么。
  • 我发现此问题的几乎所有答案都与improper disposal of user controls有关。由于这是一项Windows服务,情况并非如此

我猜我的WTSQueryUserToken声明一定有问题,因为它只能在32位Windows上失败,这让我觉得它是一个编组问题。但是,我仍然看不出它可能是什么。

1 个答案:

答案 0 :(得分:4)

您的sessionId参数我们定义为c#ulong - 无符号的64位整数,而实际的函数导出期望Win32 ulong - 无符号的32位整数。

c# ulong data type

Win32 data types