2010-11-25 4 views
1

J'essaye de redémarrer par programme un service depuis une application d'assistance écrite en C# (sur .net 4.0) mais je reçois une violation d'autorisation si j'exécute l'EXE en double-cliquant en faisant un clic droit et en exécutant "Exécuter en tant qu'administrateur" .UAC ou Userlevel comment le surmonter!

Mais pourquoi ai-je besoin de cela les utilisateurs sont des administrateurs locaux ?!

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

La solution doit travailler sur XP, Vista et Windows 7.

J'utilise ce code de http://www.csharp-examples.net/restart-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 
    { 
    // ... 
    } 
} 

Répondre

5

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, ajoutez une référence au projet supérieur et utilisez quelque chose comme ceci pour appeler l'exécutable. Pas l'utilisation du verbe runas, qui invitera l'utilisateur pour les 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... 
+0

cela semble être une bonne approche merci je vais l'essayer demain et vous savez comment je m'entends. à votre santé. – Adrian

+0

+1 Et le +1 ne vient pas de l'OP (encore): P –

+0

Rubuns l'hospitalisé! Et même pas sa solution! Merci M0sa Je l'ai voté et l'ai coché comme réponse. juste pas dans les 1ms que les rubans auraient aimé !!! – Adrian

2

Vous ne pouvez pas ignorer/ignorer la demande d'autorisation UAC (ce serait nier essentiellement son utilisation tout) mais PrincipalPermissionAttribute pourrait être ce que vous cherchez. Je ne l'ai jamais utilisé si loin.

+0

Cela pourrait être bien merci, je vais essayer cela aussi et avant que Rubuns saute dedans, il peut me prendre un jour ou deux! – Adrian

+0

Malheureusement, chaque fois que j'essaie cela, je reçois "Demande de permis principal a échoué" sous Windows 7! en utilisant le sur le lien MS ci-dessus! :( – Adrian

Questions connexes