Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как запустить/закрыть сторонее приложение на удаленном компе в ло [D7]


Страницы:   1 2

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]

Так конфиг можно читать не только при запуске, можешь по таймеру
это делать....


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо