Domanda

Sto cercando di programmazione riavviare un servizio dall'interno di un'applicazione di supporto scritto in C # (in .net 4.0) ma ottengo una violazione permesso se si esegue il file EXE con un doppio clic, mentre clic destro e fare "Esegui come amministratore" lavori.

Ma perché ho bisogno di questo gli utenti sono amministratori locali?!

Vorrei l'applicazione per funzionare normalmente e solo richiedere diritti di amministratore quando l'utente fa clic sul pulsante per riavviare il servizio. questo può essere fatto?

Le esigenze di soluzioni per lavorare su XP, Vista e Windows 7.

Sto usando questo codice da http: //www.csharp-examples. / restart-windows-service net /

public static void RestartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    int millisec1 = Environment.TickCount;
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Stop();
    service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

    // count the rest of the timeout
    int millisec2 = Environment.TickCount;
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2-millisec1));

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}
È stato utile?

Soluzione

Crea un nuovo progetto di console app come questo:

public class RunService
{
 static int Main()(string[] args)
 {
  //TODO read serviceName and timeoutMilliseconds from args
  ServiceController service = new ServiceController(serviceName);
  try
  {
    int millisec1 = Environment.TickCount;
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Stop();
    service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

    // count the rest of the timeout
    int millisec2 = Environment.TickCount;
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2-millisec1));   service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
    // TODO return status code
  }
  catch
  { 
   // ...
  }
 }
}

Nel progetto, aggiungere un riferimento al progetto e l'uso superiore qualcosa di simile a chiamare il file eseguibile. Non l'uso del verbo runas, che richiede all'utente per i diritti di elevazione.

var process = Process.Start(new ProcessStartInfo
                        {
                            Verb = "runas",
                            FileName = typeof(RunService).Assembly.Location,
                            UseShellExecute = true,
                            CreateNoWindow = true,
                        });
process.WaitForExit();
var exitCode = process.ExitCode
// TODO process exit code...

Altri suggerimenti

Non è possibile saltare / ignorare la richiesta di permesso di UAC (che sarebbe in sostanza, negare il suo uso intero), ma PrincipalPermissionAttribute potrebbe essere quello che stai cercando. Mai usato finora però.

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