可悲的是,无法复制。我有一个预先存在的服务,它公开了一个邮槽,所以我添加了代码:
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 的权限不太匹配...