Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Как перезапустить службу на удаленном компьютере   Найти похожие ветки 

 
Германн ©   (2005-11-29 03:44) [0]

Вкратце суть такова. Отлаживаем TCP-сервер выполненный в виде службы. Иногда он "не замечает" подключений клиентов, при том, что на стороне клиента, вроде бы всё ОК. Перезапуск службы решает задачу, но только на некоторое время. Порой весьма долгое.
К сожалению, автор данного сервера, пока что работает в "удаленном режиме". Так вот, наша задача - представить ему максимально подробный лог.
Клиента я написАл. Но вот что делать с сервером-сервисом, чтобы его перезапустить программно?
P.S. Проблем с паролями, и ес-сно с правами нет никаких.


 
Alexandr Bydantcev ©   (2005-11-29 04:43) [1]

Скинул тебе проект. Возможно, поможет. У нас такая проблема есть с Hasp Компаса - даже официальные дилеры не могут помочь. Пришлось нарисовать прогу. Ранее нечто подобное писал для Hasp 1С.
Вопросы - на мыло. Эту тему разрисовывал конкретно. Даже Аскон-Курган спрашивал про прогу. :)) Предлагали быть распространителем. :) Шутю, конечно. :))))


 
Alexandr Bydantcev ©   (2005-11-29 04:44) [2]

Проект в D7.


 
Digitman ©   (2005-11-29 08:38) [3]


> Германн ©   (29.11.05 03:44)


OpenSCManager() позволяет указывать имя удаленной машины.

Далее все как обычно - ControlService(SERVICE_CONTROL_STOP) + StartService()


 
Германн ©   (2005-11-30 02:05) [4]

Спасибо Александр. Письмо получил.
Спасибо Сергей.

К сожалению весь вчерашний день съела "текучка, так что этим вопросом смог заняться только сейчас. Написал процедуру рестарта сервиса. Завтра буду её пробовать. Если кто захочет её просмотреть и покритиковать, буду рад, потому что сия область для меня - "непаханное поле".

function TMainF.RestartA2: Boolean;
var
 HManager,HService : SC_Handle;
 ServiceStat : TServiceStatus;
 LastErr : DWord;
 Temp : PChar;
 St : String;
begin
 Result:=False;
 RestartAborted:=False;
 St:=EAddr.Text;
 HManager:=OpenSCManager(PChar(St),nil,SC_MANAGER_CONNECT);
 if HManager >  0 then begin
   HService:=OpenService(HManager,"SHELT A2",SERVICE_QUERY_STATUS or SERVICE_START or SERVICE_STOP);
   if HService >  0 then begin
     if QueryServiceStatus(HService,ServiceStat) then begin
       if ServiceStat.dwCurrentState <> SERVICE_STOPPED then begin
         if ControlService(HService,SERVICE_CONTROL_STOP,ServiceStat) then begin
           while (SERVICE_STOPPED <> ServiceStat.dwCurrentState) do begin
             Sleep(ServiceStat.dwWaitHint);
             if not QueryServiceStatus(HService,ServiceStat) then begin
               LastErr:=GetLastError;
               SaveLog("QueryServiceStatus (While try to Stop)",nil,"GetLastError="+
                 IntToStr(LastErr)+" HEX="+IntToHex(LastErr,4));
               Exit;
             end;
             Application.ProcessMessages;
             if RestartAborted then begin
               SaveLog("RestartCancelled",nil,"");
               Exit;
             end;
           end;
         end else begin
           LastErr:=GetLastError;
           SaveLog("ControlService",nil,"GetLastError="+IntToStr(LastErr)+" HEX="+IntToHex(LastErr,4));
           Exit;
         end;
       end;
       Temp:=nil;
       if not StartService(HService,0,Temp) then begin
         LastErr:=GetLastError;
         SaveLog("StartService",nil,"GetLastError="+IntToStr(LastErr)+" HEX="+IntToHex(LastErr,4));
       end;
     end else begin
       LastErr:=GetLastError;
       SaveLog("QueryServiceStatus",nil,"GetLastError="+IntToStr(LastErr)+" HEX="+IntToHex(LastErr,4));
     end;
     CloseServiceHandle(HService);
   end else begin
     LastErr:=GetLastError;
     SaveLog("OpenService",nil,"GetLastError="+IntToStr(LastErr)+" HEX="+IntToHex(LastErr,4));
   end;
   CloseServiceHandle(HManager);
 end else begin
   LastErr:=GetLastError;
   SaveLog("OpenSCManager",nil,"GetLastError="+IntToStr(LastErr)+" HEX="+IntToHex(LastErr,4));
 end;
 Result:=True;
end;


...Оформил её в виде функции, скорее по привычке. А вдруг понадобится.
...Процедура SaveLog записывает в некий файл нужные мне данные о ситуациях в программе.  
...RestartAborted - переменная главной формы, которой можно задать значение либо из обработчика OnClick, либо из обработчика OnTimer.


 
Германн ©   (2005-11-30 17:37) [5]

OpenService(HManager,"SHELT A2",SERVICE_QUERY_STATUS or SERVICE_START or SERVICE_STOP), увы дает ERROR_ACCESS_DENIED.
Что сделать надо?


 
Alexandr Bydantcev ©   (2005-11-30 17:41) [6]

У компьютера, на котором запускается программа, должен быть адм. доступ к компу с сервисом. Без этого - :(
Поскольку сам имею права админа на всех компах своей сети - то другого решения не знаю.


 
Германн ©   (2005-11-30 18:00) [7]

Пошел по простому пути. Запустил программу на компьютере с сервисом. Так работает. Спасибо всем.


 
Германн ©   (2005-12-01 02:15) [8]

Всё вроде нормально работает. Статистика набирается.
Но уж коль "залез в корзину", то хотел бы побольше узнать, прежде чем "назваться груздем". :-)

Не сочтите за наглость следующий мой вопрос.
Не понимаю как "у компьютера" могут быть права администратора на другом компьютере? Имхо, такие права могут быть только у пользователя, под паролём которого запущен данный процесс. Или я не прав? А если я прав, то как эти права получить? В конкретном случае на обоих компах WinXP. (Имхо в 2к и выше, наверно, тоже самое).


 
Alexandr Bydantcev ©   (2005-12-01 02:29) [9]

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


 
Германн ©   (2005-12-01 02:54) [10]

2 Alexandr Bydantcev ©   (01.12.05 02:29) [9]
Спасибо. Приму к сведению. Ничего не понял, но... Будем разбираться, если приспичит. :-)


 
Alexandr Bydantcev ©   (2005-12-01 02:56) [11]

Можешь писать на мыл. Объяснить не лениво.


 
Германн ©   (2005-12-01 03:14) [12]

2 Alexandr Bydantcev ©   (01.12.05 02:56) [11]
НаписАл бы обязательно, если бы были конкретные вопросы. Спасибо за желание помочь мне.

Но, имхо, "Гложат меня смутные сомнения. У Шпака - магнитофон, у посла - медальон" © "Иван Васильевич меняет профессию".
Если у "компьютера" есть права Администратора на "другой компьютер", то, следовательно, любой "юзер" может изменить "всё, что угодно" на любом другом компьютере в данной сети!


 
Alexandr Bydantcev ©   (2005-12-01 04:30) [13]

Ну да, поэтому и не всем нужно давать сии права. :)
Если за моей машиной больше никто не сидит, то почему бы и не дать себе "таблеток от жадности, и побольше, побольше". :) Хотя в данном случае права пользователя значат то же самое.



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.059 c
1-1137068572
oleg__
2006-01-12 15:22
2006.02.12
Формат даты


3-1134459185
ANB
2005-12-13 10:33
2006.02.12
Посоветуйте тип блокировки записи (оракл)


3-1134209177
312Kbps
2005-12-10 13:06
2006.02.12
файл данных *.gtd !!!


15-1137924000
Колян
2006-01-22 13:00
2006.02.12
книга по ASP для работы с базами данных?


2-1138188094
Vit2000
2006-01-25 14:21
2006.02.12
Отображение данных из XML