现在我有检测连接到Windows远程桌面(mstsc.exe)到Windows XP用户的会话ID的代码,但我想知道他们的用户名。
[DllImport("wtsapi32.dll")] static extern IntPtr WTSOpenserver([MarshalAs(UnmanagedType.LPStr)] String pserverName); [DllImport("wtsapi32.dll")] static extern void WTSCloseserver(IntPtr hserver); [DllImport("wtsapi32.dll")] static extern Int32 WTSEnumerateSessions( IntPtr hserver, [MarshalAs(UnmanagedType.U4)] Int32 Reserved, [MarshalAs(UnmanagedType.U4)] Int32 Version, ref IntPtr ppSessionInfo, [MarshalAs(UnmanagedType.U4)] ref Int32 pCount); [DllImport("wtsapi32.dll")] static extern void WTSFreeMemory(IntPtr pMemory); [DllImport("Wtsapi32.dll")] static extern bool WTSQuerySessionInformation( System.IntPtr hserver, int sessionId, WTS_INFO_CLASS wtsInfoClass, out System.IntPtr ppBuffer, out uint pBytesReturned); [StructLayout(LayoutKind.Sequential)] private struct WTS_SESSION_INFO { public Int32 SessionID; [MarshalAs(UnmanagedType.LPStr)] public String pWinStationName; public WTS_CONNECTSTATE_CLASS State; } public enum WTS_INFO_CLASS { WTSInitialProgram, WTSApplicationName, WTSWorkingDirectory, WTSOEMId, WTSSessionId, WTSUserName, WTSWinStationName, WTSDomainName, WTSConnectState, WTSClientBuildNumber, WTSClientName, WTSClientDirectory, WTSClientProductId, WTSClientHardwareId, WTSClientAddress, WTSClientDisplay, WTSClientProtocolType } public enum WTS_CONNECTSTATE_CLASS { WTSActive, WTSConnected, WTSConnectQuery, WTSShadow, WTSDisconnected, WTSIdle, WTSlistn, WTSReset, WTSDown, WTSInit } public static IntPtr Openserver(String Name) { IntPtr server = WTSOpenserver(Name); return server; } public static void Closeserver(IntPtr serverHandle) { WTSCloseserver(serverHandle); } public static DataTable ListUsers(String serverName) { DataTable DtResult = new DataTable(); DtResult.Columns.Add("Domain"); DtResult.Columns.Add("User"); IntPtr serverHandle = IntPtr.Zero; List<String> resultList = new List<string>(); serverHandle = Openserver(serverName); try { IntPtr SessionInfoPtr = IntPtr.Zero; IntPtr userPtr = IntPtr.Zero; IntPtr domainPtr = IntPtr.Zero; Int32 sessionCount = 0; Int32 retVal = WTSEnumerateSessions(serverHandle, 0, 1, ref SessionInfoPtr, ref sessionCount); Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO)); Int32 currentSession = (int)SessionInfoPtr; uint bytes = 0; if (retVal != 0) { for (int i = 0; i < sessionCount; i++) { WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)currentSession, typeof(WTS_SESSION_INFO)); currentSession += dataSize; WTSQuerySessionInformation(serverHandle, si.SessionID, WTS_INFO_CLASS.WTSUserName, out userPtr, out bytes); WTSQuerySessionInformation(serverHandle, si.SessionID, WTS_INFO_CLASS.WTSDomainName, out domainPtr, out bytes); DtResult.Rows.Add(Marshal.PtrToStringAnsi(domainPtr) ,Marshal.PtrToStringAnsi(userPtr)); WTSFreeMemory(userPtr); WTSFreeMemory(domainPtr); } WTSFreeMemory(SessionInfoPtr); } } finally { Closeserver(serverHandle); } return DtResult; }
如果您想要处理P / Invokes,也可以使用Cassia库 。 查看代码示例的答案 。