using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.ServiceModel; namespace Asb.Base.V2; public sealed class ConnectContext : IDisposable where T : class, IAuthenticateAsb { private bool disposed; public bool Success { get; set; } public string ErrorMessage { get; set; } public ChannelFactory ServiceChannelFactory { get; set; } public T ServiceClient { get; set; } public IClientChannel ServiceChannel { get; set; } public Guid ConnectionId { get; set; } public string ConnectionUser { get; set; } public string ConnectionApplication { get; set; } ~ConnectContext() { Dispose(disposing: false); } public bool EstablishSecureSession(string solutionName, ClientAccess access) { string errorMessage = string.Empty; Guid connectId = Guid.Empty; Success = SystemAuthenticationClientAuthentication.EstablishSecureSession(solutionName, GenerateClientMetadata(access), (ConnectRequest request) => ServiceClient.Connect(request), (AuthenticateMeRequest request) => ServiceClient.AuthenticateMe(request), delegate(Guid id) { connectId = id; }, delegate(string msg) { errorMessage = msg; }); if (Success) { ConnectionId = connectId; } else { ErrorMessage = errorMessage; } return Success; } public void DisconnectSecureSession() { SystemAuthenticationClientAuthentication.DisconnectSecureSession(ConnectionId, delegate(DisconnectRequest request) { ServiceClient.Disconnect(request); }); } public void CastClientToChannel() { ServiceChannel = ServiceClient as IClientChannel; } public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } private ClientMetadata GenerateClientMetadata(ClientAccess access) { ClientMetadata clientMetadata = new ClientMetadata { UserName = (string.IsNullOrEmpty(ConnectionUser) ? Environment.UserName : ConnectionUser), HostName = Environment.MachineName, ApplicationName = (string.IsNullOrEmpty(ConnectionApplication) ? Process.GetCurrentProcess().ProcessName : ConnectionApplication), Access = access }; string terminalServicesClientName = GetTerminalServicesClientName(); if (terminalServicesClientName == "\0") { clientMetadata.SessionHostName = string.Empty; clientMetadata.SessionId = string.Empty; } else { clientMetadata.SessionHostName = terminalServicesClientName; clientMetadata.SessionId = Process.GetCurrentProcess().SessionId.ToString(); } return clientMetadata; } private static string GetTerminalServicesClientName() { IntPtr ppBuffer; int pBytesReturned; bool num = NativeMethods.WTSQuerySessionInformation(NativeMethods.WTS_CURRENT_SERVER_HANDLE, -1, NativeMethods.WTS_INFO_CLASS.WTSClientName, out ppBuffer, out pBytesReturned); string result = null; if (num) { result = Marshal.PtrToStringAuto(ppBuffer); NativeMethods.WTSFreeMemory(ppBuffer); } return result; } private void Dispose(bool disposing) { if (disposed) { return; } disposed = true; if (disposing) { if (ServiceChannel != null) { ServiceChannel.Close(); ServiceChannel.Dispose(); } ServiceChannel = null; if (ServiceChannelFactory != null) { ServiceChannelFactory.Close(); ((IDisposable)ServiceChannelFactory).Dispose(); } ServiceChannelFactory = null; } } }