UAC или Userlevel как это побороть! - PullRequest
1 голос
/ 26 ноября 2010

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

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

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

Решение должно работать на XP, Vista и Windows 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
  {
    // ...
  }
}

Ответы [ 2 ]

5 голосов
/ 26 ноября 2010

Создайте новый проект консольного приложения следующим образом:

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...
2 голосов
/ 26 ноября 2010

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

...