Windows下重启指定名称的服务

// 重启指定服务
void CPSSDPrinterCtrlPlug::RestartService(const wchar_t* nswServiceName)
{
    SC_HANDLE schSCManager = NULL;
    SC_HANDLE schService = NULL;

    do
    {
        // -------------------------------------------------------------------------------------------------------------------------
        // open

        // Get a handle to the SCM database.
        schSCManager = OpenSCManager(
            NULL,                    // local computer
            NULL,                    // ServicesActive database
            SC_MANAGER_ALL_ACCESS);  // full access rights
        if (NULL == schSCManager)
        {
            DebugWrite(L"ERROR——————OpenSCManager failed (%d)\n", GetLastError());
            break;
        }

        // Get a handle to the service.
        schService = OpenService(
            schSCManager,            // SCM database
            nswServiceName,               // name of service
            SERVICE_CHANGE_CONFIG);  // need change config access
        if (schService == NULL)
        {
            DebugWrite(L"ERROR——————OpenService failed (%d)\n", GetLastError());
            break;
        }    

        // -------------------------------------------------------------------------------------------------------------------------
        // stop

        // Make sure the service is not already stopped.
        DWORD dwBytesNeeded;
        SERVICE_STATUS_PROCESS ssp;
        if ( !QueryServiceStatusEx( schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS),
            &dwBytesNeeded ) )
        {
            DebugWrite(L"ERROR——————QueryServiceStatusEx failed (%d)\n", GetLastError());
            break;
        }
        if ( ssp.dwCurrentState != SERVICE_STOPPED || SERVICE_STOP_PENDING == ssp.dwCurrentState)
            break;
        {
            DebugWrite(L"ERROR——————Service is already stopped.\n");
            break;
        }

        // Send a stop code to the service.
        if ( !ControlService(schService, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS) &ssp ) )
        {
            DebugWrite(L"ERROR——————ControlService failed (%d)\n", GetLastError() );
            break;
        }

        // Wait for the service to stop.
        DWORD dwStartTime = GetTickCount();
        DWORD dwTimeout = 30000; // 30-second time-out
        while ( ssp.dwCurrentState != SERVICE_STOPPED )
        {
            Sleep( ssp.dwWaitHint );
            if ( !QueryServiceStatusEx(schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded ) )
            {
                DebugWrite(L"ERROR——————QueryServiceStatusEx failed (%d)\n", GetLastError() );
                break;
            }

            if ( ssp.dwCurrentState == SERVICE_STOPPED )
                break;

            if ( GetTickCount() - dwStartTime > dwTimeout )
            {
                DebugWrite(L"ERROR——————Wait timed out\n" );
                break;
            }
        }

        if(ssp.dwCurrentState != SERVICE_STOPPED)
            break;

        // -------------------------------------------------------------------------------------------------------------------------
        // start

        // Attempt to start the service.
        if (!StartService(schService,  // handle to service
            0,           // number of arguments
            NULL) )      // no arguments
        {
            DebugWrite(L"ERROR——————StartService failed (%d)\n", GetLastError());
            break;
        }

        // Check the status until the service is no longer start pending.
        SERVICE_STATUS_PROCESS ssStatus;
        if (!QueryServiceStatusEx(
            schService,             // handle to service
            SC_STATUS_PROCESS_INFO, // info level
            (LPBYTE) &ssStatus,             // address of structure
            sizeof(SERVICE_STATUS_PROCESS), // size of structure
            &dwBytesNeeded ) )              // if buffer too small
        {
            DebugWrite(L"ERROR——————QueryServiceStatusEx failed (%d)\n", GetLastError());
            break;
        }

        // Save the tick count and initial checkpoint.
        dwStartTime = GetTickCount();
        DWORD dwWaitTime;
        DWORD dwOldCheckPoint = ssStatus.dwCheckPoint;
        while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
        {
            // Do not wait longer than the wait hint. A good interval is
            // one-tenth the wait hint, but no less than 1 second and no
            // more than 10 seconds.
            dwWaitTime = ssStatus.dwWaitHint / 10;

            if( dwWaitTime < 1000 )
                dwWaitTime = 1000;
            else if ( dwWaitTime > 10000 )
                dwWaitTime = 10000;
            Sleep( dwWaitTime );

            // Check the status again.
            if (!QueryServiceStatusEx(
                schService,             // handle to service
                SC_STATUS_PROCESS_INFO, // info level
                (LPBYTE) &ssStatus,             // address of structure
                sizeof(SERVICE_STATUS_PROCESS), // size of structure
                &dwBytesNeeded ) )              // if buffer too small
            {
                DebugWrite(L"ERROR——————QueryServiceStatusEx failed (%d)\n", GetLastError());
                break;
            }

            if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
            {
                // The service is making progress.
                dwStartTime = GetTickCount();
                dwOldCheckPoint = ssStatus.dwCheckPoint;
            }
            else
            {
                if(GetTickCount()- dwStartTime > ssStatus.dwWaitHint)
                {
                    // No progress made within the wait hint.
                    break;
                }
            }
        } 

        // Determine whether the service is running
        if (ssStatus.dwCurrentState != SERVICE_RUNNING)
        {
            DebugWrite(L"ERROR——————start spooler failed (%d)\n", GetLastError());
            //printf("Service not started. \n");
            //printf("  Current State: %d\n", ssStatus.dwCurrentState);
            //printf("  Exit Code: %d\n", ssStatus.dwWin32ExitCode);
            //printf("  Check Point: %d\n", ssStatus.dwCheckPoint);
            //printf("  Wait Hint: %d\n", ssStatus.dwWaitHint);
        } 

    }while(false);
    if(NULL != schService)
        CloseServiceHandle(schService);
    if(NULL != schSCManager)
        CloseServiceHandle(schSCManager);
}
时间: 2024-10-09 03:01:57

Windows下重启指定名称的服务的相关文章

在windows下使用批处理启动停止服务

现在系统上运行的软件和服务是越来越多,但是内存是有限的,这就导致了计算机的速度越来越慢.作为开发者,都清楚的知道很多服务的运行是需要占用大量资源的,而且大部分服务都是默认开机启动,空闲的时候运行很浪费,每次都要去控制面板下停止服务,很繁琐,因为我就想到在windows下用批处理解决服务的启动和停止. 首先,要知道在DOS模式下哪个命令是可以用来启动和停止服务的.我用的是net.exe,简单的介绍一下net在服务启动和停止方面的使用. net start service 启动服务 net stop

windows下注册和取消pg服务的方法

介绍windows下注册和取消pg服务的命令的相关知识,在文章下面给大家介绍了如何将exe注册为windows服务,直接从后台运行,本文给大家分享两种方法,感兴趣的朋友一起看看吧 pg_ctl register [-N servicename] [-U username] [-P password] [-D datadir] [-w][-t seconds] [-o options] pg_ctl unregister [-N servicename] 参数说明如下: -N servicenam

windows下关闭指定端口服务,解决tomcat端口占用问题

http://blog.aizhet.com/Server/640.html 在windows下做java EE的开发时:搭建 Eclipse+tomcat的java web开发环境:在应用之中经常遇到 tomcat在重新启动服务时,端口占用问题:导致无法启动服务: 错误提示: Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The server ma

windows下重启mysql

其中第二种方法对我这无效,以后再搞清楚! 一.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQL——开启(停止.重启动) 二.命令行方式 Windows 1.点击“开始”->“运行”(快捷键Win+R). 2.启动:输入 net stop mysql 3.停止:输入 net start mysql 提示* Redhat Linux 也支持service command,启动:# service mysqld start 停止:# service mysqld sto

Windows下将nginx安装为服务运行

今天看到nginx这个小服务器软件正式版更新到了1.4.2,想玩下它.这个服务器软件虽小,但功能强大,是开源软件,有着良好的性能,被很多个人.企业,甚至大型企业所使用! 由于是在Windows下,所以只能双击运行,然后通过以下命令来管理:  Nginx/Win32是运行在一个控制台程序,而非windows服务方式的.服务器方式目前还是开发尝试中,Nginx/Win32可以使用以下开关来管理它: Nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务.(快速退出)

windows下安装、卸载mysql服务

将下载下来的mysql解压到指定目录下(如:d:\mysql)安装服务在命令行输入d:\mysql\bin\mysqld -installnet start mysql卸载服务在命令行输入net stop mysqld:\mysql\bin\mysqld -remove 在win2000下安装服务在命令行输入d:\mysql\bin\mysqld-nt -installnet start mysql 卸载服务在命令行输入net stop mysqld:\mysql\bin\mysqld-nt -

Windows下快速启动/关闭orcl服务

大家都知道windows下绝大部分都是图形操作化,很少用命令来执行,例如启动.关闭orcl数据库服务时,一般情况都是在任务管理器(taskmgr.ctrl+shift+esc)或服务(services.msc)等方式找到orcl相关服务手动挨个挨个启动.关闭服务,这样个人感觉效率低,也很繁琐,今天教大家一个快速启动.关闭orcl服务的方法,方便你我他她....... 在cmd下有两种命令方法启动服务,分别为net和sc命令,区别是sc可以启动被禁用的服务 net语法是: net start 服务

Windows 下配置 Logstash 为后台服务

到目前为止,logstash 没有给出官方的,在 windows 系统中作为后台服务运行的方式.本文将介绍如何使用第三方工具 nssm 让 logstash 作为后台服务运行在 windows 中.说明:演示的环境为 windows server 2016,logstash 的版本为 6.2.4. 安装 Java Development Kit(JDK) 运行 logstash 6.2.4 需要先在环境中安装 JDK,演示中笔者安装的版本为 jdk-8u111-windows-x64,直接安装到

Windows下删除不需要的服务

开始"--"运行"--"msconfig"回车 在"服务"里面可以找到 至于删除服务项,就请打开注册表("开始"--"运行"--"regedit")然后依次打开HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services,将你所希望删除的服务项从注册表里删除就行了, 建议使用辅助软件来管理你的注册表项目(比如 360 安全卫士以及你说的 Wi