Frage

ich eine Anwendung, die von einem Dienst und einer ausführbaren Datei besteht. Im Wesentlichen Anwendung, es ist eine Form, die zum Starten und Stoppen eines Dienstes unter bestimmten Umständen verantwortlich ist.

Unter Windows XP die Anwendung verwaltet diese fein mit dem folgenden Code:

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

Aber auf Windows 7, auch wenn ich die Anwendung als Administrator haben damit begonnen, ich die folgende Ausnahme erhalten:

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

Gibt es etwas, ich kann programmatisch tun, dies zu lösen?

War es hilfreich?

Lösung

Wenn Sie sagen, dass Sie die Anwendung als Administrator gestartet, meinen Sie unter einem Konto in der Gruppe Administratoren oder über eine UAC-Eingabeaufforderung, dass Anfragen Administratoranmeldeinformationen? Ohne die UAC-Anmeldeinformationen-Eingabeaufforderung (oder tatsächlich als das Administrator-Konto ausgeführt wird, nicht ein Konto in der Administrator-Gruppe), die Anwendung keine Berechtigungen Dienste zu ändern, so dass die Ausnahme Sie sehen, korrekt ist.

Dieses Bit von Beispielcode kann überprüfen, ob Ihre Anwendung als Administrator ausgeführt wird, und wenn nicht, starten Sie ein UAC-Eingabeaufforderung.

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;
    }
}

Andere Tipps

Sie können auch die UAC für Ihre Anwendung versuchen Einstellung " Ausführen als Administrator " im Code.

FYI, wenn Sie nicht verstehen, warum es nicht in Vista arbeiten oder 7, auch wenn der aktuelle Benutzer in der Administrator-Gruppe ist, hier ist das, was MSDN zu sagen hat,

  

In Windows Vista User Account Control (UAC) bestimmt die Berechtigungen eines Benutzers. Wenn Sie ein Mitglied der integrierten Gruppe Administratoren werden Ihnen zugewiesen zwei Laufzeit-Zugriffstoken: ein Standardbenutzer-Zugriffstoken und ein Administrator-Zugriffstoken. Standardmäßig sind Sie in der Standard-Benutzerrolle. Wenn Sie eine Aufgabe ausführen möchten, die Administratorrechte erforderlich sind, können Sie dynamisch Ihre Rolle erhöhen, indem das Dialogfeld Zustimmung verwenden. Der Code, der die IsInRole Methode führt nicht die Zustimmung Dialogfeld anzuzeigen. Der Code gibt false zurück, wenn Sie in der Standard-Benutzerrolle sind, auch wenn Sie in der Built-in Administrator-Gruppe sind. Sie können Ihre Rechte erhöhen, bevor Sie den Code durch einen Rechtsklick auf das Anwendungssymbol ausführen und darauf hinweist, dass Sie als Administrator ausgeführt werden soll.

Ich erinnere mich ganz am 1. überrascht war, als 7 unter Verwendung von (I verwendet Vista nie).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top