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("停止服务成功!"));
}
}
}