Форум: "Сети";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Внизкак запустить/закрыть сторонее приложение на удаленном компе в ло Найти похожие ветки
← →
MadHead © (2004-09-01 15:36) [0]Собственно subj
← →
Rouse_ © (2004-09-01 15:53) [1]ЛО - это собственно что такое?
Ответ по существу - никак...
← →
MadHead © (2004-09-01 15:58) [2]ло - это была локальная сеть :) Ответ вводит в ступор:)
← →
Digitman © (2004-09-01 16:07) [3]
> MadHead © (01.09.04 15:58) [2]
а ты не шибко жирно хочешь жить ? в произвольный стартовать/терминировать на ЧУЖОМ компе все что тебе взбрендится ?
чем, позволь уж полюбопытствовать, вызвана крайняя необходимость поиметь эту фичу ?
← →
MadHead © (2004-09-01 16:11) [4]кто сказал, что на чужом? я такого не говорил :) Фича, собственно для этого и нужна. Если коротко, то на локальных компах готовится материал, заливается на сервер, а на сервере надо запустить прогу, которая перегонит эти данные в базу.
← →
Rouse_ © (2004-09-01 16:40) [5]Раз так то делай таким образом.
На сервере постоянно крутится программа или сервис.
В расшареную папку ты сливаешь данные.
Посредством тех же майлслотов отправляешь некое уведомление этой программе при получении которого она сканирует нужную папку и добавляет данные в базу.
А вообщето для этого есть другие решения...
← →
MadHead © (2004-09-01 18:08) [6]Так эта программа у меня и так постоянно сканирует расшаренную папку. Мне надо ее перезапускать, что бы перечитать конфиг.
Решения есть и другие - это точно. Но хочется подельфить :)
← →
Дмитрий Ботвин (2004-09-02 08:02) [7]Так конфиг можно читать не только при запуске, можешь по таймеру
это делать....
← →
Дмитрий Ботвин (2004-09-02 08:07) [8]А вообще можно запускать и останавливать на удаленном компе
сервисы. Зарегистрируй свою прогу как сервис на удаленном компе,
а потом юзай его как хош.
Получаешь маркер доступа OpenSCManager, затем создаешь
сервис CreateService и хош запускай его, хош останавливай
(StartService и ControlService соответственно)
← →
Rouse_ © (2004-09-02 09:32) [9]Кстати, это самый оптимальный вариант ... :)
← →
Дмитрий Ботвин (2004-09-02 09:36) [10]Я так и делал однажды, тока проблема одна есть. Во всяком случаи
у меня точно была. При каждом очередном запуске сервиса увеличивался объём занятой им оперативки, а при остановке нихрена
не освобождался. Хотя в проге я все деструкторы вызывал. Я так и
не понял в чём косяк :-)))
← →
MadHead © (2004-09-02 11:02) [11]Вариант может и оптимальный, только как эту прогу зарегистрировать как сервис, подскажите, плз.
Мне вот что показалось странным. У MS в Resourse Kit есть скрипт, написанный на vbs, который как раз и делает то что мне надо. Так неужели на vbs это можно сделать, а на Delphi нет?
← →
Rouse_ © (2004-09-02 11:09) [12]Так ты напиши ее как сервис...
← →
MadHead © (2004-09-02 11:21) [13]Так я же говорю - это сторонняя программа. Она уже написана.
← →
Дмитрий Ботвин (2004-09-02 12:05) [14]По-моему, не обязательно писать её как сервис. Можно любую
прогу зарегистрить как службу. Служба - это лишь прога, которая
резидентно сидит в оперативки, а уж имеет она главную форму или
нет, я думаю не важно. А зарегистрить можно очень просто. Вот тебе примерный код:
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;
← →
Дмитрий Ботвин (2004-09-02 12:22) [15]Да, чуть не забыл, для того что бы это сделать, нужно иметь для текущего пользователя права администратора на том компе, на
котором ты пытаешься создать службу, иначе не подключишься :-)))
← →
MadHead © (2004-09-02 12:39) [16]to Дмитрий Ботвин
Спасибо - попробую...
← →
MadHead © (2004-09-02 15:07) [17]to Дмитрий Ботвин
С примером все хорошо - служба зарегилась, но не запускается - вылетает по тайм-ауту.
← →
Дмитрий Ботвин (2004-09-02 16:08) [18]Ты её как запускаешь, напиши код....
← →
Дмитрий Ботвин (2004-09-02 16:13) [19]Попробуй вот так запустить:
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;
← →
MadHead © (2004-09-02 17:32) [20]to Дмитрий Ботвин
Так тоже не запускается - видимо дело все в этой сторонней программе. Не хочет она работать как служба.
← →
DeadMeat © (2004-09-02 19:19) [21]И не будет...
Ее надо переделать для этого...
---
...Death Is Only The Begining...
← →
Rouse_ © (2004-09-02 21:55) [22]Собственно а что вы хотели?
Чтобы обычная программа стала "вдруг откуда ни возьмись" реагировать на запросы SCM? А кто таблицу подготовит? А за связь с SCM кто отвечать будет?
Бред...
← →
Дмитрий Ботвин (2004-09-03 08:16) [23]Самому писать видимо придётся службу....
← →
MadHead © (2004-09-03 09:43) [24]to Rouse_ ©
Собственно, хотел выяснить - получится или нет. Выяснил. Отрицательный результат - тоже результат. Так что никакого бреда в этом не усматриваю. Этот вопрос задал, потому что не знал на него ответа. Разве форум не для этого? :)
to Дмитрий Ботвин
Самому не получиться. Во-первых - знаний для этого у меня маловато. Во-вторых - программа эта является частью единой системы. То есть взаимодействие только через нее "родную" :)
Но, все равно, спасибо огромное за советы и примеры - очень пригодились.
← →
Rouse_ © (2004-09-03 10:13) [25]Бред я сказал по поводу попыток заставить обычную программу работать как сервис :)
← →
MadHead © (2004-09-03 10:36) [26]to Rouse_ ©
Как говорил наш "общий знакомый" - попытка-не пытка :). Тем более, что совсем недавно юзали утилиту, которая пытается запускать программы как службы. Правда там честно предупреждают, что это пройдет не со всеми (50%50). Так что шанс, наверное, был:)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.045 c