-
Проверяю состояние службы используя OpenSCManager по известной технологии, программа запускаемая из XP, отрабатывает нормально, но вот из Windows 7, пускать в консоль не хочет. Кто-нибудь знает решение такой проблемы. Заранее благодарен.
-
Все пускает: 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;
-
а если на удаленной машине
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 := 'Нет связи';
-
Флаги доступа напутаны...
-
tnsping rulezz fareva
-
> Rouse_ © (29.09.11 14:27) [1] > Все пускает: > function IsServiceRun(const ServiceName: string): Boolean; >
А если этот код вдруг куда то не пустят, то причину ты не узнаешь :)
-
Для демки потянет...
-
Сорри, а где сам код ?
-
а в моем случае какие необходимо ставить флаги доступа?
-
Угу
-
не понял
-
SC_MANAGER_ENUMERATE_SERVICE и SERVICE_QUERY_STATUS выставь как положено
-
дык изменил еще вчера, всё равно из под Windows 7 не хочет зацепится к консолю сервера Windows 2003, т.е. переменная h_manager (в моем примере) получается равной 0 , видимо в Windows 7 включены какие-то уровни безопасности.
-
Значит скорее всего прав нету, GetLastError что возвращает? ERROR_ACCESS_DENIED?
-
Нет возвращается другое значение (D1:0,D2:0,D3:0,D4:(0,0,0,0,0,0,0,0))
-
> Patrick1968 © (30.09.11 17:28) [14] > > Нет возвращается другое значение (D1:0,D2:0,D3:0,D4:(0,0, > 0,0,0,0,0,0)) >
эээ... GetLastError тебе обниленный GUID вернул?!
|