Code: Select all
HANDLE hToken = NULL, hTokenRest = NULL;
lbRc = FALSE;
if (OpenProcessToken(GetCurrentProcess(),
//TOKEN_ASSIGN_PRIMARY|TOKEN_DUPLICATE|TOKEN_QUERY|TOKEN_ADJUST_DEFAULT,
TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY,
&hToken))
{
enum WellKnownAuthorities {
NullAuthority = 0, WorldAuthority, LocalAuthority, CreatorAuthority,
NonUniqueAuthority, NtAuthority, MandatoryLabelAuthority = 16
};
SID *pAdmSid = (SID*)calloc(sizeof(SID)+sizeof(DWORD)*2,1);
pAdmSid->Revision = SID_REVISION;
pAdmSid->SubAuthorityCount = 2;
pAdmSid->IdentifierAuthority.Value[5] = NtAuthority;
pAdmSid->SubAuthority[0] = SECURITY_BUILTIN_DOMAIN_RID;
pAdmSid->SubAuthority[1] = DOMAIN_ALIAS_RID_ADMINS;
SID_AND_ATTRIBUTES sidsToDisable[] = {
{pAdmSid}
};
if (CreateRestrictedToken(hToken, DISABLE_MAX_PRIVILEGE,
countof(sidsToDisable), sidsToDisable,
0, NULL, 0, NULL, &hTokenRest))
{
if (CreateProcessAsUserW(hTokenRest, NULL, psCurCmd, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS|CREATE_DEFAULT_ERROR_MODE|CREATE_NEW_CONSOLE
, NULL, m_Args.pszStartupDir, &si, &pi))
{
lbRc = TRUE;
mn_ConEmuC_PID = pi.dwProcessId;
}
CloseHandle(hTokenRest); hTokenRest = NULL;
}
else
{
dwLastError = GetLastError();
}
free(pAdmSid);
CloseHandle(hToken); hToken = NULL;
}