Как запустить процесс из службы Windows в сеансе текущего пользователя, вошедшего в систему

Мне нужно запустить программу из службы 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. И никаких новых блокнотов нет. В чем я ошибаюсь?

44
задан Shrike 25 November 2010 в 17:44
поделиться