Конференция "WinAPI" » Проверка состояния сервиса Windows из XP и W7 [D7, WinXP]
 
  • Patrick1968 © (29.09.11 14:21) [0]
    Проверяю состояние службы используя OpenSCManager по известной технологии, программа запускаемая из XP, отрабатывает нормально, но вот из Windows 7, пускать в консоль не хочет. Кто-нибудь знает решение такой проблемы. Заранее благодарен.
  • Rouse_ © (29.09.11 14:27) [1]
    Все пускает:
    function IsServiceRun(const ServiceName: string): Boolean;
    var
     SCManager, Service: SC_HANDLE;
     ServiceStatus: TServiceStatus;
    begin
     Result := False;
     SCManager := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE);
     if SCManager <> 0 then
     try
       Service := OpenService(SCManager, PChar(ServiceName), SERVICE_QUERY_STATUS);
       if Service <> 0 then
       try
         Result := QueryServiceStatus(Service, ServiceStatus) and
           (ServiceStatus.dwCurrentState = SERVICE_RUNNING);
       finally
         CloseServiceHandle(Service);
       end;
     finally
       CloseServiceHandle(SCManager);
     end;
    end;

  • Patrick1968 © (29.09.11 14:41) [2]
    а если на удаленной машине

     h_manager := OpenSCManager(PChar('SCO'), SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
         if h_manager > 0
             then begin
                   h_svc := OpenService(h_manager, PChar('OracleServiceMyBD'), GENERIC_READ);
                   if h_svc > 0 then begin
                                      QueryServiceStatus(h_svc, ServStatus);
                                      if ServStatus.dwCurrentState = SERVICE_STOPPED then MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Остановлена';
                                      if ServStatus.dwCurrentState = SERVICE_START_PENDING then MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Стартует';
                                      if ServStatus.dwCurrentState = SERVICE_STOP_PENDING then MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Останавливается';
                                      if ServStatus.dwCurrentState = SERVICE_RUNNING then MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Запущена';
                                      if ServStatus.dwCurrentState = SERVICE_CONTINUE_PENDING then MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Возобнавляется';
                                      if ServStatus.dwCurrentState = SERVICE_PAUSE_PENDING then MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Приостанавливается';
                                      if ServStatus.dwCurrentState = SERVICE_PAUSED then MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Пауза';
                                     end
                                else MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Служба не открыта'
                  end
             else MainDataModule.MyMemTable.FieldByName('OracleService').AsString := 'Нет связи';
  • Rouse_ © (29.09.11 14:49) [3]
    Флаги доступа напутаны...
  • Игорь Шевченко © (29.09.11 15:19) [4]
    tnsping rulezz fareva
  • DVM © (29.09.11 16:05) [5]

    > Rouse_ ©   (29.09.11 14:27) [1]
    > Все пускает:
    > function IsServiceRun(const ServiceName: string): Boolean;
    >

    А если этот код вдруг куда то не пустят, то причину ты не узнаешь :)
  • Rouse_ © (29.09.11 16:15) [6]
    Для демки потянет...
  • Patrick1968 © (29.09.11 17:19) [7]
    Сорри, а где сам код
    ?
  • Patrick1968 © (29.09.11 17:21) [8]
    а в моем случае какие необходимо ставить флаги доступа?
  • Rouse_ © (30.09.11 11:05) [9]
    Угу
  • Patrick1968 © (30.09.11 11:41) [10]
    не понял
  • Rouse_ © (30.09.11 12:21) [11]
    SC_MANAGER_ENUMERATE_SERVICE и SERVICE_QUERY_STATUS выставь как положено
  • Patrick1968 © (30.09.11 16:16) [12]
    дык изменил еще вчера, всё равно из под Windows 7 не хочет зацепится к консолю сервера Windows 2003, т.е. переменная h_manager (в моем примере) получается равной 0 , видимо в Windows 7 включены какие-то уровни безопасности.
  • Rouse_ © (30.09.11 16:38) [13]
    Значит скорее всего прав нету, GetLastError что возвращает? ERROR_ACCESS_DENIED?
  • Patrick1968 © (30.09.11 17:28) [14]
    Нет возвращается другое значение (D1:0,D2:0,D3:0,D4:(0,0,0,0,0,0,0,0))
  • Rouse_ © (30.09.11 19:39) [15]

    > Patrick1968 ©   (30.09.11 17:28) [14]
    >
    > Нет возвращается другое значение (D1:0,D2:0,D3:0,D4:(0,0,
    > 0,0,0,0,0,0))
    >

    эээ... GetLastError тебе обниленный GUID вернул?!
 
Конференция "WinAPI" » Проверка состояния сервиса Windows из XP и W7 [D7, WinXP]
Есть новые Нет новых   [134430   +3][b:0][p:0.001]