2010-10-08 14 views
12

Ho un'applicazione che consiste in un servizio e un eseguibile. Essenzialmente è un'applicazione di moduli che è responsabile per l'avvio e l'arresto di un servizio in circostanze specifiche.Autorizzazioni di ServiceController in Windows 7

In Windows XP l'applicazione gestisce questo bel utilizzando il seguente codice:

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

Ma su Windows 7, anche se ho iniziato l'applicazione come amministratore, ottengo la seguente eccezione:

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

C'è qualcosa che posso fare a livello di codice per risolvere questo?

risposta

13

Quando si dice di aver avviato l'applicazione come amministratore, si intende con un account nel gruppo Administrators o tramite un prompt UAC che richiede le credenziali dell'amministratore? Senza il prompt delle credenziali UAC (o effettivamente eseguito come account Administrator, non un account all'interno del gruppo Administrators), l'applicazione non dispone delle autorizzazioni per modificare i servizi, quindi l'eccezione che si sta verificando è corretta.

Questo bit di codice di esempio può controllare se l'applicazione è in esecuzione come amministratore e, in caso contrario, avviare un prompt UAC.

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

Mi dispiace essere un pazzo: uso una scorciatoia per lanciare e ho impostato su una delle mie macchine di prova per questo collegamento da eseguire come amministratore (e viene richiesto UAC) ma sulla macchina stavo ottenendo questa eccezione che non avevo t ha modificato la scorciatoia in modo appropriato. –

1

Cordiali saluti, se non si capisce il motivo per cui non funziona in Vista o 7, anche se l'utente corrente è nel gruppo di amministratori, ecco cosa MSDN ha da dire

In Windows Vista, account utente Control (UAC) determina i privilegi di un utente. Se si è membri del gruppo Amministratori incorporati, vengono assegnati due token di accesso in fase di esecuzione: un token di accesso utente standard e un token di accesso amministratore. Per impostazione predefinita, sei nel ruolo utente standard. Quando si tenta di eseguire un'attività che richiede privilegi amministrativi, è possibile elevare dinamicamente il proprio ruolo utilizzando la finestra di dialogo Consenso. Il codice che esegue il metodo IsInRole non visualizza la finestra di dialogo Consenso. Il codice restituisce false se si è nel ruolo utente standard, anche se si è nel gruppo Administrators incorporato. È possibile elevare i privilegi prima di eseguire il codice facendo clic con il pulsante destro del mouse sull'icona dell'applicazione e indicando che si desidera eseguire come amministratore.

Ricordo che ero abbastanza sorpreso al primo utilizzo di 7 (non ho mai usato Vista).