使用iisreset.exe的COM接口操作IIS服务

·

我在实际情况中发现使用关闭Windows服务的方式重启IIS是有一定概率失败的,很可能是由超时时间导致的。使用COM组件的方式重启IIS就没有这个问题,iisreset.exe使用的就是这个COM接口。

启动、停止Windows服务

#include <windows.h>
#include <iisrsta.h>
const IID IID_IIisServiceControl =
{ 0x0E8FB8620, 0x588F, 0x11D2,
    { 0x9D, 0x61, 0x00, 0xC0, 0x4F, 0x79, 0xC5, 0xFE } };

const GUID CLSID_IisServiceControl =
{ 0x0E8FB8621, 0x588F, 0x11D2,
    { 0x9D, 0x61, 0x00, 0xC0, 0x4F, 0x79, 0xC5, 0xFE } };

int main(int argc, char* argv[])
{
    HRESULT				result;
    int					rc = -1;
    IIisServiceControl*	IisSrvCtrl = nullptr;
    
    result = CoInitializeEx(0, 0);
    if (result != S_OK)
        return 1;
    do
    {
        result = CoCreateInstance(CLSID_IisServiceControl, 
                                  nullptr, 
                                  CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER | CLSCTX_INPROC_SERVER, 
                                  IID_IIisServiceControl, 
                                  (LPVOID*)&IisSrvCtrl
        );
        if (result != S_OK)
        {
            rc = 2;
            break;
        }
        //如果IIS服务本身就是关闭状态,调用Stop函数返回的也是S_OK
        result = IisSrvCtrl->Stop(60 * 1000, TRUE);
        if (result != S_OK)
        {
            MessageBoxA(NULL, "关闭服务失败", "", 0);
            rc = 3;
            break;
        }
        //
        MessageBoxA(NULL, "成功关闭IIS服务", "", 0);
        result = IisSrvCtrl->Start(60 * 1000);
        if (S_OK != result)
        {
            MessageBoxA(NULL, "启动服务失败", "", 0);
            rc = 4;
            break;
        }
        rc = 0;
    } while (0);
    CoUninitialize();
    return rc;
}

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注