以编程方式重新启动Windows服务

15

我知道这可以在C#/.Net中完成,但我想知道是否可以调用Windows API来完成?

我有一个服务将服务DHCP请求,当我想要更新服务的配置时,我需要停止服务,重写其INI文件,然后再次启动服务。

非常感谢任何帮助!

8个回答

33

5

5
有时候您可能希望从服务本身重新启动服务。这个解决方案对我有用。出于清晰起见,我省略了相当琐碎的计时器代码。请注意,此解决方案之所以有效,仅是因为调用者是服务并在提高的权限级别下运行。
void Watchdog::OnTimeout()
{
    STARTUPINFO si = { };
    si.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&si);

    PROCESS_INFORMATION pi = { };

    // is modified by the call to CreateProcess (unicode version).
    TCHAR szCmdLine[] = _T("cmd.exe /C \"net stop <yourservicenamehere> & net start <yourservicenamehere>\"");

    // send shell command to restart our service.
    if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
    {
        // do some error reporting...
        LOG("*** ERROR *** Watchdog timeout.  Restart attempt failed. Last error: 0x%x\n", GetLastError());
    }
}

4

3

3
你需要打开服务控制管理器(OpenSCManager),然后打开服务本身(OpenService),最后要求它启动自己(StartService)。完成后关闭所有使用过的句柄,就完成了。
哇,用C++处理服务真的让我回忆起很多事情...
祝你好运,

2
在DOS命令行中,net start [服务名]可以实现您所需的功能。如果找不到API解决方案,您可以始终启动一个进程来运行net.exe并使用start [服务名]作为参数。

2
您也可以使用WMI来完成这个任务。链接中提供了VB的示例代码,但是将其移植到Windows上的任何其他语言应该非常容易。
如果您喜欢在Windows上进行自动化操作,学习WMI是很好的选择,因为它提供了一个与语言无关的面向对象接口,用于访问系统上大部分有趣的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接