2009-10-09 12 views
18

Estoy tratando de escribir una aplicación y servicio que supervisa un conjunto determinado de servicios y a) se asegura de que se ejecutan yb) en función de ciertos criterios, reinícielos según sea necesario.Servicio de detención/inicio en el código en Windows 7

Me sigue encontrando con un error de acceso denegado.

Si simplemente iterar a través de los procesos en el sistema, encontrar el que quiero de esta manera:

foreach (ServiceController sc in ServiceController.GetServices()) 
    {     
     if(sc.ServiceName == "MyServiceName") 
     { 
      sc.Stop(); 
      sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60)); 
      sc.Start(); 
     }    
    } 

me sale:

InnerException: System.InvalidOperationException 
     Message="Cannot open My Service service on computer '.'." 
     Source="System.ServiceProcess" 
     StackTrace: 
      at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess) 
      at System.ServiceProcess.ServiceController.Stop() 
      at lib.ListServices() in D:\lib.cs:line 552 
      at lib.Init() in D:\lib.cs:line 56 
    InnerException: System.ComponentModel.Win32Exception 
      Message="Access is denied" 
      ErrorCode=-2147467259 
      NativeErrorCode=5 
      InnerException: 

he tratado de suplantar a un usuario, no tengo intenté hacer el mismo código desde otro servicio que se ejecuta como un servicio del sistema. Ninguno de los cuales realmente ha podido afectar el servicio. Si comenzó, no puedo detenerlo. Si se detuvo, no puedo iniciarlo. Sé que todo esto está relacionado con los permisos. Simplemente no encuentro un mecanismo que realmente me permita controlar el servicio.

Cualquier ayuda sería muy apreciada.

Respuesta

0

¿Podría ser la política de seguridad .net la que impide que su aplicación controle el servicio?

De acuerdo con MSDN, su conjunto necesita plena confianza para que esto funcione.

10

Creo que esto es un error de UAC ... Intenta ejecutar el exe con el botón derecho y "Ejecutar como administrador". Si eso ayuda, es posible que desee agregar un archivo Manifiesto a su proyecto ejecutable con level = "requireAdministrator".

0

Debe configurar la aplicación para que se ejecute como administrador. Si miras en el menú de propiedades de archivos. En la pestaña de compatibilidad, hay una opción de nivel Privilige, para permitir que el programa se ejecute como administrador. Se trabajó con mis propias bandejas del sistema en Windows 7.

10

diagnósticos:


UAC es de hecho el problema. Su aplicación requiere derechos de usuario elevados. Es por eso que el "ejecutar como administrador" funciona fuera del IDE.

Algunos sitios sugieren la desactivación de UAC. Como esta no es una posibilidad en mi entorno, decidí solicitar un derecho de usuario elevado a través del código. Wikipedia me brindó la ayuda que necesitaba. La sección "Solicitar elevación" proporciona la solución.

La solución en pocas palabras:


Editar archivo de manifiesto su aplicación para reflejar sus necesidades.


1.1. Haga clic derecho en su proyecto
1.2. Haga clic en "Propiedades"
1.3. Seleccione la pestaña "Aplicación" - página predeterminada
1.4. Haga clic en "Ver configuraciones de UAC": este botón abre el archivo de manifiesto de la aplicación (app.manifest)
1.5.Busque la sección "Opciones de manifiesto UAC"
1.6. Quite o comente la entrada actual - {requestedExecutionLevel level = "asInvoker" uiAccess = "false"}
1.7. Cambie a {requestedExecutionLevel level = "requireAdministrator" uiAccess = "false"}. MS proporciona sus 3 opciones como parte del comentario de la sección.

Cuestiones relacionadas