Question

Je suis en train de redémarrer programme un service à partir d'une application d'aide écrit en C # (.Net 4.0) mais je reçois une violation d'autorisation si je lance le fichier EXE en double cliquant en cliquant droit et en faisant « Exécuter en tant qu'administrateur » travaux.

Mais pourquoi ai-je besoin les utilisateurs sont les administrateurs locaux?

Je voudrais l'application de fonctionner normalement et ne demander des droits d'administrateur lorsque l'utilisateur clique sur le bouton pour redémarrer le service. Cela peut-il être fait?

Les besoins de solution pour travailler sur xp, vista et windows 7.

J'utilise ce code de http: //www.csharp-examples. net / redémarrage windows service /

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
  {
    // ...
  }
}
Était-ce utile?

La solution

Faire un nouveau projet d'application de la console comme ceci:

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
  { 
   // ...
  }
 }
}

Dans votre projet, ajouter une référence au projet supérieur et utiliser quelque chose comme ceci pour appeler l'exécutable. Pas l'utilisation du verbe runas, qui invite l'utilisateur des droits d'élévation.

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...

Autres conseils

Vous ne pouvez pas ignorer / ignorer la demande d'autorisation UAC (ce serait nier essentiellement son utilisation tout) mais PrincipalPermissionAttribute peut-être ce que vous cherchez. Jamais utilisé jusqu'à présent bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top