windows 服务管理

1、创建MFC工程---》WindowsServer---》基于对话框---》成功如下:

2、添加控件

3、添加代码:

初始化代码:

    m_List.InsertColumn(0, _T("服务名称"), LVCFMT_LEFT, 100, -1);
	m_List.InsertColumn(1, _T("显示名称"), LVCFMT_LEFT, 100, -1);
	m_List.InsertColumn(2, _T("启动状态"), LVCFMT_LEFT, 100, -1);
	m_List.InsertColumn(3, _T("启动类别"), LVCFMT_LEFT, 100, -1);
	m_List.InsertColumn(4, _T("程序路径"), LVCFMT_LEFT, 240, -1);

	m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT);
	CEnumServer();

函数公共功能代码: 

void CWindowsServerDlg::CEnumServer()
{
	// TODO: 在此处添加实现代码.
	m_List.DeleteAllItems();
	UpdateData(false);


	LPQUERY_SERVICE_CONFIG ServicesInfo = NULL;
	LPENUM_SERVICE_STATUS lpServices = NULL;

	DWORD    nSize = 0;
	DWORD    n;
	DWORD    nResumeHandle = 0;
	DWORD	 dwServiceType = SERVICE_WIN32;

	SC_HANDLE schSCManager = NULL;
	BOOL     Flag = FALSE;


	//与服务管理建立连接,就是打开服务管理
	if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL)
	{
		MessageBox(_T("请使用管理员权限!!!"));
		return;
	}
	//分配用于装载枚举服务信息的缓冲区
	lpServices = (LPENUM_SERVICE_STATUS)LocalAlloc(LPTR, 8 * 1024);        // Allocate Ram 
																		   //枚举服务
	EnumServicesStatus(schSCManager,
		dwServiceType,
		SERVICE_STATE_ALL,
		(LPENUM_SERVICE_STATUS)lpServices,
		8 * 1024,
		&nSize,
		&n,
		&nResumeHandle);

	//穷举每一个服务的信息,注意这里的n是EnumServicesStatus 的返回值用于保存有多少个服务
	for (unsigned long i = 0; i < n; i++)
	{
		SC_HANDLE service = NULL;
		DWORD     nResumeHandle = 0;

		//打开枚举到的服务服务
		service = OpenService(schSCManager, lpServices[i].lpServiceName, SERVICE_ALL_ACCESS);
		DWORD d = GetLastError();
		//如果打开服务失败就返回
		if (d == ERROR_ACCESS_DENIED || d == ERROR_INVALID_HANDLE || d == ERROR_INVALID_NAME || d == ERROR_SERVICE_DOES_NOT_EXIST) {
			int i = 0;
			i++;
		}
		//
		ServicesInfo = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 8 * 1024);        // Allocate Ram 
		memset(ServicesInfo, 0, 8 * 1024);
		*ServicesInfo;
		//检索服务的配置参数,就是是否已经启动,是否自动启动,服务文件路径一些信息
		if (QueryServiceConfig(service, ServicesInfo, 8 * 1024, &nResumeHandle) == ERROR_ACCESS_DENIED) {
			int i = 0;
			i++;
		}
		*ServicesInfo;
		//写入服务名
		int nitem = m_List.InsertItem(0, lpServices[i].lpServiceName);
		//服务显示名称
		m_List.SetItemText(nitem, 1, lpServices[i].lpDisplayName);
		//服务启动状态
		if (lpServices[i].ServiceStatus.dwCurrentState != SERVICE_STOPPED)
		{
			m_List.SetItemText(nitem, 2, _T("已启动"));
		}
		else {
			m_List.SetItemText(nitem, 2, _T("未启动"));
		}

		//服务启动类型
		if (2 == ServicesInfo->dwStartType)
		{
			m_List.SetItemText(nitem, 3, _T("自 动"));
		}
		if (3 == ServicesInfo->dwStartType)
		{
			m_List.SetItemText(nitem, 3, _T("手 动"));
		}
		if (4 == ServicesInfo->dwStartType)
		{
			m_List.SetItemText(nitem, 3, _T("禁 止"));
		}
		//服务路径
		m_List.SetItemText(nitem, 4, ServicesInfo->lpBinaryPathName);

		//UpdateData(false);
		LocalFree(ServicesInfo);
	}
	LocalFree(lpServices);
	return;
}

void CWindowsServerDlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	CMenu popMenu;
	VERIFY(popMenu.LoadMenu(IDR_MENU1));
	CMenu *p = popMenu.GetSubMenu(0);
	ASSERT(p != NULL);
	CPoint	point;
	GetCursorPos(&point);
	p->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, AfxGetMainWnd());
	*pResult = 0;
}

void CWindowsServerDlg::OnAutoserver()
{
	// TODO: 在此添加命令处理程序代码
	char ServerName[100];

	int x = m_List.GetSelectionMark();
	m_List.GetItemText(x,0, LPTSTR(ServerName),100);


	SC_HANDLE scm;
	SC_HANDLE service;


	if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL)
	{
		MessageBox(_T("OpenSCManager Error\n"));
	}

	service = OpenService(scm,LPCWSTR(ServerName), SERVICE_ALL_ACCESS);

	if (!service)
	{
		MessageBox(_T("OpenService error!\n"));
	}




	DWORD  dwStartType;
	// Need to acquire database lock before reconfiguring. 

	// The database is locked, so it is safe to make changes. 

	dwStartType = SERVICE_AUTO_START;

	if (!ChangeServiceConfig(
		service,        // 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))				//displayname 
	{
		MessageBox(_T("ChangeServiceConfig error!\n"));
	}
	else
		MessageBox(_T("设置成功!方式为 自动 \n"));


	// Close the handle to the service. 

	CloseServiceHandle(service);
}

void CWindowsServerDlg::OnSelfserver()
{
	// TODO: 在此添加命令处理程序代码
	char ServerName[100] = " ";

	int x = m_List.GetSelectionMark();
	m_List.GetItemText(x, 0, LPTSTR(ServerName), 100);


	SC_HANDLE scm;
	SC_HANDLE service;


	if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL)
	{
		MessageBox(_T("OpenSCManager Error\n"));
	}

	service = OpenService(scm, LPCWSTR(ServerName), SERVICE_ALL_ACCESS);

	if (!service)
	{
		MessageBox(_T("OpenService error!\n"));
	}

	DWORD  dwStartType;
	// Need to acquire database lock before reconfiguring. 



	dwStartType = SERVICE_DEMAND_START;

	if (!ChangeServiceConfig(
		service,        // 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))				//displayname 
	{
		MessageBox(_T("ChangeServiceConfig error!\n"));
	}
	else
		MessageBox(_T("设置成功!方式为 手动\n"));


	// Close the handle to the service. 

	CloseServiceHandle(service);
}

void CWindowsServerDlg::OnStartserver()
{
	// TODO: 在此添加命令处理程序代码
	char ServerName[100];

	int x = m_List.GetSelectionMark();
	m_List.GetItemText(x, 0, LPTSTR(ServerName), 100);



	SC_HANDLE scm;
	SC_HANDLE service;
	SERVICE_STATUS status;


	if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL)
	{
		MessageBox(_T("OpenSCManager Error\n"));
	}

	service = OpenService(scm, LPCWSTR(ServerName), SERVICE_ALL_ACCESS);

	if (!service)
	{
		MessageBox(_T("OpenService error!\n"));
	}

	BOOL isSuccess = QueryServiceStatus(service, &status);
	if (!isSuccess)
	{
		MessageBox(_T("QueryServiceStatus error!\n"));
	}

	if (status.dwCurrentState == SERVICE_STOPPED)
	{
		isSuccess = ::StartService(service, NULL, NULL);

		if (!isSuccess)
		{
			MessageBox(_T("启动服务失败!"));
		}
		else
		{
			MessageBox(_T("启动服务成功!"));
		}
	}
	else
	{
		MessageBox(_T("服务以经启动!"));
	}

	CloseServiceHandle(service);
	CloseServiceHandle(scm);
}

void CWindowsServerDlg::OnStopserver()
{
	// TODO: 在此添加命令处理程序代码
	char ServerName[100];

	int x = m_List.GetSelectionMark();
	m_List.GetItemText(x, 0, LPTSTR(ServerName), 100);

	SC_HANDLE scm;
	SC_HANDLE service;
	SERVICE_STATUS status;

	if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL)
	{
		MessageBox(_T("OpenSCManager Error\n"));
	}

	service = OpenService(scm, LPCWSTR(ServerName), SERVICE_ALL_ACCESS);

	if (!service)
	{
		MessageBox(_T("OpenService error!\n"));
	}

	BOOL isSuccess = QueryServiceStatus(service, &status);
	if (!isSuccess)
	{
		MessageBox(_T("QueryServiceStatus error!\n"));
	}

	if (status.dwCurrentState != SERVICE_STOPPED)
	{

		isSuccess = ControlService(service, SERVICE_CONTROL_STOP, &status);
		if (!isSuccess)
		{
			MessageBox(_T("停止服务失败!"));
		}
		else
		{
			MessageBox(_T("停止服务成功!"));
		}
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值