Pregunta

Estoy tratando de reiniciar programación un servicio desde dentro de una aplicación de ayuda escrito en C # (en .NET 4.0) pero me da una violación permiso si corro el EXE con un doble clic, mientras que haciendo clic derecho y "Ejecutar como administrador" obras.

Pero, ¿por qué necesito esto, los usuarios son administradores locales?!

Me gustaría que la aplicación para funcionar normalmente y sólo solicitar derechos de administrador cuando el usuario haga clic en el botón para reiniciar el servicio. ¿Es posible hacerlo?

Las necesidades de soluciones para trabajar en XP, Vista y Windows 7.

Estoy usando este código de http: //www.csharp-examples. / reinicio-windows-servicio de red /

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
  {
    // ...
  }
}
¿Fue útil?

Solución

Hacer un nuevo proyecto de aplicación de consola como esto:

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

En su proyecto, agregue una referencia al proyecto y el uso superior algo como esto para llamar al ejecutable. No es la utilización de la runa verbo, que se solicitará al usuario derechos de elevación.

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...

Otros consejos

No se puede omitir / ignorar la solicitud de permiso de UAC (que sería esencialmente negar su uso conjunto) pero PrincipalPermissionAttribute podría ser lo que estás buscando. Nunca utilizado hasta ahora sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top