2010-10-08 5 views
12

Ich habe eine Anwendung, die aus einem Dienst und einer ausführbaren Datei besteht. Im Wesentlichen ist es eine Formularanwendung, die für das Starten und Beenden eines Dienstes unter bestimmten Umständen zuständig ist.ServiceController Berechtigungen in Windows 7

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

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 angefangen habe, die Anwendung als Administrator, erhalte ich die folgende Ausnahme:

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 irgendetwas, was ich programmatisch tun kann, um dies zu beheben?

Antwort

13

Wenn Sie sagen, dass Sie die Anwendung als Administrator gestartet haben, meinen Sie dies unter einem Konto in der Gruppe Administratoren oder über eine UAC-Eingabeaufforderung, die Administratoranmeldeinformationen anfordert? Ohne die Eingabeaufforderung für die UAC-Anmeldeinformationen (oder die Ausführung als Administratorkonto und nicht als Konto in der Gruppe Administratoren) verfügt Ihre Anwendung nicht über Berechtigungen zum Ändern von Diensten. Daher ist die angezeigte Ausnahme korrekt.

Mit diesem Beispielcode können Sie überprüfen, ob Ihre Anwendung als Administrator ausgeführt wird. Falls nicht, starten Sie eine 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; 
    } 
} 
+1

Sorry war ein Idiot - ich benutze eine Verknüpfung zum Starten und hatte auf einer meiner Testmaschinen für diese Verknüpfung als Administrator ausgeführt werden (Und zur UAC aufgefordert), aber auf dem Rechner bekam ich diese Ausnahme ich hatte nicht t hat die Verknüpfung entsprechend geändert. –

1

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 was MSDN

In Windows Vista User Account zu sagen hat Kontrolle (UAC) bestimmt die Privilegien eines Benutzers. Wenn Sie Mitglied der Gruppe der integrierten Administratoren sind, werden Ihnen zwei Laufzeit-Zugriffstoken zugewiesen: ein Standardbenutzerzugriffstoken und ein Administratorzugriffstoken. Standardmäßig befinden Sie sich in der Standardbenutzerrolle. Wenn Sie versuchen, eine Aufgabe auszuführen, für die Administratorrechte erforderlich sind, können Sie Ihre Rolle mithilfe des Dialogfelds "Zustimmung" dynamisch erweitern. Der Code, der die IsInRole-Methode ausführt, zeigt das Consent-Dialogfeld nicht an. Der Code gibt false zurück, wenn Sie sich in der Standardbenutzerrolle befinden, selbst wenn Sie sich in der Gruppe der integrierten Administratoren befinden. Sie können Ihre Berechtigungen erhöhen, bevor Sie den Code ausführen, indem Sie mit der rechten Maustaste auf das Anwendungssymbol klicken und angeben, dass Sie als Administrator ausgeführt werden möchten.

Ich erinnere mich, ich war ziemlich überrascht bei der ersten Verwendung von 7 (ich habe nie Vista verwendet).