2010-11-25 10 views
1

Ich versuche programmgesteuert einen Dienst von innerhalb einer in C# (in .net 4.0) geschriebenen Hilfsanwendung neu zu starten, aber ich erhalte eine Berechtigungsverletzung, wenn ich die EXE ausführe, indem ich bei Klicken mit der rechten Maustaste doppelklicke und "als Administrator ausführen" funktioniert .UAC oder Userlevel wie man es bewältigt!

Aber warum brauche ich das die Benutzer sind lokale Admins ?!

Ich möchte, dass die App normal ausgeführt wird und nur Administratorrechte anfordern, wenn der Benutzer auf die Schaltfläche klickt, um den Dienst neu zu starten. Kann das gemacht werden?

Die Lösung muss auf XP, Vista und Windows arbeiten 7.

Ich verwende diesen Code aus 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 
    { 
    // ... 
    } 
} 

Antwort

5

Machen Sie eine neue Konsolenanwendung Projekt wie folgt aus:

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

Fügen Sie in Ihrem Projekt einen Verweis auf das obere Projekt hinzu und verwenden Sie etwa so, um die ausführbare Datei aufzurufen. Nicht die Verwendung des runas-Verbs, das den Benutzer zu Erhöhungsrechten auffordert.

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

das klingt nach einem guten ansatz danke ich werde es morgen versuchen und du weißt wie ich weitergehe. Prost. – Adrian

+0

+1 Und die +1 ist nicht von der OP (noch): P –

+0

Rubuns der Patient! Und nicht einmal seine Lösung! Danke M0sa Ich habe es gewählt und es als beantwortet geantwortet. gerade nicht in den 1ms, die rubans hätten mögen !!! – Adrian

2

Sie können die UAC Berechtigungsanfrage überspringen/ignorieren (das wäre es ganzer Gebrauch im Wesentlichen negieren), aber PrincipalPermissionAttribute sein könnte, was Sie suchen. Habe es aber bisher noch nie benutzt.

+0

Das könnte gut sein, danke, ich werde das auch versuchen und bevor rubuns springt, kann es mich einen Tag oder so dauern! – Adrian

+0

Leider bekomme ich jedes Mal, wenn ich das versuche, unter Windows 7 "Request For Principal Permission Failed". Verwenden Sie den obigen MS-Link! :( – Adrian