Проблема тестирования сервисов в Windows 2000 Advanced Server - PullRequest
2 голосов
/ 31 августа 2010

Я разработал небольшое приложение в Delphi 7, используя модуль cwinsrvc, широко используемый программистами Delphi. Мое приложение должно только проверить, работает ли служба. Он работает на всех машинах, которые я тестировал, включая Windows XP и Windows 2000 Advanced Server. Проблема в том, что есть машина (Windows 2000 Advanced Server), в которой мое приложение не «видит» какую-либо службу ... Я имею в виду, когда я спрашиваю, запущена или остановлена ​​служба, она возвращает «НЕИЗВЕСТНО». Я протестировал свое приложение на аналогичном ПК (Windows 2000 Advanced Server), и ЭТО РАБОТАЕТ !!! Итак, в чем проблема в конкретной машине ????

Я пытался запустить службу на этом компьютере, чтобы получить исключение с сообщением, но оно не вызывало исключение, поэтому я вижу, в чем проблема ...

Может кто-нибудь помочь мне, пожалуйста ???? Я сожалею о своем английском.

Код модуля, который я использую, следующий (cwinsrvc):

unit cwinsrvc;

interface

uses Windows, SysUtils, WinSvc;

    function ServiceGetStrCode(nID : integer) : string;
    function ServiceGetStatus(sMachine,sService : string) : DWord;
    function ServiceRunning(sMachine,sService : string) : boolean;
    function ServiceStopped(sMachine,sService : string) : boolean;
    function ServiceStart(sMachine,sService : string) : boolean;
    function ServiceStop(sMachine,sService : string) : boolean;


implementation 

function ServiceGetStrCode(nID : integer) : string;
var
  s : string;
begin
  case nID of
   SERVICE_STOPPED          : s := 'STOPPED';
   SERVICE_RUNNING          : s := 'RUNNING';
   SERVICE_PAUSED           : s := 'PAUSED';
   SERVICE_START_PENDING    : s := 'START/PENDING';
   SERVICE_STOP_PENDING     : s := 'STOP/PENDING';
   SERVICE_CONTINUE_PENDING : s := 'CONTINUE/PENDING';
   SERVICE_PAUSE_PENDING    : s := 'PAUSE/PENDING';
  else
   s := 'UNKNOWN';  
  end;
  Result := s;
end;

function ServiceGetStatus(sMachine,sService : string) : DWord;
var
schm   : SC_Handle; 
schs   : SC_Handle;     
ss     : TServiceStatus;
dwStat : DWord;         
begin
  dwStat := 1;
  schm := OpenSCManager( PChar(sMachine), Nil,
                         SC_MANAGER_CONNECT);

  if(schm > 0)then
  begin

    schs := OpenService( schm, PChar(sService),
                         SERVICE_QUERY_STATUS);

    if(schs > 0)then
    begin

      if (QueryServiceStatus( schs, ss)) then
      begin
        dwStat := ss.dwCurrentState;
      end;

      CloseServiceHandle(schs);
    end;

    CloseServiceHandle(schm);
  end;
  Result := dwStat;
end;

function ServiceRunning(sMachine,sService : string) : boolean;
begin
  Result := SERVICE_RUNNING =
            ServiceGetStatus(sMachine, sService);
end;

function ServiceStopped(sMachine,sService : string) : boolean;
begin
  Result := SERVICE_STOPPED =
            ServiceGetStatus(sMachine, sService);
end;

function ServiceStart(sMachine,sService : string) : boolean;
var
  schm,
  schs   : SC_Handle;
  ss     : TServiceStatus;
  psTemp : PChar;
  dwChkP : DWord; 
begin
  ss.dwCurrentState := 1;

  schm := OpenSCManager(PChar(sMachine), nil,
                        SC_MANAGER_CONNECT);

  if(schm > 0)then
  begin

    schs := OpenService(schm, PChar(sService),
            SERVICE_START or SERVICE_QUERY_STATUS);

    if(schs > 0)then
    begin
      psTemp := Nil;
      if(StartService( schs, 0,psTemp))then
      begin

        if(QueryServiceStatus(schs, ss))then
        begin
          while(SERVICE_RUNNING <> ss.dwCurrentState)do
          begin

            dwChkP := ss.dwCheckPoint;

            Sleep(ss.dwWaitHint);
            if not QueryServiceStatus(schs, ss) then
            begin

              break;
            end;

            if ss.dwCheckPoint < dwChkP then
            begin

              break;
            end;
          end;
        end;
      end;

      CloseServiceHandle(schs);
    end;

    CloseServiceHandle(schm);
  end;

  Result := SERVICE_RUNNING = ss.dwCurrentState;
end;



function ServiceStop(sMachine,sService : string) : boolean;
var
  schm,
  schs   : SC_Handle;
  ss     : TServiceStatus;
  dwChkP : DWord;
begin

  schm := OpenSCManager(PChar(sMachine), nil,
                        SC_MANAGER_CONNECT);

  if schm > 0 then
  begin

    schs := OpenService( schm, PChar(sService),
            SERVICE_STOP or SERVICE_QUERY_STATUS);

    if schs > 0 then
    begin
      if ControlService(schs, SERVICE_CONTROL_STOP,
                        ss) then
      begin

        if(QueryServiceStatus(schs, ss))then
        begin
          while(SERVICE_STOPPED <> ss.dwCurrentState)do
          begin

            dwChkP := ss.dwCheckPoint;

            Sleep(ss.dwWaitHint);

            if(not QueryServiceStatus(schs,ss))then
            begin

              break;
            end;

            if(ss.dwCheckPoint <
              dwChkP)then
            begin

              break;
            end;
          end;
        end;
      end;


      CloseServiceHandle(schs);
    end;


    CloseServiceHandle(schm);
  end;


  Result := SERVICE_STOPPED = ss.dwCurrentState;
end;

end.

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Функции Windows обычно не вызывают исключение.Вы должны вызывать их явно, вызывая RaiseLastOSError () (или вызывая GetLastError, чтобы узнать, в чем проблема), если они возвращают код, который сообщает об ошибке.Ваш код просто пропускает части, если что-то не работает, и таким образом вы никогда не узнаете почему.В вашем случае это может быть проблема с разрешением - процесс должен иметь надлежащие привилегии для запроса и управления службами.Но вы узнаете только действительный код ошибки.

0 голосов
/ 01 сентября 2010

Существует несколько причин, по которым удаленное управление машиной не работает. Первые вещи, которые нужно проверить:

  • имеет ли ваша учетная запись права доступа и права для управления (служб) удаленным компьютером
  • - действующее сетевое соединение между двумя компьютерами, включая любые брандмауэры или вирусы, которые могут блокировать ваши сетевые запросы
  • отвечает ли компьютер на сетевые запросы (я считаю, что эти запросы обрабатываются через «IPC $», обслуживаемый службами «Сервер» или «LanMan»)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...