UAC или пользователь, как это преодолеть!
-
28-09-2019 - |
Вопрос
Я пытаюсь программно перезапустить сервис из приложения в хелпере, написанном в C # (на .NET 4.0), но я получаю нарушение разрешений, если я запускаю EXE, дважды щелкнув, пока работает правой кнопкой мыши.
Но почему мне нужны это, пользователи являются местными администраторами?!
Я хотел бы приложение запустить нормально и запросить только права администратора, когда пользователь нажимает кнопку, чтобы перезапустить сервис. Это может быть сделано?
Раствор должен работать на XP, Vista и Windows 7.
Я использую этот код из http://www.charp-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
{
// ...
}
}
Решение
Сделайте новый проект приложений консоли, как это:
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...
Другие советы
Вы не можете пропустить / игнорировать запрос на разрешение UAC (это, по сути не отрицает все это использование), но Transoripermissionattribute может быть то, что вы ищете. Никогда не использовал это до сих пор.