Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }