在windows操作系统中,某些情况下,我们需要将程序以管理员身份启动,通过任务管理器我们可以看到程序的持有者,如下图所示:
使用SYSYTEM权限启动的程序,理论是不可以访问到当前用户下的部分目录,这个时候我们可以在必要时候切换成武到当前用户权限,使用后切换为SYSTEM。
bool CurrentUserIsLocalSystem() //判断用户名是不是SYSTEM
{
BOOL bIsLocalSystem = FALSE;
PSID psidLocalSystem;
SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY;
BOOL fSuccess = ::AllocateAndInitializeSid(&ntAuthority, 1, SECURITY_LOCAL_SYSTEM_RID,
0, 0, 0, 0, 0, 0, 0, &psidLocalSystem);
if (fSuccess)
{
fSuccess = ::CheckTokenMembership(0, psidLocalSystem, &bIsLocalSystem);
::FreeSid(psidLocalSystem);
}
return bIsLocalSystem;
}
HANDLE hTokenUser = NULL;
DWORD ConsoleSessionId = 0;
BOOL bImpersonateLoggedOnUser = FALSE;
if (CurrentUserIsLocalSystem())
{
// 得到当前激活用户的会话ID
ConsoleSessionId = WTSGetActiveConsoleSessionId();
// 得到当前登录用户的令牌
if (WTSQueryUserToken(ConsoleSessionId, &hTokenUser))
{
// 模仿成当前登录用户
bImpersonateLoggedOnUser = ImpersonateLoggedOnUser(hTokenUser);
}
}
(bImpersonateLoggedOnUser)
{
RevertToSelf();
}