Windows 10下的Windows服务安装/卸载
Windows services installation / uninstallation in Windows 10
我有一个应用程序,在C++
中,它试图在运行时(此时,没有其他相关进程正在运行)安装几个服务。
工作流程是,如果服务存在,那么它们被卸载,否则它们被卸载然后重新安装。
我遵循了一些教程,如:安装服务
不幸的是,在安装或卸载时似乎出了问题。
假设服务没有安装,当我继续安装服务时,它们被安装,然后我尝试更改配置,延迟自动启动。
在这个阶段,虽然服务已经安装,但我无法启动它们,因为我得到的错误说服务无法找到。
当我尝试卸载服务时,卸载失败,给出一个错误1060,说服务被标记为删除。
SC_HANDLE schSCManager;
SC_HANDLE schService;
schSCManager = OpenSCManager(
NULL, // local computer
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (schSCManager == nullptr)
{
continue;
}
if (bInstall)
{
schService = CreateService(
schSCManager, // SCM database
szServiceName, // name of service
szDisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
szDirectory, // path to service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService == NULL)
{
TraceAdvice(L"CreateService failed (%d)n", GetLastError());
CloseServiceHandle(schSCManager);
continue;
}
else
{
if (!ChangeServiceConfig(
schService, // handle of service
SERVICE_NO_CHANGE, // service type: no change
SERVICE_CONFIG_DELAYED_AUTO_START_INFO, // 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)) // display name: no change
{
TraceAdvice(L"ChangeServiceConfig failed (%d)n", GetLastError());
}
TraceAdvice(L"Service installed successfullyn");
}
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
/*TraceFatal(_T("Now installing : %s"), szServiceName);
_stprintf_s(szTmp, _T("SC create %s binpath= "%s%s.exe" displayName= "%s" start= delayed-auto"), szServiceName, szDirectory, szServiceName, szDisplayName);
TraceFatal(_T("Command is : %s"), szTmp);*/
}
else
{
_wsystem(_T("taskkill /F /IM mmc.exe")); // Need to kill any instance of MMC running
_wsystem(_T("taskkill /F /IM procexp.exe"));
schService = OpenService(
schSCManager, // SCM database
szServiceName, // name of service
DELETE); // need delete access
if (schService == NULL)
{
TraceAdvice(L"OpenService failed (%d)n", GetLastError());
CloseServiceHandle(schSCManager);
continue;
}
DWORD dwBytesNeeded;
SERVICE_STATUS_PROCESS ssp;
if (!QueryServiceStatusEx(
schService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ssp,
sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded))
{
printf("QueryServiceStatusEx failed (%d)n", GetLastError());
}
if (ssp.dwCurrentState == SERVICE_RUNNING)
{
_stprintf_s(szTmp, _T("taskkill /F /IM %s.exe"), szServiceName);
_wsystem(szTmp);
}
// Delete the service.
if (!DeleteService(schService))
{
TraceAdvice(L"DeleteService failed (%d)n", GetLastError());
}
else TraceAdvice(L"Service deleted successfullyn");
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}
}
我确定了所有的点,即
- 任务管理器已关闭
- 服务控制台关闭。
- 所有MMC实例被关闭。
- 服务已停止
但是它没有用。直到我重新启动系统(删除链接到该服务的注册表也不起作用),该服务才被卸载。
我已经检查了传递给这些函数的参数,它们似乎是正确的。
我还应该检查什么,以确保正确安装或成功卸载?
您需要先停止服务,否则它会卡在这个挂起的删除状态。强制终止服务与停止服务是两码事。从文档的同一区域,您需要ControlService(SERVICE_CONTROL_STOP)
.
相关文章:
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 无法使用加载库卸载注入的 dll (C++)
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 如何根据 DLL 端的请求卸载 DLL 模块以卸载它?
- 通知 Windows 系统应用程序字体已被卸载/删除
- 如何从目标进程卸载 DLL?
- 用于 OpenMP 4.5 卸载到 (GPU) 设备的 NVPTX GCC (9.0.0/trunk) 找不到 libg
- 卸载共享对象(.so 文件)在 C++ 中用 dlopen() 打开
- 按名称问题获取卸载应用程序路径
- 英特尔C++编译器 19.0 测试版中删除了对英特尔®图形技术的卸载支持
- libcoi_device.so.0 未找到英特尔 19.0.4 OpenMP 5.0 卸载编译错误
- OpenMP卸载到Nvidia错误还原
- 如何正确卸载DLL本身
- Windows 7 64位,Qt 4:glGetVersion 返回 "1.1.0",nvogl32v.dll 被卸载
- Windows 10下的Windows服务安装/卸载
- 检测应用程序何时在Windows中被卸载
- 无法以编程方式卸载 Windows CE 中的字体