Question

I ont une application qui se compose d'un service et un exécutable. Essentiellement, il est une application de formulaires qui est responsable de démarrer et d'arrêter un service dans des circonstances spécifiques.

Sous Windows XP, l'application gère cette fin en utilisant le code suivant:

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

Mais sur Windows 7, même si j'ai commencé l'application en tant qu'administrateur, je reçois l'exception suivante:

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()

Est-ce que je peux faire pour résoudre ce programme?

Était-ce utile?

La solution

Quand vous dites que vous avez commencé l'application en tant qu'administrateur, voulez-vous dire sous un compte dans le groupe Administrateurs, ou via une identification d'administrateur invite que les demandes CCU? Sans les informations d'identification rapide UAC (ou en cours d'exécution en fait que le compte administrateur, et non un compte au sein du groupe Administrateurs), votre application ne dispose pas des autorisations pour modifier les services, de sorte que l'exception que vous voyez est correct.

Ce bit de code exemple peut vérifier si votre application est en cours d'exécution en tant qu'administrateur, et sinon, lancez une invite 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;
    }
}
scroll top