Pregunta

Tengo una aplicación que consiste en un servicio y un ejecutable. Esencialmente es una aplicación de formas que se encarga de iniciar y detener un servicio de acuerdo con las circunstancias específicas.

En Windows XP la aplicación gestiona este fino usando el siguiente código:

ServiceController controller = new ServiceController();
controller.MachineName = ".";
controller.ServiceName = "XXXXXXXXXX";
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10));
controller.Start();

Sin embargo, en Windows 7, a pesar de que he comenzado la aplicación como administrador, me sale el siguiente excepción:

System.InvalidOperationException: Cannot open XXXXXXXXXXXXX service on computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied
   --- End of inner exception stack trace ---
   at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
   at System.ServiceProcess.ServiceController.Start(String[] args)
   at System.ServiceProcess.ServiceController.Start()

¿Hay algo que pueda hacer mediante programación para resolver esto?

¿Fue útil?

Solución

Cuando usted dice que inició la aplicación como administrador, quiere usted decir con una cuenta en el grupo Administradores, o por medio de un UAC que las credenciales de administrador solicitudes con prontitud? Sin las credenciales UAC (o en realidad se ejecuta como la cuenta de administrador, no una cuenta en el grupo Administradores), su aplicación no tiene permisos para modificar los servicios, por lo que la excepción que están viendo es correcta.

Este bit de ejemplo de código puede comprobar si su aplicación se está ejecutando como administrador, y si no, poner en marcha un UAC.

public static class VistaSecurity
{
    public static bool IsAdministrator()
    {
        WindowsIdentity identity = WindowsIdentity.GetCurrent();

        if (null != identity)
        {
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }

        return false;
    }

    public static Process RunProcess(string name, string arguments)
    {
        string path = Path.GetDirectoryName(name);

        if (String.IsNullOrEmpty(path))
        {
            path = Environment.CurrentDirectory;
        }

        ProcessStartInfo info = new ProcessStartInfo
        {
            UseShellExecute = true,
            WorkingDirectory = path,
            FileName = name,
            Arguments = arguments
        };

        if (!IsAdministrator())
        {
            info.Verb = "runas";
        }

        try
        {
            return Process.Start(info);
        }

        catch (Win32Exception ex)
        {
            Trace.WriteLine(ex);
        }

        return null;
    }
}

Otros consejos

Puede también tratar de establecer la UAC para su aplicación a " Ejecutar como Administrador " en el código.

Para su información, si no se entiende por qué no funciona en Vista o 7, incluso si el usuario actual es en el grupo de administradores, esto es lo que tiene que decir MSDN

  

En Windows Vista, el Control de cuentas de usuario (UAC) determina los privilegios de un usuario. Si usted es un miembro de los dos testigos de acceso en tiempo de ejecución incorporada grupo de administradores, se le asigna: un token de usuario estándar y un token de acceso de administrador. Por defecto, se encuentra en la función de usuario estándar. Cuando intenta realizar una tarea que requiere privilegios administrativos, se puede elevar de forma dinámica su papel mediante el cuadro de diálogo de consentimiento. El código que se ejecuta el método IsInRole no muestra el cuadro de diálogo de consentimiento. El código devuelve falso si usted está en el papel de usuario estándar, incluso si está en el grupo Administradores integrado. Puede elevar sus privilegios antes de ejecutar el código, haga clic en el icono de la aplicación e indicando que desea ejecutar como administrador.

Recuerdo que estaba muy sorprendido por primera al usar 7 (nunca he usado Vista).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top