紧急求救:请问如何编程实现启动/停止IIS服务?

Netguy 2002-01-28 03:25:41
我用StartService( ) API函数来启动w3svc服务,但是经常会失败,结果导致IIS服务处于“启动”状态,这是一种异常的中间状态。正常状态应为“已启动”。当出现这种异常状态时,就无法在系统自带的服务管理器中操作IIS服务了,因为相应的菜单项变灰了,必须重启机器或者使用系统自带的iisreset命令。

我粗略看了一下iisreset.exe,它好象是利用某些COM接口来启动IIS服务的,在MSDN中没查到。

谁知道iisreset.exe的这种实现方式的原理或等价的办法(我的程序不能调用iisreset)?谢谢。
...全文
92 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Netguy 2002-01-31
  • 打赏
  • 举报
回复
多谢楼上各位。

不过上面贴出的CNTService实际上也是用API StartService( )来启动服务的,和我做的一样,只不过等待的时间、方式不同,难道是因为这个原因?
捕鲸叉 2002-01-28
  • 打赏
  • 举报
回复
gzup
shenhai79 2002-01-28
  • 打赏
  • 举报
回复
// NTService.cpp: implementation of the CNTService class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "NTService.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CNTService::CNTService()
{

}

CNTService::~CNTService()
{

}

void CNTService::DisplayErrorText(DWORD dwLastError)
{
HMODULE hModule = NULL;
LPSTR MessageBuffer;
DWORD dwBufferLength;

DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM ;

if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR)
{
hModule = LoadLibraryEx(
TEXT("netmsg.dll"),
NULL,
LOAD_LIBRARY_AS_DATAFILE
);

if(hModule != NULL)
dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
}

if(dwBufferLength = FormatMessageA(
dwFormatFlags,
hModule,
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR) &MessageBuffer,
0,
NULL
))
{

AfxMessageBox(MessageBuffer);
LocalFree(MessageBuffer);
}

if(hModule != NULL)
FreeLibrary(hModule);
}

BOOL CNTService::InstallService(CString strMachineName,
CString strServiceName,
CString strServiceDisplayName,
CString strServicePathName,
CString strDependencies,
CString strUserName,
CString strPassword)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;


BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
schService = CreateService( //调用建立SERVICE的API
schSCManager, //SERVICE管理器数据库的句柄
(LPCTSTR)strServiceName, //服务名称
(LPCTSTR)strServiceDisplayName, //显示的名称
SERVICE_ALL_ACCESS, //希望得到的运行权限
SERVICE_WIN32_OWN_PROCESS, //SERVICE的类型
SERVICE_AUTO_START, //启动的方式
SERVICE_ERROR_NORMAL, //错误控制类型
(LPCTSTR)strServicePathName, //可执行文件的路径名
NULL, //一组服务装入时的顺序
NULL, //检查人标记
(LPCTSTR)strDependencies, //从属
(LPCTSTR)strUserName, //本地USER名
(LPCTSTR)strPassword); //密码

if( schService ) //如果建立SERVICE成功
{
//修改描述
ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION ,NULL ); //释放SERVICE句柄,准备退出
CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

return bRet;
}

BOOL CNTService::AddConnection(CString strMachineName, CString strUserName, CString strPassword)
{
NETRESOURCE nr;
DWORD dwResult;

BOOL bReturn = TRUE;

LPTSTR pszMachineName = new char [256];
LPTSTR pszUserName = new char [256];
LPTSTR pszPassword = new char [256];

if (strMachineName.Left(2)!="\\\\")
strMachineName ="\\\\"+strMachineName;

strMachineName +="\\IPC$";

strcpy(pszMachineName,strMachineName);
strcpy(pszUserName,strUserName);
strcpy(pszPassword,strPassword);

nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = NULL;
nr.lpRemoteName = pszMachineName;
nr.lpProvider = NULL;

dwResult = WNetAddConnection2(&nr, pszPassword, pszUserName, FALSE);

delete [] pszMachineName ;
delete [] pszUserName ;
delete [] pszPassword ;

if(dwResult != NO_ERROR )
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
bReturn = FALSE;
}

return bReturn;
}

BOOL CNTService::RemoveConnection(CString strMachineName)
{
LPTSTR pszMachineName = new char [256];

if (strMachineName.Left(2)!="\\\\")
strMachineName ="\\\\"+strMachineName;

strMachineName += "\\IPC$";

strcpy(pszMachineName,strMachineName);

DWORD dwReturn;

dwReturn = WNetCancelConnection2(pszMachineName,CONNECT_UPDATE_PROFILE,TRUE);

delete [] pszMachineName;

if (dwReturn == NO_ERROR )
return TRUE;
else
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE;
}
}

BOOL CNTService::RemoveService(CString strMachineName,
CString strServiceName)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

SERVICE_STATUS m_ssServiceStatus ;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);
if( schSCManager ) // 如果打开SERVICE管理器成功
{
schService = OpenService( //获取SERVICE控制句柄的API
schSCManager, //SCM管理器句柄
(LPCTSTR)strServiceName, //SERVICE内部名称,控制名称
SERVICE_ALL_ACCESS); //打开的权限,删除就要全部权限

if( schService ) //如果获取SERVICE句柄成功
{
if( ControlService(schService, SERVICE_CONTROL_STOP, &m_ssServiceStatus) )
{
//直接向SERVICE发STOP命令,如果能够执行到这里,说明SERVICE正运行
//那就需要停止程序执行后才能删除
Sleep(3000) ; //等3秒使系统有时间执行STOP命令

while( QueryServiceStatus(schService, &m_ssServiceStatus) )
{ //循环检查SERVICE状态
if(m_ssServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
//如果SERVICE还正在执行(PENDING)停止任务
Sleep(1000) ; //那就等1秒钟后再检查SERVICE是否停止OK
}
else break ;//STOP命令处理完毕,跳出循环
}//循环检查SERVICE状态结束
if(m_ssServiceStatus.dwCurrentState != SERVICE_STOPPED)
{ //如果SERVICE接受STOP命令后还没有STOPPED
return FALSE; //那就返回FALSE报错,用GetLastError取错误代码
}
}
//删除指令在这里
if(! DeleteService(schService) ) //删除这个SERVICE
{
CloseServiceHandle(schService); //释放SERVICE控制句柄
return FALSE; //如果删除失败返回
}
else
CloseServiceHandle(schService); //释放SERVICE控制句柄
}
else //取SERVICE句柄不成功
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE; //获取SERVICE句柄失败,或没有找到SERVICE名字返回
}
CloseServiceHandle(schSCManager); //释放SCM管理器句柄
}
else //打开管理器不成功
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE; //打开管理器失败返回
}
return TRUE; //正常删除返回
}

BOOL CNTService::StartServer(CString strMachineName,CString strServiceName)
{
SERVICE_STATUS ssStatus;

DWORD dwOldCheckPoint;
DWORD dwStartTickCount;
DWORD dwWaitTime;

SC_HANDLE schSCManager;
SC_HANDLE schService;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if (schSCManager)
{
schService = OpenService(
schSCManager,
(LPCTSTR)strServiceName,
SERVICE_ALL_ACCESS);

if (schService)
{
if (!StartService(schService, 0, NULL) )
{
DWORD dwError = GetLastError();
if (dwError != ERROR_SERVICE_ALREADY_RUNNING)
{
DisplayErrorText (dwError);
bRet = FALSE;
}
}

if (!QueryServiceStatus( schService, &ssStatus) )
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;

while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
dwWaitTime = ssStatus.dwWaitHint / 10;

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

Sleep( dwWaitTime );

if (!QueryServiceStatus( schService, &ssStatus) )
break;

if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
break;
}
}

if (ssStatus.dwCurrentState == SERVICE_RUNNING) bRet = TRUE;

CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
bRet = FALSE;
}

return bRet;
}

BOOL CNTService::StopServer(CString strMachineName,CString strServiceName)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

SERVICE_STATUS m_ssServiceStatus ;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
schService = OpenService(
schSCManager,
(LPCTSTR)strServiceName,
SERVICE_ALL_ACCESS);

if( schService )
{
if( ControlService(schService, SERVICE_CONTROL_STOP, &m_ssServiceStatus) )
{
Sleep(3000) ;

while( QueryServiceStatus(schService, &m_ssServiceStatus) )
{
if(m_ssServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
Sleep(1000) ;
}
else break ;
}
if(m_ssServiceStatus.dwCurrentState != SERVICE_STOPPED)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
}
CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
return bRet;
}

BOOL CNTService::PauseServer(CString strMachineName,CString strServiceName)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

SERVICE_STATUS m_ssServiceStatus ;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
schService = OpenService(
schSCManager,
(LPCTSTR)strServiceName,
SERVICE_ALL_ACCESS);

if( schService )
{
if( ControlService(schService, SERVICE_CONTROL_PAUSE, &m_ssServiceStatus) )
{
Sleep(3000) ;

while( QueryServiceStatus(schService, &m_ssServiceStatus) )
{
if(m_ssServiceStatus.dwCurrentState == SERVICE_PAUSE_PENDING)
{
Sleep(1000) ;
}
else break ;
}
if(m_ssServiceStatus.dwCurrentState != SERVICE_PAUSED)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
}
CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
return bRet;
}

BOOL CNTService::SetServerStartType(CString strMachineName,
CString strServiceName,
DWORD dwStartType)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if (schSCManager == NULL)
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE;
}

schService = OpenService(
schSCManager, // SCManager database
(LPCTSTR)strServiceName, // name of service
SERVICE_CHANGE_CONFIG); // need CHANGE access

if (schService == NULL)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
CloseServiceHandle(schSCManager);
return FALSE;
}

if (dwStartType == 0)
dwStartType = SERVICE_AUTO_START;
else if (dwStartType == 1 )
dwStartType = SERVICE_BOOT_START;
else if (dwStartType == 2 )
dwStartType = SERVICE_DEMAND_START;
else if (dwStartType == 3 )
dwStartType = SERVICE_DISABLED;
else
dwStartType = SERVICE_SYSTEM_START;

if (! ChangeServiceConfig(
schService, // handle of service
SERVICE_NO_CHANGE, // service type: no change
dwStartType, // change service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL) ) // display name: no change
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);

return bRet;
}

CString CNTService::GetServiceName(CString strMachineName,
CString strServiceName,
BOOL bDisplayName)
{
SC_HANDLE schSCManager;

LPTSTR pszServiceName = new char [256];

DWORD dwLenBuffer = 256;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
BOOL bRet ;
if (bDisplayName)
{
bRet = GetServiceDisplayName(schSCManager,
(LPCTSTR)strServiceName,
pszServiceName,
&dwLenBuffer);
}
else
{
bRet = GetServiceKeyName(schSCManager,
(LPCTSTR)strServiceName,
pszServiceName,
&dwLenBuffer);
}

if (!bRet)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
}
CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
}

return pszServiceName;
}


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
shenhai79 2002-01-28
  • 打赏
  • 举报
回复
// NTService.cpp: implementation of the CNTService class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "NTService.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CNTService::CNTService()
{

}

CNTService::~CNTService()
{

}

void CNTService::DisplayErrorText(DWORD dwLastError)
{
HMODULE hModule = NULL;
LPSTR MessageBuffer;
DWORD dwBufferLength;

DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM ;

if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR)
{
hModule = LoadLibraryEx(
TEXT("netmsg.dll"),
NULL,
LOAD_LIBRARY_AS_DATAFILE
);

if(hModule != NULL)
dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE;
}

if(dwBufferLength = FormatMessageA(
dwFormatFlags,
hModule,
dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR) &MessageBuffer,
0,
NULL
))
{

AfxMessageBox(MessageBuffer);
LocalFree(MessageBuffer);
}

if(hModule != NULL)
FreeLibrary(hModule);
}

BOOL CNTService::InstallService(CString strMachineName,
CString strServiceName,
CString strServiceDisplayName,
CString strServicePathName,
CString strDependencies,
CString strUserName,
CString strPassword)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;


BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
schService = CreateService( //调用建立SERVICE的API
schSCManager, //SERVICE管理器数据库的句柄
(LPCTSTR)strServiceName, //服务名称
(LPCTSTR)strServiceDisplayName, //显示的名称
SERVICE_ALL_ACCESS, //希望得到的运行权限
SERVICE_WIN32_OWN_PROCESS, //SERVICE的类型
SERVICE_AUTO_START, //启动的方式
SERVICE_ERROR_NORMAL, //错误控制类型
(LPCTSTR)strServicePathName, //可执行文件的路径名
NULL, //一组服务装入时的顺序
NULL, //检查人标记
(LPCTSTR)strDependencies, //从属
(LPCTSTR)strUserName, //本地USER名
(LPCTSTR)strPassword); //密码

if( schService ) //如果建立SERVICE成功
{
//修改描述
ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION ,NULL ); //释放SERVICE句柄,准备退出
CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

return bRet;
}

BOOL CNTService::AddConnection(CString strMachineName, CString strUserName, CString strPassword)
{
NETRESOURCE nr;
DWORD dwResult;

BOOL bReturn = TRUE;

LPTSTR pszMachineName = new char [256];
LPTSTR pszUserName = new char [256];
LPTSTR pszPassword = new char [256];

if (strMachineName.Left(2)!="\\\\")
strMachineName ="\\\\"+strMachineName;

strMachineName +="\\IPC$";

strcpy(pszMachineName,strMachineName);
strcpy(pszUserName,strUserName);
strcpy(pszPassword,strPassword);

nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = NULL;
nr.lpRemoteName = pszMachineName;
nr.lpProvider = NULL;

dwResult = WNetAddConnection2(&nr, pszPassword, pszUserName, FALSE);

delete [] pszMachineName ;
delete [] pszUserName ;
delete [] pszPassword ;

if(dwResult != NO_ERROR )
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
bReturn = FALSE;
}

return bReturn;
}

BOOL CNTService::RemoveConnection(CString strMachineName)
{
LPTSTR pszMachineName = new char [256];

if (strMachineName.Left(2)!="\\\\")
strMachineName ="\\\\"+strMachineName;

strMachineName += "\\IPC$";

strcpy(pszMachineName,strMachineName);

DWORD dwReturn;

dwReturn = WNetCancelConnection2(pszMachineName,CONNECT_UPDATE_PROFILE,TRUE);

delete [] pszMachineName;

if (dwReturn == NO_ERROR )
return TRUE;
else
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE;
}
}

BOOL CNTService::RemoveService(CString strMachineName,
CString strServiceName)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

SERVICE_STATUS m_ssServiceStatus ;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);
if( schSCManager ) // 如果打开SERVICE管理器成功
{
schService = OpenService( //获取SERVICE控制句柄的API
schSCManager, //SCM管理器句柄
(LPCTSTR)strServiceName, //SERVICE内部名称,控制名称
SERVICE_ALL_ACCESS); //打开的权限,删除就要全部权限

if( schService ) //如果获取SERVICE句柄成功
{
if( ControlService(schService, SERVICE_CONTROL_STOP, &m_ssServiceStatus) )
{
//直接向SERVICE发STOP命令,如果能够执行到这里,说明SERVICE正运行
//那就需要停止程序执行后才能删除
Sleep(3000) ; //等3秒使系统有时间执行STOP命令

while( QueryServiceStatus(schService, &m_ssServiceStatus) )
{ //循环检查SERVICE状态
if(m_ssServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
//如果SERVICE还正在执行(PENDING)停止任务
Sleep(1000) ; //那就等1秒钟后再检查SERVICE是否停止OK
}
else break ;//STOP命令处理完毕,跳出循环
}//循环检查SERVICE状态结束
if(m_ssServiceStatus.dwCurrentState != SERVICE_STOPPED)
{ //如果SERVICE接受STOP命令后还没有STOPPED
return FALSE; //那就返回FALSE报错,用GetLastError取错误代码
}
}
//删除指令在这里
if(! DeleteService(schService) ) //删除这个SERVICE
{
CloseServiceHandle(schService); //释放SERVICE控制句柄
return FALSE; //如果删除失败返回
}
else
CloseServiceHandle(schService); //释放SERVICE控制句柄
}
else //取SERVICE句柄不成功
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE; //获取SERVICE句柄失败,或没有找到SERVICE名字返回
}
CloseServiceHandle(schSCManager); //释放SCM管理器句柄
}
else //打开管理器不成功
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE; //打开管理器失败返回
}
return TRUE; //正常删除返回
}

BOOL CNTService::StartServer(CString strMachineName,CString strServiceName)
{
SERVICE_STATUS ssStatus;

DWORD dwOldCheckPoint;
DWORD dwStartTickCount;
DWORD dwWaitTime;

SC_HANDLE schSCManager;
SC_HANDLE schService;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if (schSCManager)
{
schService = OpenService(
schSCManager,
(LPCTSTR)strServiceName,
SERVICE_ALL_ACCESS);

if (schService)
{
if (!StartService(schService, 0, NULL) )
{
DWORD dwError = GetLastError();
if (dwError != ERROR_SERVICE_ALREADY_RUNNING)
{
DisplayErrorText (dwError);
bRet = FALSE;
}
}

if (!QueryServiceStatus( schService, &ssStatus) )
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;

while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
{
dwWaitTime = ssStatus.dwWaitHint / 10;

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

Sleep( dwWaitTime );

if (!QueryServiceStatus( schService, &ssStatus) )
break;

if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
{
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
}
else
{
if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
break;
}
}

if (ssStatus.dwCurrentState == SERVICE_RUNNING) bRet = TRUE;

CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
bRet = FALSE;
}

return bRet;
}

BOOL CNTService::StopServer(CString strMachineName,CString strServiceName)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

SERVICE_STATUS m_ssServiceStatus ;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
schService = OpenService(
schSCManager,
(LPCTSTR)strServiceName,
SERVICE_ALL_ACCESS);

if( schService )
{
if( ControlService(schService, SERVICE_CONTROL_STOP, &m_ssServiceStatus) )
{
Sleep(3000) ;

while( QueryServiceStatus(schService, &m_ssServiceStatus) )
{
if(m_ssServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
{
Sleep(1000) ;
}
else break ;
}
if(m_ssServiceStatus.dwCurrentState != SERVICE_STOPPED)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
}
CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
return bRet;
}

BOOL CNTService::PauseServer(CString strMachineName,CString strServiceName)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

SERVICE_STATUS m_ssServiceStatus ;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
schService = OpenService(
schSCManager,
(LPCTSTR)strServiceName,
SERVICE_ALL_ACCESS);

if( schService )
{
if( ControlService(schService, SERVICE_CONTROL_PAUSE, &m_ssServiceStatus) )
{
Sleep(3000) ;

while( QueryServiceStatus(schService, &m_ssServiceStatus) )
{
if(m_ssServiceStatus.dwCurrentState == SERVICE_PAUSE_PENDING)
{
Sleep(1000) ;
}
else break ;
}
if(m_ssServiceStatus.dwCurrentState != SERVICE_PAUSED)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
}
CloseServiceHandle(schService);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}
return bRet;
}

BOOL CNTService::SetServerStartType(CString strMachineName,
CString strServiceName,
DWORD dwStartType)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;

BOOL bRet = TRUE;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if (schSCManager == NULL)
{
DWORD dwError = GetLastError();
DisplayErrorText(dwError);
return FALSE;
}

schService = OpenService(
schSCManager, // SCManager database
(LPCTSTR)strServiceName, // name of service
SERVICE_CHANGE_CONFIG); // need CHANGE access

if (schService == NULL)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
CloseServiceHandle(schSCManager);
return FALSE;
}

if (dwStartType == 0)
dwStartType = SERVICE_AUTO_START;
else if (dwStartType == 1 )
dwStartType = SERVICE_BOOT_START;
else if (dwStartType == 2 )
dwStartType = SERVICE_DEMAND_START;
else if (dwStartType == 3 )
dwStartType = SERVICE_DISABLED;
else
dwStartType = SERVICE_SYSTEM_START;

if (! ChangeServiceConfig(
schService, // handle of service
SERVICE_NO_CHANGE, // service type: no change
dwStartType, // change service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL) ) // display name: no change
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
bRet = FALSE;
}

CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);

return bRet;
}

CString CNTService::GetServiceName(CString strMachineName,
CString strServiceName,
BOOL bDisplayName)
{
SC_HANDLE schSCManager;

LPTSTR pszServiceName = new char [256];

DWORD dwLenBuffer = 256;

schSCManager = OpenSCManager(
(LPCTSTR)strMachineName,
SERVICES_ACTIVE_DATABASE,
SC_MANAGER_CREATE_SERVICE
);

if( schSCManager )
{
BOOL bRet ;
if (bDisplayName)
{
bRet = GetServiceDisplayName(schSCManager,
(LPCTSTR)strServiceName,
pszServiceName,
&dwLenBuffer);
}
else
{
bRet = GetServiceKeyName(schSCManager,
(LPCTSTR)strServiceName,
pszServiceName,
&dwLenBuffer);
}

if (!bRet)
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
}
CloseServiceHandle(schSCManager);
}
else
{
DWORD dwError = GetLastError();
DisplayErrorText (dwError);
}

return pszServiceName;
}
bskay 2002-01-28
  • 打赏
  • 举报
回复
用service管理的函数
open什么什么的得到handle
在opensevice什么什么的
得到hService

然后就为所欲为了



theng 2002-01-28
  • 打赏
  • 举报
回复
调用命令行,大概是 netstart w3svc ....
kingkingxy 2002-01-28
  • 打赏
  • 举报
回复
不懂

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧