Создать версию программы, которая принимает
Sam.exe /StopAndStopTheWindowsServiceINeedToSmack
При запуске вашего приложения, проверьте ключ командной строки. Если присутствует, то до остановки/начала.
Затем создать запланированное задание, которое запускает приложение с параметром командной строки, и имеет Выполнить с наивысшими правами установка опции:
Затем использовать 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, выпущенный в общественное достояние. Никакой атрибуции не требуется.