Запуск приложения с графическим интерфейсом из службы Windows - окно не появляется - PullRequest
6 голосов
/ 10 июля 2009

Я написал простой сервис Windows, который запустит exe, указанный в onstart() метод обслуживания. После запуска сервиса exe запустил его только присутствует в памяти, но не отображается в проводнике.

Я пытаюсь запустить calc.exe из моего code.it показывает exe в памяти, но это не входит в мой взгляд (то есть) в проводнике.

Ниже приведен мой код для запуска exe-файла в методе onStart ()

    Process pr=new Process();
    pr.StartInfo.FileName="calc.exe";
    pr.StartInfo.WindowStyle=ProcessWindowStyle.Maximized;
    pr.StartInfo.CreateNoWindow=false;
    pr.Start();
//  pr.WaitForExit();

Ответы [ 5 ]

10 голосов
/ 10 июля 2009

Службы запускаются в другом сеансе в Vista или более поздней версии, а приложения, запускаемые непосредственно из служб, по умолчанию запускаются в том же сеансе. Запуск приложений в других сеансах возможен - вы должны найти идентификатор сеанса пользователя и использовать CreateProcessAsUser.

Если в систему вошли несколько пользователей и вам нужно запустить программу для всех пользователей, вы должны найти идентификаторы всех сеансов.

Вот пример кода:

int session = Win32.WTSGetActiveConsoleSessionId();
if (session == 0xFFFFFFFF)
{
    return false;
}

IntPtr userToken;
bool res = Win32.WTSQueryUserToken(session, out userToken);
if (!res)
{
    this.log.WriteEntry("Error WTSQueryUserToken");
    return false;
}

string path = GetPath();
string dir = Path.GetDirectoryName(path);
Win32.STARTUPINFO si = new Win32.STARTUPINFO();
si.lpDesktop = "winsta0\\default";
si.cb = Marshal.SizeOf(si);

Win32.PROCESS_INFORMATION pi = new Win32.PROCESS_INFORMATION();
Win32.SECURITY_ATTRIBUTES sa = new Win32.SECURITY_ATTRIBUTES();
sa.bInheritHandle = 0;
sa.nLength = Marshal.SizeOf(sa);
sa.lpSecurityDescriptor = IntPtr.Zero;

if (!Win32.CreateProcessAsUser(userToken,       // user token
                                path,           // exexutable path
                                string.Empty,   // arguments
                                ref sa,         // process security attributes ( none )
                                ref sa,         // thread  security attributes ( none )
                                false,          // inherit handles?
                                0,              // creation flags
                                IntPtr.Zero,    // environment variables
                                dir,            // current directory of the new process
                                ref si,         // startup info
                                out pi))        // receive process information in pi
{
    int error = Marshal.GetLastWin32Error();
    this.log.WriteEntry("Error CreateProcessAsUser:" + error);
    return false;
}
4 голосов
/ 10 июля 2009

Службы запускаются с различными привилегиями учетной записи (LocalService / NetworkService и т. Д.) И, следовательно, они не имеют доступа к вашему рабочему столу (под контролем * вашей учетной записи ).

Службы предназначены для того, чтобы выполнять свою работу молча, и это то, что они должны делать. (за исключением регистрации чего-либо в журнале событий Windows, когда им нужно что-то важное сказать)

3 голосов
/ 17 июля 2009

Если вы откроете окно свойств своего сервиса, перейдите на вкладку «Вход в систему» ​​и установите флажок «Разрешить сервису взаимодействовать с рабочим столом», чтобы получить желаемое поведение. Кроме того, в зависимости от того, какое приложение вы хотите запустить, вам может потребоваться изменить учетную запись для входа в систему.

1 голос
/ 10 июля 2009

Сервисы не являются интерактивными по определению, поэтому не следует ожидать появления элементов пользовательского интерфейса при запуске приложения из сервиса.

Это по замыслу ...

0 голосов
/ 10 июля 2009

Как уже упоминалось в других, служба Windows "нормально" работает под отдельной учетной записью ("LocalSystem" или "NetworkService"). По этой причине вы можете не видеть пользовательский интерфейс программы, запущенной вашим сервисом. Также сервисы не предназначены для использования пользовательского интерфейса, они действуют как фоновые сервисы.

Но также обратите внимание, что запуск приложения службой может быть очень рискованным с точки зрения безопасности, поскольку приложение работает с теми же привилегиями, что и ваша служба. Обычно это будет учетная запись локальной системы.

Я не знаю, чего вы пытаетесь достичь с помощью своего сервиса, но рассмотрите возможность использования функции автозапуска Windows вместо сервиса для запуска вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...