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