static SessionInfo GetSessionInfo(string userName, string password) { var ppSessionInfo = IntPtr.Zero; UInt32 sessionCount = 0; var wtsEnumerateSessions = WTSEnumerateSessions((IntPtr)WTSCurrentServerHandle, 0, 1, ref ppSessionInfo, ref sessionCount); if (wtsEnumerateSessions) { var wtsSessionInfo = GetWTSSessionInfo(userName, sessionCount, ppSessionInfo); return(wtsSessionInfo == null && RDCClient.Connect(userName, password) ? GetSessionInfo(userName, password) : new SessionInfo(wtsSessionInfo, ppSessionInfo)); } return(new SessionInfo(null, ppSessionInfo)); }
public static void Launch(string userName, string password, string processPath, string arguments) { RDCClient.SessionInfo sessionInfo = RDCClient.GetSessionInfo(userName, password); if (sessionInfo.Info != null) { IntPtr userToken = RDCClient.GetUserToken(sessionInfo.Info.Value); Trace.TraceInformation("UserToken=" + userToken); CreateProcess(processPath, userToken, arguments); CloseHandle(userToken); } else { Environment.Exit(200); } WTSFreeMemory(sessionInfo.IntPtr); }