public void DeleteAllSessionIdsNotInList(WTSUniqueSessionIdList _valid_session_ids)
        {
            WTSUniqueSessionIdList kill_list = new WTSUniqueSessionIdList();

            foreach (WTSSession s in this)
            {
                bool kill = true;
                for (int i = 0; i < _valid_session_ids.Count; i++)
                {
                    if (s.UniqueSessionId == _valid_session_ids[i])
                    {
                        kill = false;
                        break;
                    }
                }
                if (kill)
                {
                    kill_list.Add(s.UniqueSessionId);
                }
            }
            if (kill_list.Count > 0)
            {
                this.RemoveSessions(kill_list);
            }
        }
        private void RefreshThread_DoWork(object sender, DoWorkEventArgs e)
        {
            WTSUniqueSessionIdList valid_session_ids = new WTSUniqueSessionIdList();

            foreach (string server in this.WTSServerHostnames)
            {
                IntPtr hServer = IntPtr.Zero;
                try
                {
                    IntPtr SessionInfoPtr = IntPtr.Zero;
                    Int32  sessionCount   = 0;
                    Int32  dataSize       = Marshal.SizeOf(typeof(Jrfc.NativeMethods.WTS_SESSION_INFO));

                    hServer = Jrfc.NativeMethods.WTSOpenServer(server);
                    Int32 retVal = Jrfc.NativeMethods.WTSEnumerateSessions(hServer, 0, 1, ref SessionInfoPtr, ref sessionCount);
                    if (retVal != 0)
                    {
                        Int32 currentSession = (int)SessionInfoPtr;
                        for (int i = 0; i < sessionCount; i++)
                        {
                            Jrfc.NativeMethods.WTS_SESSION_INFO si = (Jrfc.NativeMethods.WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)currentSession, typeof(Jrfc.NativeMethods.WTS_SESSION_INFO));
                            currentSession += dataSize;

                            Jrfc.Wts.WTSSession session = new Jrfc.Wts.WTSSession(hServer, server, si);

                            bool filter = false;
                            if (session.State == NativeMethods.WTS_CONNECTSTATE_CLASS.WTSListen)
                            {
                                filter = true;
                            }
                            else if (session.State == NativeMethods.WTS_CONNECTSTATE_CLASS.WTSDisconnected && string.IsNullOrWhiteSpace(session.Username))
                            {
                                filter = true;
                            }
                            if (!filter)
                            {
                                this.AddOrUpdate(session);
                                valid_session_ids.Add(new WTSUniqueSessionId(server, session.SessionId)); // keep a list of existing sessions
                            }
                        }
                        Jrfc.NativeMethods.WTSFreeMemory(SessionInfoPtr);
                    }
                }
                catch (System.Exception x)
                { Jrfc.Exception.HandleException(x); }
                finally
                { if (hServer != IntPtr.Zero)
                  {
                      Jrfc.NativeMethods.WTSCloseServer(hServer);
                  }
                }
            }
            DeleteAllSessionIdsNotInList(valid_session_ids); // delete (old) sessions that are in the currect session list,
                                                             // but were not in the existing sessions just retreived from the
                                                             // RDS server. Presumably any session not in the valid_session_ids
                                                             // list no longer exists.
            this.m_RefreshThread.ReportProgress(100);
        }
        public void RemoveSessions(WTSUniqueSessionIdList _SessionIds)
        {
            if (_SessionIds.Count == 0)
            {
                return;
            }

            foreach (WTSUniqueSessionId id in _SessionIds)
            {
                for (int i = 0; i < this.Count; i++)
                {
                    if (this[i].UniqueSessionId == id)
                    {
                        Application.Current.Dispatcher.Invoke((Action) delegate
                        {
                            this.RemoveAt(i);
                        });
                        break;
                    }
                }
            }
        }