public List <SESSION_INFO_10> GetRemoteSessionInfo(string targetedSystem) { IntPtr Bufptr; int nStatus = 0; List <SESSION_INFO_10> sessionInfo = new List <SESSION_INFO_10>(); Int32 dwEntriesread = 0, dwTotalentries = 0, dwResume_handle = 0; Bufptr = (IntPtr)Marshal.SizeOf(typeof(SESSION_INFO_10)); SESSION_INFO_10[] results = new SESSION_INFO_10[0]; do { nStatus = NetSessionEnum(targetedSystem, null, null, 10, out Bufptr, -1, ref dwEntriesread, ref dwTotalentries, ref dwResume_handle); results = new SESSION_INFO_10[dwEntriesread]; if (nStatus == 234 || nStatus == 0) { Int64 p = Bufptr.ToInt64(); for (int i = 0; i < dwEntriesread; i++) { SESSION_INFO_10 si = (SESSION_INFO_10)Marshal.PtrToStructure(new IntPtr(p), typeof(SESSION_INFO_10)); sessionInfo.Add(si); p += Marshal.SizeOf(typeof(SESSION_INFO_10)); } } Marshal.FreeHGlobal(Bufptr); }while (nStatus == 234); return(sessionInfo); }
/// <summary> /// 返回指定服务器的所有 SESSIONS。返回 SESSION_INFO_10 结构的数组。 /// https://www.pinvoke.net/default.aspx/netapi32/NetSessionEnum.html /// </summary> /// <param name="server">默认所有域内机器,隐形目标:域控制器+共享服务器</param> /// <returns>SESSION_INFO_10 STRUCTURE ARRAY</returns> public static SESSION_INFO_10[] EnumSessions(string server) { IntPtr Bufptr; int nStatus = 0; Int32 dwEntriesread = 0, dwTotalentries = 0, dwResume_handle = 0; Bufptr = (IntPtr)Marshal.SizeOf(typeof(SESSION_INFO_10)); SESSION_INFO_10[] results = new SESSION_INFO_10[0]; do { nStatus = NetSessionEnum(server, null, null, 10, out Bufptr, -1, ref dwEntriesread, ref dwTotalentries, ref dwResume_handle); results = new SESSION_INFO_10[dwEntriesread]; if (nStatus == (int)NERR.ERROR_MORE_DATA || nStatus == (int)NERR.NERR_Success) { Int32 p = Bufptr.ToInt32(); for (int i = 0; i < dwEntriesread; i++) { SESSION_INFO_10 si = (SESSION_INFO_10)Marshal.PtrToStructure(new IntPtr(p), typeof(SESSION_INFO_10)); results[i] = si; p += Marshal.SizeOf(typeof(SESSION_INFO_10)); } } // 释放先前从进程的非托管内存分配的内存。 Marshal.FreeHGlobal(Bufptr); }while (nStatus == (int)NERR.ERROR_MORE_DATA); // 该 NetApiBufferFree函数释放该内存 NetApiBufferAllocate功能分配。应用程序还应调用NetApiBufferFree释放其他网络管理功能在内部使用的内存以返回信息。 //NetApiBufferFree(BufPtr); return(results); }