Запуск Gui-приложения Через Сервис

Shouldercannon

Well-known member
25.05.2010
128
0
#1
Подскажите как через сервис запустить GUI-приложение.
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ShellAPI;

type
TService1 = class(TService)
procedure ServiceExecute(Sender: TService);
procedure ServiceCreate(Sender: TObject);
procedure ServiceStart(Sender: TService; var Started: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;

var
Service1: TService1;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TService1.ServiceCreate(Sender: TObject);
begin
//
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
Sender.ReportStatus;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
ShellExecute(GetForegroundWindow, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'Project1.exe'), nil, PChar('C:\'), SW_SHOWNORMAL);
Started := False;
end;

end.
Запускает программу, но её видно только в процессах.
 

-master-

Well-known member
14.01.2012
616
12
#2
В сервисе надо указать что ему разрешено работать с десктопом.

Но это неправильно.
 

sinkopa

Well-known member
17.06.2009
344
4
#3
Подскажите как через сервис запустить GUI-приложение.
Ваш вопрос поставлен не корректно.
В том виде как Вы его задали, ответ - никак (штатными средствами).
В сервисе надо указать что ему разрешено работать с десктопом.
Да, в Delphi 7 есть возможность включить эту опцию. Но реально работать это НЕ Будет...
Дело в том что начиная с Windows Vista и во всех 64х битных версиях взаимодействие служб с рабочим столом (GUI) исключено.
Да, это будет работать в ранних сборках WinXP, но на сколько я в курсе в SP3 эта ДЫРА БЕЗОПАСНОСТИ уже прикрыта.

Кроме всего прочего необходимо учитывать что:
1. Служба успешно стартует и работает (до/без) логона пользователя.
2. В системе может быть несколько залогиненых рабочих столов (как с одним так и несколькими разными пользователями). В каком GUI (в этом случае) должен запуститься Ваш Project1.exe?

Поэтому, в данной конкретной постановке, Ваш вопрос не имеет решения в лоб.
но... всегда можно попытаться найти "обходные пути" либо альтернативное решение задачи...
Например можно попробовать "пролезть" через сеть (системная команда NET START)...
Или через Microsoft Task Scheduler API

Например так

Код:
{
It executes these commands:

schtasks /delete /f /tn "myjob"
schtasks /create /tn "myjob" /tr "C:\Application.exe" /sc ONSTART /ru "System"

/delete - delete the task
/f - suppress the confirmation
/create - create task parameter
/tn - unique name of the task
/tr - file name of an executable file
/sc - schedule type, ONSTART - run at startup
/ru - run task under permissions of the specified user

}
uses
ShellAPI;

//...

// выполнить 'C:\Application.exe' при логоне пользователя
procedure ScheduleRunAtStartup(const ATaskName: string; const AFileName: string; const GetPCName: string; Const GetPCUser: String);
begin
ShellExecute(0, nil, 'schtasks', PChar('/delete /f /tn "' + ATaskName + '"'), nil, SW_HIDE);
ShellExecute(0, nil, 'schtasks', PChar('/create /tn "' + ATaskName + '" ' + '/tr "' + QuotedStr(AFileName) + '" /sc ONLOGON /ru "' + GetPCName+'\'+GetPCUser + '"'), nil, SW_HIDE)
end;
Или как нибудь по другому... Если Вы задачу по конкретнее сформулируете... ;)
 

sinkopa

Well-known member
17.06.2009
344
4
#7
Хочу реализовать запуск своей программы как это делает TeamViewer или VipNet для Windows Server 2008 R2 x64.
ну так и при чкм тут сервисы?
Полностью поддерживаю. Служба Вас "не спасёт".
Вам нужен (как минимум) приложение-агент запускающийся в окружении залогиненого пользователя или даже сервер со специальным клиентом (в зависимости от задачи)...

Дело в том что начиная с Windows Vista и во всех 64х битных версиях взаимодействие служб с рабочим столом (GUI) исключено.
Где такое написано?
В MSDN конечно же... ;) http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx
Important Services cannot directly interact with a user as of Windows Vista. Therefore, the techniques mentioned in the section titled Using an Interactive Service should not be used in new code.
Там же кстати, изложены доступные ныне методы интерактивного взаимодействия служб и рабочего стола пользователя...