2009-10-09 3 views
18

Ich versuche, eine App und Service zu schreiben, die eine bestimmte Reihe von Diensten überwachen und a) stellt sicher, dass sie ausgeführt werden und b) basierend auf bestimmten Kriterien, starten Sie sie bei Bedarf neu.Stop/Start-Service in Code in Windows 7

Ich laufe weiter in einen Zugriff verweigert Fehler.

Wenn ich einfach durch die Prozesse auf dem System durchlaufen, finden die, die ich wie so wollen:

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

ich:

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: 

Ich habe versucht, einen Benutzer zu verkörpern, ich habe hat versucht, denselben Code von einem anderen Dienst auszuführen, der als Systemdienst ausgeführt wird. Keine von beiden konnte tatsächlich den Dienst beeinflussen. Wenn es angefangen hat, kann ich es nicht stoppen. Wenn es aufgehört hat, kann ich es nicht starten. Ich weiß, dass dies alles mit Berechtigungen zusammenhängt. Ich finde gerade keinen Mechanismus, der es mir tatsächlich erlaubt, den Dienst zu kontrollieren.

Jede Hilfe wäre sehr willkommen.

Antwort

0

Könnte es sein, dass die .net-Sicherheitsrichtlinie verhindert, dass Ihre App den Dienst steuert?

Gemäß MSDN benötigt Ihre Baugruppe vollständiges Vertrauen, damit dies funktioniert.

10

Ich denke, das ist UAC-Fehler ... Versuchen Sie, die Exe mit der rechten Maustaste ausführen und "Als Administrator ausführen". Wenn das hilft, möchten Sie vielleicht eine Manifest-Datei zu Ihrem ausführbaren Projekt mit level = "requireAdministrator" hinzufügen.

0

Sie müssen die Anwendung so einstellen, dass sie als Administrator ausgeführt wird. Wenn Sie im Menü der Dateieigenschaften nachsehen. Auf der Registerkarte Kompatibilität gibt es eine Option Privilige Level, um das Programm als Administrator ausführen zu lassen. Es funktionierte mit meinem eigenen System Tabletts in Windows 7.

10

Diagnosen:


UAC in der Tat das Problem. Ihre Anwendung erfordert erhöhte Benutzerrechte. Aus diesem Grund arbeitet "run as administrator" außerhalb der IDE.

Einige Websites empfehlen, die Benutzerkontensteuerung zu deaktivieren. Da dies in meiner Umgebung nicht möglich ist, habe ich mich entschieden, über den Code erhöhte Benutzerrechte anzufordern. Wikipedia stellte die Hilfe zur Verfügung, die ich brauchte. Der Abschnitt "Anfordern der Höhe" bietet die Lösung.

Die Lösung kurz:


Bearbeiten Sie Ihre Anwendung-Manifest-Datei Ihrer Anforderung zu reflektieren.


1.1. Rechtsklick auf Ihr Projekt
1.2. Klicken Sie auf "Eigenschaften"
1.3. Wählen Sie die Registerkarte "Anwendung" - Standardseite
1.4. Klicken Sie auf "UAC-Einstellungen anzeigen" - Diese Schaltfläche öffnet die Anwendungs-Manifest-Datei (app.manifest)
1.5.Suchen Sie nach dem Abschnitt "UAC Manifest Options"
1.6. Entfernen oder kommentieren Sie den aktuellen Eintrag - {requestedExecutionLevel level = "asInvoker" uiAccess = "false"}
1.7. Wechseln Sie zu {requestedExecutionLevel level = "requireAdministrator" uiAccess = "false"}. MS bietet Ihre 3 Optionen als Teil des Abschnitts Kommentar.