2010-11-25 4 views
1

Я пытаюсь программно перезапустить службу из вспомогательного приложения, написанного на C# (на .net 4.0), но я получаю нарушение прав, если я запускаю EXE, дважды щелкнув, щелкнув правой кнопкой мыши и выполнив «работать как администратор» ,UAC или Userlevel, как его преодолеть!

Но зачем мне эти пользователи являются локальными администраторами ?!

Я хочу, чтобы приложение запускалось нормально и только запрашивало права администратора, когда пользователь нажимает кнопку, чтобы перезапустить службу. Это можно сделать?

Решение должно работать на XP, Vista и окна 7.

я использую этот код из 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 
    { 
    // ... 
    } 
} 

ответ

5

Сделать новую консоль приложения проекта, как это:

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

В своем проекте добавьте ссылку на верхний проект и используйте что-то подобное для вызова исполняемого файла. Не использование глагола runas, который будет запрашивать у пользователя права на возвышение.

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

это звучит неплохо, спасибо, я попробую завтра, и вы знаете, как я нахожусь. веселит. – Adrian 2010-11-26 00:06:23

+0

+1 И +1 не от OP (пока): P – 2010-11-26 11:43:45

2

Вы не можете пропустить/игнорировать запрос на разрешение UAC (что бы по существу отрицает это целое использование), но PrincipalPermissionAttribute может быть то, что вы ищете. Никогда не использовал его до сих пор.