Мне нужно запустить программу из Windows Service. Эта программа является приложением пользовательского интерфейса. Более того, это приложение должно быть запущено под определенной учетной записью пользователя.
Проблема в том, что Window Services запускаются в сеансе № 0, но вошедшие в систему пользовательские сеансы имеют 1,2 и т.д.
Таким образом, вопрос заключается в следующем: как запустить процесс из службы окна таким образом, чтобы он выполнялся в текущем сеансе пользователя, вошедшего в систему?
Я бы подчеркнул, что вопрос не в том, как запустить процесс под определенной учетной записью (это очевидно - Process.Start (new ProcessStartInfo ("..") {UserName = .., Password = ..}) ). Даже если я установлю свои окна для запуска под текущей учетной записью пользователя, служба все равно будет работать в сеансе # 0.
Настройка «Разрешить службе взаимодействовать с рабочим столом» не помогает.
Моя служба Windows основана на .net.
UPDATE :
Во-первых, .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. Код выхода 3221225794.
И нет никакого нового начатого блокнота.
Где я не прав?