wtsenumeratesessions 예제

http://www.pinvoke.net/default.aspx/wtsapi32.wtsenumeratesessions 위에서 설명한 바와 같이, WTSEnumerateSessions 함수 실패의 경우, RPC_S_INVALID_BINDING 오류 코드는 종속 TermServ 중 하나가 상황을 나타내는 지표일 수 있습니다. 서비스가 시작되지 않으므로 예외적인 상황이 아니며 이 경우 로그 항목을 추가하는 것이 가장 좋습니다. 이제 CSessionManager 클래스 및 UpdateSessionState 함수로 돌아갑니다. 세션에 대한 정보를 로그 파일(사용자 이름, 로그온 또는 로그아웃 이벤트)에 기록합니다. ` Dim iCurrent as 정수 = pSessionInfo.ToInt32 ` Dim _Message as string.Empty `터미널 서비스 세션 정보 구조 _ 개인 구조 WTS_SESSION_INFO Public iSessionID 정수로 공개 sWinsWorkstationName 문자열 공개 oState로 WTS_ CONNECTSTATE_CLASS 엔드 구조 원격 데스크톱 서비스 API(이전의 터미널 서비스)를 사용하면 원격 데스크톱 세션 호스트(RD 세션 호스트) 서버, 클라이언트 세션 및 프로세스를 개명하고 관리할 수 있습니다. 세션 및 프로세스에 대한 정보를 검색합니다. 이것은 내가 찾고있는 것입니다 하지만 난 단지 vb.net 사용. 내 능력은 자신을 변환하기에 충분하지 않습니다 – 나는 누군가가 그들이 공유 할 수있는 vb.net 버전을 가지고 있다고 생각하지 않습니다? 세션 상태 모니터링에 대한 기능 코드는 연산자()에서 구현됩니다. 함수 대신 boost::thread와 함께 사용하는 연산자입니다. 세션 상태의 변경에 대한 알림을 받으려면 다음 코드를 별도의 스레드에서 실행해야 합니다. 다음은 WTSWaitSystemEvent 기능을 사용하는 작업의 sipmle 그림입니다: 내가 겪고있는 문제는 모든 RDS 세션을 등록하고 모든 사람에게 텍스트 상자를 보내는 방법입니다.

WTSEnumerate세션은 트릭을해야하는 것처럼 보이지만이 API 호출을 스크립트에 통합하는 방법에 대해 손실입니다. 옵션 에 명시적 수입 시스템에.Runtime.InteropServices 공용 클래스 관리WTSAPI 개인 열거형 WTS_CONNECTSTATE_CLASS WTSActive WTSConnect WTSConnectWTS를 분리WTSIdle WTSRereset WTSInit 엔드 열거 _ 개인 구조 WTS_SESSION_INFO Dim 세션ID Int32 `DWORD 정수 Dim pWinStationName 문자열로` 정수 LPTSTR – 포인터의 이름을 포함하는 null 종료 문자열에 대한 포인터 이 세션에 대한 윈스테이션 WTS_CONNECTSTATE_CLASS 최종 구조 친구 구조 strSessionsInfo Dim SessionID 문자열 희미한 스테이션 이름으로 문자열 희미한 연결상태 문자열 끝 구조 _ 개인 공유 함수 WTSEnumerateSessions (_ ByVal hServer intPtr로_ ByVal hServer, _ _ Int32로 예약된 바이발, _ _ ByVal Vesrion as Int32, _ ByRef ppSessionInfo intPtr, _ _ Int32End32로 ByRef pCount _ 개인 공유 하위 WTSFreeMemory (ByVal pMemory intPtr로) 엔드 서브 <DllImport ("wtsapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)] _ 개인 공유 함수 WTSOpenServer(ByVal pServerName) 최종 기능 _ 개인 공유 하위 WTSCloseServer(IntPtr로 ByVal hServer) 엔드 하위 친구 함수 GetSessions(문자열로 Byval 서버 이름) ptrOpenedServer as intPtr Dim RetVal as strSessionsInfo() 시도 ptropenedServer = WTSOpenServer (서버이름) Dim FRetVal as Int32 Dim ppSessionInfo as IntPtr = IntPtr.Zero Dim 카운트 intPtr = 0 시도 FRetVal = WTSEnumerateSessions (ptrOpenServer, 0, 1, ptrOpenServer, 0, 1, ppSessionInfo, 카운트) FRetVal 경우 0 다음 희미한 세션Info() 로 WTS_SESSION_INFO =새로운 WTS_SESSION_INFO (카운트) {} Dim i 정수 희미한 데이터 크기 = Marshal.SizeOf (새로운 WTS_SESSION_INFO) 희미한 전류 로 Int64 현재 = ppSessionInfo.ToInt64 i = 0 에 카운트 – 1 단계 i + 1 세션Info (i) = CType (Marshal.PtrToStructure (현재), GetType (WTS_SESSION_INFO)), 현재 = 데이터 크기 다음 WTSFreeMemory (ppSessionInfo) 희미한 tmpArr (sessionInfo.GetUpperBound (0)) i = 0 to tmpArr.GetUpperBound (0) tmpArr(i). 세션ID = 세션Info(i). 세션ID tmpArr(i). 스테이션 이름 = 세션Info(i).pWinStationName tmpArr(i). 연결 상태 = GetConnectionState(세션Info(i). 상태) 다음 ReDim 세션Info(-1) RetVal = tmpArr Else throw 새 응용 프로그램예외(«다시 실행된 데이터 없음») 예외로 catch ex를 새 예외(예: throw하는 경우) 종료합니다. 메시지 및 vbCrLf 및 System.Runtime.InteropServices.Marshal.GetLastWin32Error) 종료 예외가 새 예외를 throw로 catch ex를 시도 (예. 메시지) 종료 기능 마침내 WTSCloseSer