Мне нужно запустить программу из службы Windows. Эта программа представляет собой приложение пользовательского интерфейса. Более того, это приложение должно быть запущено под определенной учетной записью пользователя.
Проблема в том, что службы Windows работают в сеансе №0, а зарегистрированные пользовательские сеансы - 1,2 и т. Д.
Итак, вопрос: как запустить процесс из оконной службы таким образом, чтобы он выполнялся в сеансе текущего пользователя?
Я бы подчеркнул, что вопрос не в том, как запустить процесс под определенной учетной записью (это очевидно - Process.Start ( new ProcessStartInfo ("..") {UserName = .., Password = ..})). Даже если я установлю свои окна для работы под текущей учетной записью пользователя, служба все равно будет работать в сеансе №0. Установка «Разрешить службе взаимодействовать с рабочим столом» не помогает.
Моя служба Windows основана на .net.
ОБНОВЛЕНИЕ : Во-первых, .NET здесь не при чем, это на самом деле чисто Win32. Вот что я делаю. Следующий код находится в моей службе Windows (C # с использованием функции win32 через P / Inkove, я пропустил подписи импорта, они все здесь - http://www.pinvoke.net/default.aspx/advapi32/CreateProcessWithLogonW. html ):
var startupInfo = new StartupInfo()
{
lpDesktop = "WinSta0\\Default",
cb = Marshal.SizeOf(typeof(StartupInfo)),
};
var processInfo = new ProcessInformation();
string command = @"c:\windows\Notepad.exe";
string user = "Administrator";
string password = "password";
string currentDirectory = System.IO.Directory.GetCurrentDirectory();
try
{
bool bRes = CreateProcessWithLogonW(user, null, password, 0,
command, command, 0,
Convert.ToUInt32(0),
currentDirectory, ref startupInfo, out processInfo);
if (!bRes)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
catch (Exception ex)
{
writeToEventLog(ex);
return;
}
WaitForSingleObject(processInfo.hProcess, Convert.ToUInt32(0xFFFFFFF));
UInt32 exitCode = Convert.ToUInt32(123456);
GetExitCodeProcess(processInfo.hProcess, ref exitCode);
writeToEventLog("Notepad has been started by WatchdogService. Exitcode: " + exitCode);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
Код переходит в строку «Блокнот был запущен WatchdogService. Exitcode:» + exitCode. Код выхода - 3221225794. И никаких новых блокнотов нет. В чем я ошибаюсь?