Domanda

Ho un'applicazione che consiste in un servizio e un file eseguibile. In sostanza si tratta di una domanda di forme che è responsabile per l'avvio e l'arresto di un servizio in determinate circostanze.

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?

È stato utile?

Soluzione

Quando si dice che è stato avviato l'applicazione come amministratore, vuoi dire con un account del gruppo Administrators, o tramite un UAC che le credenziali di amministratore richieste di prompt? Senza le credenziali UAC prompt (o effettivamente in esecuzione come account amministratore, non un account all'interno del gruppo Administrators), l'applicazione non dispone di autorizzazioni per modificare i servizi, in modo da l'eccezione che stai vedendo è corretta.

Questo bit di codice di esempio può controllare se l'applicazione è in esecuzione come amministratore, e se non, lanciare un UAC prompt dei.

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;
    }
}

Altri suggerimenti

Si può anche provare a impostare l'UAC per la vostra applicazione per " Esegui come amministratore " nel codice.

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 ha da dire MSDN

  

In Windows Vista, l'utente Account Control (UAC) determina i privilegi di un utente. Se si è un membro del gruppo predefinito Administrators, si sono assegnati due token di accesso in fase di esecuzione: un accesso utente standard token e un token di accesso amministratore. Per impostazione predefinita, siete nel ruolo di utente standard. Quando si tenta di eseguire un'operazione che richiede privilegi amministrativi, è possibile elevare in modo dinamico il vostro ruolo utilizzando la finestra di dialogo di consenso. Il codice che esegue il metodo IsInRole non visualizza la finestra di dialogo di consenso. Il codice restituisce false se si è nel ruolo utente standard, anche se si è nel gruppo Built-in Administrators. È possibile elevare i privilegi prima di eseguire il codice facendo clic destro sull'icona dell'applicazione e che indica che si desidera eseguire come amministratore.

Mi ricordo che sono stato molto sorpreso al 1 ° quando si utilizza 7 (non ho mai usato Vista).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top