关于Windows Service中读取HKEY_CURRENT_USER中键值的问题

sexinshanghai sexinshanghai 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位大哥,小弟最近在研究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,句柄无效。不明白为什么。请各位大哥帮我看一下,谢谢
...全文

相关推荐

评论 4
收藏 已收藏
分享
返回顶部
sexinshanghai
C++ 语言 65,214 成员 250,514 内容