【问题标题】:Programmatically restart a Windows Service以编程方式重新启动 Windows 服务
【发布时间】:2011-05-25 14:54:30
【问题描述】:

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

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

任何帮助表示赞赏!

【问题讨论】:

    标签: c++ windows-services


    【解决方案1】:
    1. 使用OpenSCManager 打开服务控制管理器。
    2. OpenService打开你要控制的服务。
    3. 使用 ControlServiceControlServiceEx 和 SERVICE_CONTROL_STOP 参数来停止服务。
    4. 做任何你需要做的事情。
    5. 使用StartService重启服务。
    6. 使用CloseServiceHandle 关闭服务和SCM 句柄。

    【讨论】:

      【解决方案2】:

      当然,有一大堆 C API 函数,例如 http://msdn.microsoft.com/en-us/library/ms682108%28v=vs.85%29.aspx

      【讨论】:

        【解决方案3】:

        有时您想从服务本身重新启动服务。这个解决方案对我有用。为了清楚起见,我省略了相当琐碎的计时器代码。请注意,此解决方案之所以有效,是因为调用者是一项服务并在更高级别上运行。

        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】:

          我参加聚会迟到了,但我会建议有关启动和停止服务的官方详细示例。与此处其他答案相比的优势在于它们包括错误处理、边缘情况和相关服务 -

          停止:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686335(v=vs.85).aspx 开始:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315(v=vs.85).aspx

          【讨论】:

            【解决方案5】:

            在 dos 框中,net start [service] 可以满足您的需求。如果您没有找到 API 解决方案,您始终可以使用 start [service] 作为参数为 net.exe 启动一个进程。

            【讨论】:

              【解决方案6】:

              您是否正在寻找这样的东西:Starting and stopping services

              【讨论】:

                【解决方案7】:

                您需要打开服务控制管理器 (OpenSCManager),然后打开服务本身 (OpenService),最后要求它自行启动 (StartService)。关闭你一路上使用的所有把手,然后你就完成了。

                哇,用 C++ 处理服务真的让我回味无穷……

                祝你好运,

                【讨论】:

                  【解决方案8】:

                  您也可以为此use WMI。该链接上的示例代码是 VB,但它应该很容易移植到 Windows 上的几乎任何语言。

                  如果您对 Windows 上的自动化感兴趣,那么 WMI 很适合学习,因为它为系统上大多数有趣的对象提供了一个语言中立的面向对象的接口。

                  【讨论】:

                    猜你喜欢
                    • 2011-10-03
                    • 2010-09-18
                    • 2023-03-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-08-04
                    • 1970-01-01
                    相关资源
                    最近更新 更多