We often get the question how to elevate a process through ShellExecute. From the docs it is not immediately clear. The trick is passing in "runas" in the lpVerb.
Here is a snippet to run notepad elevated.
#include "stdafx.h"
#include "windows.h"
#include "shellapi.h"
int _tmain(int argc, _TCHAR* argv[])
{
SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = NULL;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = L"runas";
shExecInfo.lpFile = L"notepad.exe";
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_MAXIMIZE;
shExecInfo.hInstApp = NULL;
ShellExecuteEx(&shExecInfo);
return 0;
}
Elevate through manifest
Manifest files
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="x86"
name="IsUserAdmin"
type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="FALSE"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
notice:
maybe <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
should be <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
you would insert manifest file into your project to compile.
Resource name: MANIFEST_RESOURCE_ID
Resource type: RT_MANIFEST
/
//
// RT_MANIFEST
//
MANIFEST_RESOURCE_ID RT_MANIFEST "application.exe.manifest"