Il prerequisito è ovviamente che l'utente abbia garantito l'accesso a quel server, in caso contrario sarebbe necessario avviare le api impersonando un utente che abbia
le autorizzazioni necessarie ad accedere al server remoto.
Le funzioni principali (e come si integrano un C#) sono le seguenti:
[code] [DllImport("Wtsapi32.dll")] static extern bool WTSQuerySessionInformation( System.IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out System.IntPtr ppBuffer, out uint pBytesReturned); [DllImport("wtsapi32.dll", SetLastError=true)] static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName); [DllImport("wtsapi32.dll")] static extern void WTSCloseServer(IntPtr hServer); [DllImport("wtsapi32.dll", SetLastError = true)] static extern bool WTSLogoffSession(IntPtr hServer, int SessionId, bool bWait); [DllImport("wtsapi32.dll", SetLastError = true)] static extern bool WTSDisconnectSession(IntPtr hServer, int SessionId, bool bWait); [DllImport("wtsapi32.dll", SetLastError = true)] static extern bool WTSTerminateProcess(IntPtr hServer, int ProcessId, bool bWait); [/code]
WTSQuerySessionInformation: recupera i dati delle sessioni presenti in quel momento sul server
WTSOpenServer: apre la connessione al server target
WTSCloseServer: chiude la connessione al server al termine dell'operazione di enumerazione delle sessioni
WTSLogoffSession: esegue il logoff della sessione specificata tramite SESSIONID
WTSDisconnectSession: esegue la disconnessione della sessione specificata
WTSTerminateProcess: termina un processo per quella sessione
Un esempio è mostrato nel listato seguente:
[code] [DllImport("Wtsapi32.dll")] static extern bool WTSQuerySessionInformation( System.IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out System.IntPtr ppBuffer, out uint pBytesReturned); [DllImport("wtsapi32.dll", SetLastError=true)] static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] String pServerName); [DllImport("wtsapi32.dll")] static extern void WTSCloseServer(IntPtr hServer); [DllImport("wtsapi32.dll", SetLastError = true)] static extern bool WTSLogoffSession(IntPtr hServer, int SessionId, bool bWait); [DllImport("wtsapi32.dll", SetLastError = true)] static extern bool WTSDisconnectSession(IntPtr hServer, int SessionId, bool bWait); [DllImport("wtsapi32.dll", SetLastError = true)] static extern bool WTSTerminateProcess(IntPtr hServer, int ProcessId, bool bWait); [DllImport("kernel32.dll", SetLastError = true)] static extern bool GetLastError(); [DllImport("wtsapi32.dll", SetLastError=true)] static extern Int32 WTSEnumerateSessions( IntPtr hServer, [MarshalAs(UnmanagedType.U4)] Int32 Reserved, [MarshalAs(UnmanagedType.U4)] Int32 Version, ref IntPtr ppSessionInfo, [MarshalAs(UnmanagedType.U4)] ref Int32 pCount); [DllImport("wtsapi32.dll")] static extern void WTSFreeMemory(IntPtr pMemory); [StructLayout(LayoutKind.Sequential)] private struct WTS_SESSION_INFO { public Int32 SessionID; [MarshalAs(UnmanagedType.LPStr)] public String pWinStationName; public WTS_CONNECTSTATE_CLASS State; } public enum WTS_INFO_CLASS { WTSInitialProgram, WTSApplicationName, WTSWorkingDirectory, WTSOEMId, WTSSessionId, WTSUserName, WTSWinStationName, WTSDomainName, WTSConnectState, WTSClientBuildNumber, WTSClientName, WTSClientDirectory, WTSClientProductId, WTSClientHardwareId, WTSClientAddress, WTSClientDisplay, WTSClientProtocolType } public enum WTS_CONNECTSTATE_CLASS { WTSActive, WTSConnected, WTSConnectQuery, WTSShadow, WTSDisconnected, WTSIdle, WTSListen, WTSReset, WTSDown, WTSInit } public static IntPtr OpenServer(String Name) { IntPtr server = WTSOpenServer(Name); return server; } public static void CloseServer(IntPtr ServerHandle) { WTSCloseServer(ServerHandle); } public static IntPtr serverHandle = IntPtr.Zero; public static List
Nessun commento:
Posta un commento