我正在尝试使用 C# 中WtsEnumerateSessionsExA
定义的函数枚举所有远程桌面会话WtsApi32.dll
。
该函数写入一个WTS_SESSION_INFO_1A
结构数组,其指针作为参数传递。您可以在此处找到文档:
我已经像这样在 C#中实现了WTS_SESSION_INFO_1A
结构和:WTS_CONNECT_STATE_CLASS
struct WtsSessionInfoClass
{
uint ExecEnvId;
WtsConnectStateClass state;
uint sessionId;
string pSessionName;
string pHostName;
string pUserName;
string pDomainName;
string pFarmName;
}
enum WtsConnectStateClass
{
WTSActive,
WTSConnected,
WTSConnectQuery,
WTSShadow,
WTSDisconnected,
WTSIdle,
WTSListen,
WTSReset,
WTSDown,
WTSInit
}
我在一个名为的类中导入了所需的函数Native32
:
[DllImport("WtsApi32.dll")]
internal static extern IntPtr WTSOpenServerEx(string name);
[DllImport("WtsApi32.dll")]
internal static extern bool WTSEnumerateSessionsExA(
IntPtr hServer,
UIntPtr pLevel,
uint Filter,
out WtsSessionInfoClass[] ppSessionInfo,
UIntPtr pCount
);
最后我的实现如下:
UIntPtr len = new UIntPtr();
WtsSessionInfoClass[] sessions;
IntPtr handle = Native32.WTSOpenServerEx("MyMachineName"); // This function gets the server handle and works fine
Native32.WTSEnumerateSessionsExA(handle, new UIntPtr(1), 0, out sessions, len); // This function will produce AccessViolationException
...
执行代码时,Native32.WTSEnumerateSessionsExA
由于AccessViolationException
.
我在这里做错了什么?任何帮助表示赞赏。