C# Сервисное взаимодействие с пользовательским сеансом - PullRequest
0 голосов
/ 27 апреля 2020

Я сделал сервис, который слушает события сессии. При входе в систему пользователь выполняет процесс в сеансе пользователя, олицетворяя его.

Для достижения этого я использую класс ProcessExtensions (https://github.com/murrayju/CreateProcessAsUser) с небольшой модификацией метода CreateProcessAsUser , чтобы запустить процесс в требуемом сеансе пользователя:

public static bool StartProcessAsCurrentUser(int SessionID, string appPath, string cmdLine = null, string workDir = null, bool visible = true)

Мой тестовый код для службы довольно прост:

public partial class SvcTest : ServiceBase
    {
        public SvcTest()
        {
            InitializeComponent();           
        }

        protected override void OnStart(string[] args)
        {
            AppLogger.WriteLine("Service Started");
        }

        protected override void OnStop()
        {
            AppLogger.WriteLine("Service Stopped");
        }


        protected override void OnSessionChange(SessionChangeDescription changeDescription)
        {
            string strExec = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\MyProgram.exe";

            try
            {
                switch (changeDescription.Reason)
                {
                    //Other Reasons management cut for readability

                    case SessionChangeReason.SessionLogon:
                        AppLogger.WriteLine("Session Logon");                        
                        ProcessExtensions.StartProcessAsCurrentUser(changeDescription.SessionId, strExec, " -dologinthings");                        
                        break;

                    case SessionChangeReason.SessionLogoff:
                        AppLogger.WriteLine("Session Logoff");                        
                        ProcessExtensions.StartProcessAsCurrentUser(changeDescription.SessionId, strExec, " -dologoutthings");                        
                        break;

                    //Other Reasons Management cut for readability

                    default:
                        AppLogger.WriteLine("Unhandled Event");
                        break;
                }

            }
            catch (Exception e)
            {
                AppLogger.WriteLine("Error Querying Session Information", e);
            }
        }       

    }

Ожидаемое поведение Это нормально, когда пользователь входит в систему. При выходе из системы процесс не может быть выполнен, я думаю, потому что во время выполнения сеанс больше не существует.

На самом деле в журнале, записанном моим классом Applogger I см .:

26/04/2020 15:43:25: DEBUG Error Querying Session Information (StartProcessAsCurrentUser: GetSessionUserToken failed.)

Вопрос: есть ли шанс перехватить события входа / выхода из системы и хотя бы перевести эти события в состояние ожидания для выполнения задач в моем сервисе?

...