К сожалению, не могу воспроизвести. У меня есть уже существующий сервис, который предоставляет почтовый ящик, поэтому я добавил код:
void RebootThisMachine ()
{
if (GrabPrivilege (SE_SHUTDOWN_NAME))
{
if (!InitiateSystemShutdown (NULL,NULL,0,TRUE,TRUE))
{
wsprintf (g_szDebug, TEXT("RebootMachine - ISS failed, error %d"),
GetLastError()) ;
DebugMessage (DEBUG_ERROR, g_szDebug) ;
}
}
else
{
wsprintf (g_szDebug, TEXT("RebootMachine - cannot grab priv, error %d"),
GetLastError()) ;
DebugMessage (DEBUG_ERROR, g_szDebug) ;
}
}
и вызвал его, когда получил сообщение почтового ящика от маленькой утилиты командной строки, которую я написал. InitiateSystemShutdown - это правильный API для службы, и он перезагружает компьютер, на котором запущена служба, вне зависимости от того, вошел он в систему или нет. Выключение действительно занимает некоторое время, если мой (Vista) компьютер не вошел в систему, но в конечном итоге он работает (после 30-40-х годов произнесения «выключение»). Мой сервис выполняется под LocalSystem. GrabPrivilege - это тот же код, который я выложил ранее.
Таким образом, вы можете смириться с тем фактом, что то, что вы пытаетесь сделать , возможно . Я вижу, что вы используете учетную запись администратора для запуска службы. Вы пытались запустить свой сервис под LocalSystem в целях проверки завершения работы? Возможно, привилегии вашего администратора не совсем совпадают с привилегиями LocalSystem ...