![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как запустить/закрыть сторонее приложение на удаленном компе в ло [D7]
MadHead © (2004-09-01 15:36:00)Собственно subj
MadHead (2004-09-03 10:36:00) [1]to Rouse_ ©
Как говорил наш "общий знакомый" - попытка-не пытка :). Тем более, что совсем недавно юзали утилиту, которая пытается запускать программы как службы. Правда там честно предупреждают, что это пройдет не со всеми (50%50). Так что шанс, наверное, был:)
Rouse_ (2004-09-03 10:13:00) [2]Бред я сказал по поводу попыток заставить обычную программу работать как сервис :)
MadHead (2004-09-03 09:43:00) [3]to Rouse_ ©
Собственно, хотел выяснить - получится или нет. Выяснил. Отрицательный результат - тоже результат. Так что никакого бреда в этом не усматриваю. Этот вопрос задал, потому что не знал на него ответа. Разве форум не для этого? :)
to Дмитрий Ботвин
Самому не получиться. Во-первых - знаний для этого у меня маловато. Во-вторых - программа эта является частью единой системы. То есть взаимодействие только через нее "родную" :)
Но, все равно, спасибо огромное за советы и примеры - очень пригодились.
Дмитрий Ботвин (2004-09-03 08:16:00) [4]Самому писать видимо придётся службу....
Rouse_ (2004-09-02 21:55:00) [5]Собственно а что вы хотели?
Чтобы обычная программа стала "вдруг откуда ни возьмись" реагировать на запросы SCM? А кто таблицу подготовит? А за связь с SCM кто отвечать будет?
Бред...
DeadMeat (2004-09-02 19:19:00) [6]И не будет...
Ее надо переделать для этого...
---
...Death Is Only The Begining...
MadHead (2004-09-02 17:32:00) [7]to Дмитрий Ботвин
Так тоже не запускается - видимо дело все в этой сторонней программе. Не хочет она работать как служба.
Дмитрий Ботвин (2004-09-02 16:13:00) [8]Попробуй вот так запустить:
procedure TForm2.Button2Click(Sender: TObject);
var schService,schSCManager: Dword;
ServiceName: String;
p: PChar;
begin
p := nil;
ServiceName:='MyService';
schSCManager := OpenSCManager(PChar(Form1.CompName.Text), nil, SC_MANAGER_ALL_ACCESS);
if schSCManager=0 then
begin
Application.MessageBox('Подключение не выполнено!','Ошибка подключения',
MB_OK+MB_ICONSTOP);
exit;
end;
try
schService := OpenService(schSCManager, PChar(ServiceName),SERVICE_ALL_ACCESS);
if schService=0 then
begin
Application.MessageBox('Не могу найти службу MyService!','Ошибка открытия службы',
MB_OK+MB_ICONSTOP);
exit;
end;
try
if StartService(schService,0,p)=false then
Application.MessageBox('Не могу запустить
службу!','Ошибка запуска , MB_OK+MB_ICONSTOP)
else
Application.MessageBox('Служба Myservice
запущена!','Запуск службы', MB_OK+MB_ICONINFORMATION);
finally
CloseServiceHandle(schService);
end;
finally
CloseServiceHandle(schSCManager);
end;
end;
Дмитрий Ботвин (2004-09-02 16:08:00) [9]Ты её как запускаешь, напиши код....
MadHead (2004-09-02 15:07:00) [10]to Дмитрий Ботвин
С примером все хорошо - служба зарегилась, но не запускается - вылетает по тайм-ауту.
MadHead (2004-09-02 12:39:00) [11]to Дмитрий Ботвин
Спасибо - попробую...
Дмитрий Ботвин (2004-09-02 12:22:00) [12]Да, чуть не забыл, для того что бы это сделать, нужно иметь для текущего пользователя права администратора на том компе, на
котором ты пытаешься создать службу, иначе не подключишься :-)))
Дмитрий Ботвин (2004-09-02 12:05:00) [13]По-моему, не обязательно писать её как сервис. Можно любую
прогу зарегистрить как службу. Служба - это лишь прога, которая
резидентно сидит в оперативки, а уж имеет она главную форму или
нет, я думаю не важно. А зарегистрить можно очень просто. Вот тебе примерный код:
procedure TForm2.Button5Click(Sender: TObject);
var schSCManager,schService: DWORD;
Path,ServiceName: String;
Path_1,Path_2,lpBinaryPathName: PChar;
begin
ServiceName:='Моя служба';
schSCManager:=OpenSCManager(PChar(Form1.CompName.Text), nil, SC_MANAGER_ALL_ACCESS);
if schSCManager=0 then
begin
Application.MessageBox('Подключение не выполнено!','Ошибка подключения',
MB_OK+MB_ICONSTOP);
Abort;
end;
try
schService := OpenService(schSCManager, PChar(ServiceName),SERVICE_ALL_ACCESS);
if schService<>0 then
begin
Application.MessageBox('Такая служба уже существует!','Регистрация службы',
MB_OK+MB_ICONEXCLAMATION);
exit;
end;
GetDir(0,Path);
Path_1:=PChar(Path+'\MyService.exe');
Path_2:=PChar('\\'+Form1.CompName.Text+'\Admin$\System32\MyService.exe');
if CopyFile(Path_1,Path_2,false)=false then
begin
Application.MessageBox('Не могу скопировать MyService.exe','Ошибка копирования',
MB_OK+MB_ICONSTOP);
exit;
end;
lpBinaryPathName:=PChar('"%windir%\System32\MyService.exe" /service');
try
if CreateService(schSCManager, PChar(ServiceName), PChar(ServiceName), SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS + SERVICE_INTERACTIVE_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, lpBinaryPathName,
Nil, Nil, Nil, Nil, Nil)=0 then
begin
Application.MessageBox('Не могу создать службу MyService.exe!','Ошибка регистрации службы',
MB_OK+MB_ICONSTOP);
exit;
end
else
Application.MessageBox('Служба успешно создана!','Регистрация службы',
MB_OK+MB_ICONINFORMATION);
finally
CloseServiceHandle(schService);
end;
finally
CloseServiceHandle(schSCManager);
end;
end;
MadHead (2004-09-02 11:21:00) [14]Так я же говорю - это сторонняя программа. Она уже написана.
Rouse_ (2004-09-02 11:09:00) [15]Так ты напиши ее как сервис...
MadHead (2004-09-02 11:02:00) [16]Вариант может и оптимальный, только как эту прогу зарегистрировать как сервис, подскажите, плз.
Мне вот что показалось странным. У MS в Resourse Kit есть скрипт, написанный на vbs, который как раз и делает то что мне надо. Так неужели на vbs это можно сделать, а на Delphi нет?
Дмитрий Ботвин (2004-09-02 09:36:00) [17]Я так и делал однажды, тока проблема одна есть. Во всяком случаи
у меня точно была. При каждом очередном запуске сервиса увеличивался объём занятой им оперативки, а при остановке нихрена
не освобождался. Хотя в проге я все деструкторы вызывал. Я так и
не понял в чём косяк :-)))
Rouse_ (2004-09-02 09:32:00) [18]Кстати, это самый оптимальный вариант ... :)
Дмитрий Ботвин (2004-09-02 08:07:00) [19]А вообще можно запускать и останавливать на удаленном компе
сервисы. Зарегистрируй свою прогу как сервис на удаленном компе,
а потом юзай его как хош.
Получаешь маркер доступа OpenSCManager, затем создаешь
сервис CreateService и хош запускай его, хош останавливай
(StartService и ControlService соответственно)
Дмитрий Ботвин (2004-09-02 08:02:00) [20]Так конфиг можно читать не только при запуске, можешь по таймеру
это делать....