服务管理器

界面如下:

主要代码如下:

  1 void CServiceManagerDlg::InitServicesList(void)
  2 {
  3     CRect Rect;
  4     m_ListServices.GetClientRect(&Rect);
  5     m_ListServices.SetExtendedStyle(m_ListServices.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  6     m_ListServices.InsertColumn(0, _T("序号"));
  7     m_ListServices.InsertColumn(1, _T("服务名"));
  8     m_ListServices.InsertColumn(2, _T("显示名"));
  9     m_ListServices.InsertColumn(3, _T("状态"));
 10     m_ListServices.SetColumnWidth(0, Rect.Width() / 10);
 11     m_ListServices.SetColumnWidth(1, 3 * Rect.Width() / 10);
 12     m_ListServices.SetColumnWidth(2, 5 * Rect.Width() / 10);
 13     m_ListServices.SetColumnWidth(3, Rect.Width() / 10);
 14 }
 15 
 16 void CServiceManagerDlg::ShowServicesList(void)
 17 {
 18     m_ListServices.DeleteAllItems();
 19 
 20     SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 21     if (NULL == hSCM)
 22     {
 23         AfxMessageBox(_T("OpenSCManager Error!"));
 24         return;
 25     }
 26 
 27     DWORD dwServiceType = 0;
 28     if (m_bApplication)
 29     {
 30         dwServiceType = SERVICE_DRIVER;
 31     }
 32     else
 33     {
 34         dwServiceType = SERVICE_WIN32;
 35     }
 36 
 37     DWORD dwBufSize = 1024 * sizeof(ENUM_SERVICE_STATUS);
 38     DWORD dwByteNeeded, dwServicesReturned, lpResumeHandle = 0;
 39     ENUM_SERVICE_STATUS SerStatus[1024] = {0};
 40     BOOL bRet = EnumServicesStatus(hSCM, dwServiceType, SERVICE_STATE_ALL, SerStatus, dwBufSize, &dwByteNeeded, &dwServicesReturned, &lpResumeHandle);
 41     //DWORD dwErr = GetLastError();
 42     if (FALSE == bRet)
 43     {
 44         AfxMessageBox(_T("EnumServiceStatus Error"));
 45         CloseServiceHandle(hSCM);
 46         return;
 47     }
 48 
 49     for (DWORD i = 0; i < dwServicesReturned; i++)
 50     {
 51         CString str;
 52         str.Format(_T("%d"), i);
 53         m_ListServices.InsertItem(i, str);
 54         m_ListServices.SetItemText(i, 1, SerStatus[i].lpServiceName);
 55         m_ListServices.SetItemText(i, 2, SerStatus[i].lpDisplayName);
 56         switch (SerStatus[i].ServiceStatus.dwCurrentState)
 57         {
 58         case SERVICE_PAUSED:
 59             m_ListServices.SetItemText(i, 3, _T("暂停"));
 60             break;
 61         case SERVICE_STOPPED:
 62             m_ListServices.SetItemText(i, 3, _T("停止"));
 63             break;
 64         case SERVICE_RUNNING:
 65             m_ListServices.SetItemText(i, 3, _T("运行"));
 66             break;
 67         default:
 68             m_ListServices.SetItemText(i, 3, _T("其他"));
 69             break;
 70         }
 71     }
 72     CloseServiceHandle(hSCM);
 73 }
 74 
 75 void CServiceManagerDlg::OnBnClickedRadioApplication()
 76 {
 77     // TODO: 在此添加控件通知处理程序代码
 78     UpdateData(TRUE);
 79     DebugPrivilege();
 80     ShowServicesList();
 81 }
 82 
 83 void CServiceManagerDlg::OnBnClickedRadioDriver()
 84 {
 85     // TODO: 在此添加控件通知处理程序代码
 86     UpdateData(TRUE);
 87     DebugPrivilege();
 88     ShowServicesList();
 89 }
 90 
 91 void CServiceManagerDlg::OnBnClickedButtonStart()
 92 {
 93     // TODO: 在此添加控件通知处理程序代码
 94     POSITION pos = m_ListServices.GetFirstSelectedItemPosition();
 95     int nSelected = -1;
 96 
 97     while (pos)
 98     {
 99         nSelected = m_ListServices.GetNextSelectedItem(pos);
100     }
101 
102     if (-1 == nSelected)
103     {
104         AfxMessageBox(_T("请选择要启动的服务项"));
105         return;
106     }
107 
108     TCHAR szServiceName[MAXBYTE] = {0};
109     m_ListServices.GetItemText(nSelected, 1, szServiceName, MAXBYTE);
110     //AfxMessageBox(szServiceName);
111 
112     SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
113     if (NULL == hSCM)
114     {
115         AfxMessageBox(_T("OpenSCManager Error"));
116         return;
117     }
118 
119     SC_HANDLE hSCService = OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);
120 
121     BOOL bRet = StartService(hSCService, 0, NULL);
122     if (TRUE == bRet)
123     {
124         m_ListServices.SetItemText(nSelected, 3, _T("运行"));
125     }
126     else
127     {
128         DWORD dwErr = GetLastError();
129     }
130 
131     CloseServiceHandle(hSCService);
132     CloseServiceHandle(hSCM);
133 }
134 
135 void CServiceManagerDlg::OnBnClickedButtonStop()
136 {
137     // TODO: 在此添加控件通知处理程序代码
138     POSITION pos = m_ListServices.GetFirstSelectedItemPosition();
139     int nSelected = -1;
140 
141     while (pos)
142     {
143         nSelected = m_ListServices.GetNextSelectedItem(pos);
144     }
145 
146     if (-1 == nSelected)
147     {
148         AfxMessageBox(_T("请选择要停止的服务项"));
149         return;
150     }
151 
152     TCHAR szServiceName[MAXBYTE] = {0};
153     m_ListServices.GetItemText(nSelected, 1, szServiceName, MAXBYTE);
154     //AfxMessageBox(szServiceName);
155 
156     SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
157     if (NULL == hSCM)
158     {
159         AfxMessageBox(_T("OpenSCManager Error"));
160         return;
161     }
162 
163     SC_HANDLE hSCService = OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);
164     SERVICE_STATUS ServiceStatus;
165     BOOL bRet = ControlService(hSCService, SERVICE_CONTROL_STOP, &ServiceStatus);
166     if (TRUE == bRet)
167     {
168         m_ListServices.SetItemText(nSelected, 3, _T("停止"));
169     }
170     else
171     {
172         DWORD dwErr = GetLastError();
173     }
174 
175     CloseServiceHandle(hSCService);
176     CloseServiceHandle(hSCM);
177 }
178 
179 void CServiceManagerDlg::OnBnClickedButtonExit()
180 {
181     // TODO: 在此添加控件通知处理程序代码
182     OnOK();
183 }
184 
185 void CServiceManagerDlg::DebugPrivilege(void)
186 {
187     HANDLE hToken = NULL;
188     BOOL bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
189     if (TRUE == bRet)
190     {
191         TOKEN_PRIVILEGES tp;
192         tp.PrivilegeCount = 1;
193         LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
194         tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
195         AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
196 
197         CloseHandle(hToken);
198     }
199 }

下载地址:

http://pan.baidu.com/s/1jGE5na2

原文地址:https://www.cnblogs.com/qiyueliuguang/p/3544137.html