PDA

Ver la Versión Completa : Iniciar y parar un servicio


seoane
08-06-2006, 14:16:18
uses WinSvc;

procedure StopService(Nombre: String);
var
ServiceControlManager: SC_HANDLE;
Service: SC_HANDLE;
ServiceStatus: SERVICE_STATUS;
begin
ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
if ServiceControlManager <> 0 then
begin
Service:= OpenService(ServiceControlManager,PChar(Nombre),SERVICE_ALL_ACCESS);
if Service <> 0 then
begin
if QueryServiceStatus(Service, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState <> SERVICE_STOPPED then
ControlService(Service, SERVICE_CONTROL_STOP, ServiceStatus);
end;
CloseServiceHandle(Service);
end;
CloseServiceHandle(ServiceControlManager);
end;
end;

procedure StartSrv(Nombre: String);
var
ServiceControlManager: SC_HANDLE;
Service: SC_HANDLE;
ServiceStatus: SERVICE_STATUS;
Argv: PChar;
begin
ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
if ServiceControlManager <> 0 then
begin
Service:= OpenService(ServiceControlManager,PChar(Nombre),SERVICE_ALL_ACCESS);
if Service <> 0 then
begin
if QueryServiceStatus(Service, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState <> SERVICE_RUNNING then
begin
Argv:= nil;
StartService(Service,0,Argv);
end;
end;
CloseServiceHandle(Service);
end;
CloseServiceHandle(ServiceControlManager);
end;
end;


Ejemplo de uso:

StartSrv('NombreDelServicio');
StopService('NombreDelServicio');

Bicho
26-09-2006, 18:01:33
Hola Domingo, no me funciona el truco.
Intento resetear un servicio en un pc remoto y aquí
ServiceControlManager:= OpenSCManager(<b>nil</b>, nil, SC_MANAGER_CONNECT);

Y en el primer nil lo substituyo por la IP del pc remoto y al preguntarle sobre el estatus funciona, pero cuando intenta acceder para detenerlo no.

Osea aquí:
Service:= OpenService(ServiceControlManager,PChar(Nombre),SERVICE_ALL_ACCESS);
if Service <> 0 then

Service siempre vale 0, incluso he probado a detener un servicio en mi pc, en local y ocurre lo mismo.

Alguna sugerencia?

Saludos y gracias

seoane
27-09-2006, 01:32:23
Puede que sea un problema de permisos,¿intentaste acceder a los servicios desde la consola mmc?. Recuerda que hay que ser administrador para manejar los servicios, y que debes estar "logueado" como administrador en la maquina remota para poder modificar sus servicios.

Yo en el tema de permisos, suplantar usuarios, etc. estoy bastante verde, pero creo el tema anda por ahí. Prueba lo siguiente:


runas /netonly /user:Administrador tuprograma.exe


Donde "Administrador" es el nombre de usuario del administrador en la maquina remota. A continuación te preguntara el password y tu programa se iniciara, pero cuando intente conectarse al otro equipo lo hará como administrador. Si entonces te funciona el problema estaba en los permisos.

Bicho
27-09-2006, 09:41:06
Hola Domingo, gracias por contestar,

Como te comenté, en local, no funciona tampoco. Desde la consola, puedo acceder y parar/iniciar... el servicio en cuestión. Y ahí es donde me extraña la cosa.

La solución que planteas probablemente funcione pero creo que voy a desestimar hacerlo. No me voy a arriesgar a resetetar un servicio remoto, habiendo tema de permisos y usuarios administradores de por medio. Si "casca" el servicio, que lo arreglen en sistemas o help desk, que para eso están.
Sólo lo quería para probar y ver si era factible de una manera sencilla.

Gracias de todos modos por tu ayuda

Saludos

Bicho
27-09-2006, 10:03:42
Solo una cosa más. Es curioso ver como si me deja preguntarle al pc remoto en que estado está el servicio, y me devuelve el estado correcto: (iniciado, no disponible, detenido...), pero no me deja detenerlo/arrancarlo