0

继我之前的问题之后现在我得到了两个外壳 - 一个父外壳(未提升)和一个子外壳(提升)。需要对代码做什么才能拥有一个仅提升的外壳?例如,以某种方式关闭父进程怎么样?

BOOL IsAppRunningAsAdminMode()
{
BOOL fIsRunAsAdmin = FALSE;
DWORD dwError = ERROR_SUCCESS;
PSID pAdministratorsGroup = NULL;

// Allocate and initialize a SID of the administrators group.
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(
    &NtAuthority, 
    2, 
    SECURITY_BUILTIN_DOMAIN_RID, 
    DOMAIN_ALIAS_RID_ADMINS, 
    0, 0, 0, 0, 0, 0, 
    &pAdministratorsGroup))
{
    dwError = GetLastError();
    goto Cleanup;
}

// Determine whether the SID of administrators group is enabled in 
// the primary access token of the process.
if (!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin))
{
    dwError = GetLastError();
    goto Cleanup;
}

Cleanup:
// Centralized cleanup for all allocated resources.
if (pAdministratorsGroup)
{
    FreeSid(pAdministratorsGroup);
    pAdministratorsGroup = NULL;
}

// Throw the error if something failed in the function.
if (ERROR_SUCCESS != dwError)
{
    throw dwError;
}

return fIsRunAsAdmin;
}


int main() {

bool fIsRunAsAdmin = IsAppRunningAsAdminMode();
if (fIsRunAsAdmin == false)
{
        wchar_t szPath[MAX_PATH];
        if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
        {
            // Launch itself as admin
            SHELLEXECUTEINFO sei = { sizeof(sei) };
            sei.lpVerb = L"runas";
            sei.lpFile = szPath;
            sei.hwnd = NULL;
            sei.nShow = SW_NORMAL;
            if (!ShellExecuteEx(&sei))
            {
                DWORD dwError = GetLastError();
                if (dwError == ERROR_CANCELLED)
                {
                    // The user refused to allow privileges elevation.
                    std::cout << "User did not allow elevation" << std::endl;
                }
            }
        }
}
else {
    //do nothing since process already elevated
}
//other code following omitted
4

0 回答 0