2010-07-12 5 views
5

ich in einer C# WinForms-Anwendung des folgenden Code bin mit Windows-Dienste auf einem entfernten PC startenStart A Remote Service von C#

public static List<Service> GetServices() 
    { 
     List<Service> Services = new List<Service>(); 
     ServiceController[] sc = ServiceController.GetServices(Server); 
     foreach (var s in sc) 
     { 
      Services.Add(new Service { Name = s.ServiceName, Running = s.Status == ServiceControllerStatus.Running }); 
     } 
     return Services; 
    } 

    public static bool StartService(string ServiceName) 
    { 
     try 
     { 
      ServiceController sc = new ServiceController(ServiceName, Server); 
      sc.Start(); 
      sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10)); 
      sc.Refresh(); 
      return sc.Status == ServiceControllerStatus.Running; 
     } 
     catch(Exception ex) { return false; } 
    } 

Die GetServices Methode funktioniert gut, wenn bei meinem lokalen PC oder an der Zeige Remote-PC. Die StartService-Methode funktioniert jedoch nur auf meinem lokalen PC. Wenn sie auf dem Remote-PC ausgeführt wird, wird der Zugriff verweigert. In diesem Fall ist der Remote-PC ein Windows XP Pro-Computer in derselben Domäne und der Benutzer, unter dem ich die App ausführe, hat lokale Administratorrechte.

Ich bin mir nicht sicher, ob dies ein Problem mit meinem Code ist oder ob meine Berechtigungen nicht korrekt sind.

Wenn dies ein Problem mit Berechtigungen ist, lassen Sie es mich wissen und ich werde versuchen, auf ServerFault zu fragen.

Dank

+3

Erster Schnelltest, öffnen Sie den Services Manager und stellen Sie eine Verbindung zum entfernten PC her und versuchen Sie, den erforderlichen Dienst zu starten. –

+0

Sind Sie sicher, dass Sie Ihre Anwendung als Administrator ausführen? Haben Sie CAS-Berechtigungen ('ServiceControllerPermission (ServiceControllerPermissionAccess.Control)' und 'SecurityPermission (PermissionState.Unrestricted)')? Sie sollten zuerst überprüfen, ob 'sc.Status == ServiceControllerStatus.Stopped' ist. –

+0

Ok der Service Manager schlägt fehl, also denke ich, das ist eine Frage für ServerFault, danke für die Hilfe. – Gavin

Antwort

0

Es stellt sich heraus, dass dies ein Berechtigungsproblem war. Ich habe mit einer virtuellen Maschine getestet und unsere VMs haben unterschiedliche Zugriffsrechte auf unsere Domain.

+1

Das hat @conrad Frix bereits beantwortet (12. Juli). Anstatt seine Antwort als Antwort auf diese Frage zu markieren, beantworteten Sie Ihre eigene Frage und markierten sie als Antwort. Das ist nicht richtiges Verhalten. – Esen

4

Wenn sich herausstellt, wollen Sie nur die Erlaubnis, die Fenster Dienste anstelle von Admin-Rechten zu starten und stoppen werden Sie den Dienst des DACL ändern können.

Es gibt grundsätzlich zwei Möglichkeiten, dies zu tun.

1) Ausführung der SDDL-Zeichenfolge (Security Descriptor Definition Language).

2) Vererben Sie NativeObjectSecurity und wenden Sie Ihre DACL-Änderungen während der ServiceInstaller_AfterInstall-Methode an.