• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Shouldercannon
  • Дата начала
S

Shouldercannon

Подскажите как через сервис запустить 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.
Запускает программу, но её видно только в процессах.
 
M

-master-

В сервисе надо указать что ему разрешено работать с десктопом.

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

sinkopa

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

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

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

Например так

Код:
{
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;

Или как нибудь по другому... Если Вы задачу по конкретнее сформулируете... ;)
 
M

-master-

Дело в том что начиная с Windows Vista и во всех 64х битных версиях взаимодействие служб с рабочим столом (GUI) исключено.
Где такое написано?
 
S

sinkopa

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

Дело в том что начиная с Windows Vista и во всех 64х битных версиях взаимодействие служб с рабочим столом (GUI) исключено.
Где такое написано?
В MSDN конечно же... ;)
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.
Там же кстати, изложены доступные ныне методы интерактивного взаимодействия служб и рабочего стола пользователя...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!