bog*_*dan 16 c++ windows-services
我正在编写一个能够作为服务或独立运行的应用程序,但我想检测应用程序是作为服务执行还是作为普通用户会话执行.
小智 10
如果这是一个C++应用程序,在启动代码中的某个地方,您必须调用StartServiceCtrlDispatcher.如果失败并GetLastError()
返回ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
,则该应用程序尚未作为服务启动.
另一种选择是使用System.Environment.UserInteractive http://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx
更新:为了弥补发布C++主题的.NET答案,我提供了基于.NET实现的C实现.
BOOL IsUserInteractive()
{
BOOL bIsUserInteractive = TRUE;
HWINSTA hWinStation = GetProcessWindowStation();
if (hWinStation != NULL)
{
USEROBJECTFLAGS uof = {0};
if (GetUserObjectInformation(hWinStation, UOI_FLAGS, &uof, sizeof(USEROBJECTFLAGS), NULL) && ((uof.dwFlags & WSF_VISIBLE) == 0))
{
bIsUserInteractive = FALSE;
}
}
return bIsUserInteractive;
}
Run Code Online (Sandbox Code Playgroud)
我认为您可以在Interactive组中查询进程令牌以获取成员资格.
来自http://support.microsoft.com/kb/243330:
SID:S-1-5-4
名称:互动
描述:包含以交互方式登录的所有用户的组.成员资格由操作系统控制.
使用TokenGroups调用GetTokenInformation以获取与运行该进程的帐户关联的组,然后迭代查找Interactive sid的sid.
我在http://marc.info/?l=openssl-dev&m=104401851331452&w=2找到了一大堆代码
归档时间: |
|
查看次数: |
10585 次 |
最近记录: |