关于Windows Service中读取HKEY_CURRENT_USER中键值的问题
各位大哥,小弟最近在研究Windows Service中读取HKEY_CURRENT_USER中键值的问题。按照msdn的说法,我做了以下的代码:
DWORD GetActiveConsoleSessionId()
{
DWORD dwConsoleSessionId = 0xFFFFFFFF;
dwConsoleSessionId = WTSGetActiveConsoleSessionId();
if(dwConsoleSessionId == 0xFFFFFFFF)
{
}else
{
}
return dwConsoleSessionId;
}
Void GetCurrentToken(HANDLE& hToken)
{
BOOL bRet = TRUE;
HANDLE hUserToken = NULL;
HANDLE hDupUserToken = NULL;
DWORD dwActiveSid = GetActiveConsoleSessionId();
BOOL BRet_WTSQueryUserToken = WTSQueryUserToken(dwActiveSid, &hUserToken);
if (BRet_WTSQueryUserToken == FALSE)
{
hToken = NULL;
return FALSE;
}
BOOL BRet_DuplicateToken = DuplicateToken(hUserToken, SecurityImpersonation, &hDupUserToken);
if (BRet_DuplicateToken == FALSE)
{
CloseHandle(hUserToken);
hToken = NULL;
return FALSE;
}
CloseHandle(hUserToken);
return bRet
}
下面是服务程序中的代码
TCHAR szUsername[MAX_PATH];
DWORD dwUsernameLen = MAX_PATH;
HANDLE hCurrentUserToken = NULL;
BOOL BRet_GetConsoleUserToken = GetConsoleUserToken(hCurrentUserToken);
if (BRet_GetConsoleUserToken == FALSE)
{
return FALSE;
}
BOOL BRet_ImpersonateLoggedOnUser = ImpersonateLoggedOnUser(hCurrentUserToken);
if (BRet_ImpersonateLoggedOnUser == FALSE)
{
CloseHandle(hCurrentUserToken);
return FALSE;
}
GetUserName(szUsername, &dwUsernameLen);
PROFILEINFO cuProfileInfo;
memset(&cuProfileInfo, 0, sizeof(cuProfileInfo));
cuProfileInfo.dwSize = sizeof(PROFILEINFOA);
cuProfileInfo.lpUserName = szUsername;
cuProfileInfo.dwFlags = 1;
BOOL BRet_LoadUserProfile = LoadUserProfile(hCurrentUserToken, &cuProfileInfo);
if (BRet_LoadUserProfile == FALSE)
{
CloseHandle(hCurrentUserToken);
return FALSE;
}
但是该程序在Windows服务中运行的时候在ImpersonateLoggedOnUser的时候失败了,GetLastError的结果是:6,句柄无效。不明白为什么。请各位大哥帮我看一下,谢谢