Главная страница
    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.49 MB
Время: 0.043 c
15-1137961868
Alexis
2006-01-22 23:31
2006.02.12
Книга по PHP


1-1137163081
yarvu
2006-01-13 17:38
2006.02.12
Зоздание объекта в др.приложении.


3-1134631703
vajo
2005-12-15 10:28
2006.02.12
Почему-то неправильно получается значение RecordCount


2-1138198075
Proxytel
2006-01-25 17:07
2006.02.12
Позиция курсора миши?


6-1130963292
xman
2005-11-02 23:28
2006.02.12
PING





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский