2010-07-12 24 views
5

Sto utilizzando il seguente codice in un'applicazione C# WinForms per avviare i servizi di Windows su un PC remotoavviare un servizio remoto da 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; } 
    } 

Il metodo GetServices funziona bene quando si punta al mio PC locale o al PC remoto. Il metodo StartService funziona tuttavia solo sul mio PC locale, quando viene eseguito sul PC remoto, viene negato l'accesso. In questo caso il PC remoto è un computer Windows XP pro sullo stesso dominio e l'utente con cui sto eseguendo l'app ha i diritti di amministratore locale su di esso.

Non sono sicuro se si tratta di un problema con il mio codice o se le mie autorizzazioni non sono corrette.

Se si tratta di un problema di autorizzazioni, fatemelo sapere e proverò a chiedere su ServerFault.

Grazie

+3

Primo test rapido, aprire Gestione servizi e connettersi al PC remoto e provare ad avviare il servizio richiesto. –

+0

Sei sicuro di avere la tua applicazione come amministratore? Disponi di autorizzazioni CAS ('ServiceControllerPermission (ServiceControllerPermissionAccess.Control)' e 'SecurityPermission (PermissionState.Unrestricted)')? Si dovrebbe prima verificare se 'sc.Status == ServiceControllerStatus.Stopped'. –

+0

Ok anche il Service Manager fallisce quindi immagino che questa sia una domanda per ServerFault grazie per l'aiuto. – Gavin

risposta

0

Si è verificato un problema di autorizzazioni. Stavo testando con una macchina virtuale e le nostre macchine virtuali hanno permessi di accesso diversi sul nostro dominio.

+1

Questo è qualcosa che @conrad Frix ha già risposto (12 luglio). Invece di contrassegnare la sua risposta come risposta a questa domanda, hai risposto alla tua domanda e contrassegnata come risposta. Questo non è un comportamento corretto. – Esen

4

Se si scopre, si vuole solo il permesso di avviare e arrestare i servizi della finestra invece di avere diritti di amministratore si può modificare DACL del servizio.

Ci sono fondamentalmente due modi per farlo.

1) Esecuzione della stringa del linguaggio di definizione del descrittore di sicurezza (SDDL).

2) Ereditare da NativeObjectSecurity e applicare le modifiche DACL durante il metodo ServiceInstaller_AfterInstall.

Problemi correlati