internal static extern uint NetSessionEnum([MarshalAs(UnmanagedType.LPWStr)] string serverName, [MarshalAs(UnmanagedType.LPWStr)] string uncClientName, [MarshalAs(UnmanagedType.LPWStr)] string userName, [MarshalAs(UnmanagedType.U4)] SessionInfoLevel level, out SafeGlobalMemoryBufferHandle bufPtr, [MarshalAs(UnmanagedType.I4)] int prefMaxLen, [MarshalAs(UnmanagedType.U4)] out uint entriesRead, [MarshalAs(UnmanagedType.U4)] out uint totalEntries, [MarshalAs(UnmanagedType.U4)] out uint resumeHandle);
        /// <summary>Creates a <see cref="SessionInfo"/> instance.</summary>
        /// <param name="hostName">The DNS or NetBIOS name of the specified host.</param>
        /// <param name="sessionLevel">One of the <see cref="SessionInfoLevel"/> options.</param>
        /// <param name="structure">
        /// A <see cref="NativeMethods.SESSION_INFO_502"/>, <see cref="NativeMethods.SESSION_INFO_2"/>,
        /// <see cref="NativeMethods.SESSION_INFO_1"/>, <see cref="NativeMethods.SESSION_INFO_10"/> or <see cref="NativeMethods.SESSION_INFO_0"/> instance.
        /// </param>
        internal SessionInfo(string hostName, SessionInfoLevel sessionLevel, object structure)
        {
            var flags = 0;


            switch (sessionLevel)
            {
            case SessionInfoLevel.Info502:
                var sesi502 = (NativeMethods.SESSION_INFO_502)structure;
                NetName         = sesi502.sesi502_cname;
                UserName        = sesi502.sesi502_username;
                OpenedResources = (int)sesi502.sesi502_num_opens;
                ActiveTime      = TimeSpan.FromSeconds((int)sesi502.sesi502_time);
                IdleTime        = TimeSpan.FromSeconds((int)sesi502.sesi502_idle_time);
                ClientType      = sesi502.sesi502_cltype_name;
                TransportType   = sesi502.sesi502_transport;
                flags           = (int)sesi502.sesi502_user_flags;
                break;


            case SessionInfoLevel.Info2:
                var sesi2 = (NativeMethods.SESSION_INFO_2)structure;
                NetName         = sesi2.sesi2_cname;
                UserName        = sesi2.sesi2_username;
                OpenedResources = (int)sesi2.sesi2_num_opens;
                ActiveTime      = TimeSpan.FromSeconds((int)sesi2.sesi2_time);
                ClientType      = sesi2.sesi2_cltype_name;
                flags           = (int)sesi2.sesi2_user_flags;
                break;


            case SessionInfoLevel.Info1:
                var sesi1 = (NativeMethods.SESSION_INFO_1)structure;
                NetName         = sesi1.sesi1_cname;
                UserName        = sesi1.sesi1_username;
                OpenedResources = (int)sesi1.sesi1_num_opens;
                ActiveTime      = TimeSpan.FromSeconds((int)sesi1.sesi1_time);
                IdleTime        = TimeSpan.FromSeconds((int)sesi1.sesi1_idle_time);
                flags           = (int)sesi1.sesi1_user_flags;
                break;


            case SessionInfoLevel.Info10:
                var sesi10 = (NativeMethods.SESSION_INFO_10)structure;
                NetName    = sesi10.sesi10_cname;
                UserName   = sesi10.sesi10_username;
                ActiveTime = TimeSpan.FromSeconds((int)sesi10.sesi10_time);
                IdleTime   = TimeSpan.FromSeconds((int)sesi10.sesi10_idle_time);
                break;


            case SessionInfoLevel.Info0:
                var sesi0 = (NativeMethods.SESSION_INFO_0)structure;
                NetName = sesi0.sesi0_cname;
                break;
            }


            HostName = hostName;

            SessionLevel = sessionLevel;

            // SESS_GUEST = 1,
            // SESS_NOENCRYPTION = 2

            GuestSession = flags == 1;

            EncryptedSession = !GuestSession && flags != 2;
        }