Windows 服务程序获取是否登录 以及用户名是什么
时间: 2024-03-08 14:49:08 浏览: 29
在 Windows 服务程序中,可以通过调用 Windows API 来获取当前是否有用户登录,以及当前登录用户的用户名。以下是获取信息的示例代码:
```cpp
#include <Windows.h>
#include <TlHelp32.h>
BOOL IsUserLoggedOn()
{
// 获取当前登录会话的 ID
DWORD session_id = WTSGetActiveConsoleSessionId();
// 获取进程快照
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// 遍历进程列表,查找 explorer.exe 进程
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(snapshot, &pe);
while (bRet)
{
if (_tcsicmp(pe.szExeFile, _T("explorer.exe")) == 0)
{
// 获取 explorer.exe 进程所属的登录会话 ID
DWORD explorer_session_id;
WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, pe.th32ProcessID, WTSConnectState, (LPTSTR*)&explorer_session_id, NULL);
// 如果与当前登录会话 ID 相同,则表示有用户登录
if (explorer_session_id == session_id)
{
CloseHandle(snapshot);
return TRUE;
}
}
bRet = Process32Next(snapshot, &pe);
}
CloseHandle(snapshot);
return FALSE;
}
BOOL GetLoggedOnUserName(LPTSTR szUserName, DWORD* pdwSize)
{
// 获取当前登录会话的 ID
DWORD session_id = WTSGetActiveConsoleSessionId();
// 获取当前登录会话的用户名
WCHAR* pUserName;
DWORD dwSize;
if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session_id, WTSUserName, &pUserName, &dwSize))
{
wcsncpy_s(szUserName, *pdwSize, pUserName, dwSize);
*pdwSize = dwSize;
WTSFreeMemory(pUserName);
return TRUE;
}
return FALSE;
}
```
`IsUserLoggedOn()` 函数用于检查当前是否有用户登录。该函数遍历进程列表,查找 explorer.exe 进程,并获取该进程所属的登录会话 ID。如果该 ID 与当前登录会话的 ID 相同,则表示有用户登录。
`GetLoggedOnUserName()` 函数用于获取当前登录用户的用户名。该函数调用 `WTSQuerySessionInformation` API 来获取当前登录会话的用户名。如果获取成功,则将用户名复制到 `szUserName` 缓冲区中,并将缓冲区大小更新为用户名长度。