2014-01-09 4 views
0

Мне нужно запустить/остановить службу Windows из кода C# в определенное время каждый день. Поэтому я написал простую программу на C#. Моя программа работает только тогда, когда я запускаю ее как администратора. Его прекрасный я написал код для запуска моей программы в качестве администратора.запуск/остановка службы Windows через C# с запуском как admin без окна запроса UAC

Теперь я застрял в ситуации, когда мой код C# запускает файл exe как «Admin», но появляется окно UAC с program wants to change settings etc сообщениями.

Мне нужен мой код кода C#, который запускается под планировщиком окон, что означает, что человеческое взаимодействие не требуется. Что касается окна UAC, пользователю необходимо выбрать «Да».

Как я могу избавиться от этого или работать, чтобы моя программа выполняла и прекращала сервис полностью прагматично без какого-либо взаимодействия с человеком?

ответ

1

Создать версию программы, которая принимает

Sam.exe /StopAndStopTheWindowsServiceINeedToSmack 

При запуске вашего приложения, проверьте ключ командной строки. Если присутствует, то до остановки/начала.

Затем создать запланированное задание, которое запускает приложение с параметром командной строки, и имеет Выполнить с наивысшими правами установка опции:

enter image description here

Затем использовать Task Scheduler 2.0 API программно запустить запланированное задание ,

Bonus чата: Кусок кода

public Form1() 
{ 
    InitializeComponent(); 

    //Ideally this would be in program.cs, before the call to Application.Run() 
    //But that would require me to refactor code out of the Form file, which is overkill for a demo 
    if (FindCmdLineSwitch("StopAndStopTheWindowsServiceINeedToSmack", true)) 
    { 
     RestartService("bthserv"); //"Bluetooth Support Service" 
     Environment.Exit(0); 
    } 
} 

private bool FindCmdLineSwitch(string Switch, bool IgnoreCase) 
{ 
    foreach (String s in System.Environment.GetCommandLineArgs()) 
    { 
     if (String.Compare(s, "/" + Switch, IgnoreCase) == 0) 
      return true; 
     if (String.Compare(s, "-" + Switch, IgnoreCase) == 0) 
      return true; 
    } 
    return false; 
} 

И мы перезапустить службу:

private void RestartService(String ServiceName) 
{ 
    TimeSpan timeout = TimeSpan.FromMilliseconds(30000); //30 seconds 

    using (ServiceController service = new ServiceController(ServiceName)) 
    { 
     try 
     { 
      service.Start(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.Message, "Error stopping service"); 
      return; 
     } 
     service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 

     try 
     { 
      service.Start(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.Message, "Error starting service"); 
      return; 
     } 
     service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
    } 
} 

Bonus: проверка, если вы бежите повышенные:

private Boolean IsUserAnAdmin() 
{ 
    //A user can be a member of the Administrator group, but not an administrator. 
    //Conversely, the user can be an administrator and not a member of the administrators group. 

    //Check if the current user has administrative privelages 
    var identity = WindowsIdentity.GetCurrent(); 
    return (null != identity && new WindowsPrincipal(identity).IsInRole(WindowsBuiltInRole.Administrator)); 
} 

Примечание: A ny, выпущенный в общественное достояние. Никакой атрибуции не требуется.

 Смежные вопросы

  • Нет связанных вопросов^_^