如何使用 WinAPI 函数检查当前进程是否为 运行 as Windows 服务?
How to check that the current process is running as Windows Service using WinAPI functions?
我有一个程序可以 运行 作为一个简单的控制台应用程序或可以注册为 Windows 服务。我想在 main()
函数中检测当前 运行ning 上下文:
#include <windows.h>
BOOL IsWindowsService()
{
???
}
int main(int argc, char** argv)
{
if (IsWindowsService())
{
// Running as Windows Service...
RunService();
return;
}
// Running as console application...
return 0;
}
主要用例是拥有一个可以安装的 exe 文件,并且 运行 作为 Windows 带有“--install”和“--start”参数的服务或执行在控制台模式下没有任何参数(例如来自 VS 调试器)。
你能帮助我实现 IsWindowsService()
功能吗?
int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
{
SERVICE_TABLE_ENTRY ServiceTable[] =
{
{ SERVICE_NAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL,NULL }
};
if (StartServiceCtrlDispatcher(ServiceTable))
//service
else app; // last error ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
}
VOID WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{...}
文档https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-startservicectrldispatchera
您可以使用system()函数。它将在命令提示符下执行任何可以 运行 的命令。像这样使用它:
system("tasklist > tasks.txt");
这会将所有 运行ning 任务存储到 tasks.txt。然后你可以通过在文件中搜索它来检查你的程序是否运行ning。
有关 任务列表、运行 命令提示符的更多信息,请执行此命令:
tasklist /?
看来我找到了一个不需要提供特殊命令行参数来处理的问题的优雅解决方案(@RbMn 提供的解决方案):
BOOL IsWindowsService()
{
DWORD sessionId = 0;
ProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
return !sessionId;
}
此解决方案有效,因为 all Windows Services run in Session 0 along with applications。
我有一个程序可以 运行 作为一个简单的控制台应用程序或可以注册为 Windows 服务。我想在 main()
函数中检测当前 运行ning 上下文:
#include <windows.h>
BOOL IsWindowsService()
{
???
}
int main(int argc, char** argv)
{
if (IsWindowsService())
{
// Running as Windows Service...
RunService();
return;
}
// Running as console application...
return 0;
}
主要用例是拥有一个可以安装的 exe 文件,并且 运行 作为 Windows 带有“--install”和“--start”参数的服务或执行在控制台模式下没有任何参数(例如来自 VS 调试器)。
你能帮助我实现 IsWindowsService()
功能吗?
int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
{
SERVICE_TABLE_ENTRY ServiceTable[] =
{
{ SERVICE_NAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL,NULL }
};
if (StartServiceCtrlDispatcher(ServiceTable))
//service
else app; // last error ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
}
VOID WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{...}
文档https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-startservicectrldispatchera
您可以使用system()函数。它将在命令提示符下执行任何可以 运行 的命令。像这样使用它:
system("tasklist > tasks.txt");
这会将所有 运行ning 任务存储到 tasks.txt。然后你可以通过在文件中搜索它来检查你的程序是否运行ning。
有关 任务列表、运行 命令提示符的更多信息,请执行此命令:
tasklist /?
看来我找到了一个不需要提供特殊命令行参数来处理的问题的优雅解决方案(@RbMn 提供的解决方案):
BOOL IsWindowsService()
{
DWORD sessionId = 0;
ProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
return !sessionId;
}
此解决方案有效,因为 all Windows Services run in Session 0 along with applications。