服务管理器
界面如下:
主要代码如下:
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