Я сделал сервис, который слушает события сессии. При входе в систему пользователь выполняет процесс в сеансе пользователя, олицетворяя его.
Для достижения этого я использую класс 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.)
Вопрос: есть ли шанс перехватить события входа / выхода из системы и хотя бы перевести эти события в состояние ожидания для выполнения задач в моем сервисе?