Как запустить процесс из службы?
Пвтаюсь из службы запустить Notepad, но окно Notepad не открывается :(
Пвтаюсь из службы запустить Notepad
Как???
ЗЫ: сам процесс то запущен?
Правильно. Откуда система знает, в какой сессии пользователя открывать его: вдруг у нас человек десять залогинуто, где показывать тогда?
protected override void OnStop()
{
Process notepad = new Process();
ProcessStartInfo psi = new ProcessStartInfo("D:\\notepad.exe");
psi.WindowStyle = ProcessWindowStyle.Normal;
notepad.StartInfo = psi;
notepad.Start();
}
Установил службу (под пользователем SYSTEM, но, по-моему, это не важно. Пробовал и от имени своего текущего пользователя - один хрен). Запустил. Остановил. Сам процесс в менеджере появляется, а окно Notepad не отображается.
Без PInvoke корректно запустить гуишный процесс из службы не получится. ProcessStartInfo не имеет нужных параметров. Потому, для запуска процесса нужно использовать Win API CreateProcess задав параметр lpDesktop в структуре STARTUPINFO (по ссылке она идет параметром si, но объявление на C# не показано).
Хотя, еще остается WMI, но там будет аналогично (найти десктоп юзера и указать его при запуске).
Хотя, еще остается WMI, но там будет аналогично (найти десктоп юзера и указать его при запуске).
Тогда уж ShellExecute попроще будет
Вы имеете ввиду StartInfo.UseShellExecute? Оттуда можно достать пресловутый lpDesktop? Как?
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool CreateProcess( string imageName,
string cmdLine,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
bool boolInheritHandles,
Int32 dwCreationFlags,
IntPtr lpEnvironment,
IntPtr lpszCurrentDir,
byte [] si,
ProcessInfo pi );
Компилятор мне говорит, что тип "System.Diagnostics.ProcessInfo недоступен из-за его уровня защиты" Чего это он?
Насколько я понял, ShellExecute не позволяет разрешить взаимодействие с рабочим столом, если запускать приложение из службы. Следовательно основная проблема остаётся - "блокнот" запускается, но его не видно.
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.lpDesktop = L"Default";
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
// SetProcessWindowStation(OpenWindowStation(L"WinSta0", FALSE, GENERIC_ALL));
wchar_t st_proc[] = L"notepad.exe";
CreateProcess(NULL, st_proc, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
Если не получится, то раскоменть строчку // SetProcessWindowStation...
но особой уверенности что будет работать у меня нет... не тестил...