Skip to main content
Email Password   helpLost your password?

Introduction

This article describes how to elevate your program in Windows startup in Vista. Elevating an application is so easy, but it's not easy registering an application in startup.

Background

This article requires readers to have some background.
Firstly, it's important to understanding Vista's UAC. UAC is too complex to understand. Hence, this article does not have any information about UAC.
Secondly, MFC and API knowledge are required since the sample code of this article uses MFC and API.

Vista and Windows Startup

Many programs need to run at Windows startup.

In Windows XP, run at startup was not big deal. But, it became a big deal in Windows Vista. Windows Vista's new protection features restrict a startup program which wants to run as administrator. (It needs to elevate.)

If your application does not need an administrator privilege, there is nothing to do for migration to Windows Vista. But, if your application need an administrator privilege, your application can't run at startup because Vista's new protection blocks your program.

It seems to be impossible to run an administrator privileged program at Windows startup in Vista. But, there is a way to do it (even if it is not the same as XP).

This article describes Windows Vista's protection and a possible method to figure out our problem.

Another Way

To find another way, we have to think about the architecture of protection software. Start with this:

"Windows Vista is allowed to run software which does not need an administrator privilege."

So, one possible method is as follows:

The following pseudo code shows it:

void Main()
{
    if(IsVista() == TRUE && Elevation() == FALSE) {
        ElevationItself();
        Terminate();
    }
}

C++ Code (MFC)

Pseudo code is easy, but real code is not.

CString g_szProgramFolder;
CString g_szCmdLine;

BOOL RunAsAdministrator(LPSTR lpszFileName, LPSTR lpszDirectory)
{
    SHELLEXECUTEINFOA TempInfo = {0};

    TempInfo.cbSize = sizeof(SHELLEXECUTEINFOA);
    TempInfo.fMask = 0;
    TempInfo.hwnd = NULL;
    TempInfo.lpVerb = "runas";
    TempInfo.lpFile = lpszFileName;
    TempInfo.lpParameters = "runasadmin";
    TempInfo.lpDirectory = lpszDirectory;
    TempInfo.nShow = SW_NORMAL;

    BOOL bRet = ::ShellExecuteExA(&TempInfo);

    return bRet;
}

BOOL CMFCApplication::InitInstance()
{
    char szCurFolder[1024] = { 0, };
    GetModuleFileName(GetModuleHandle(NULL), szCurFolder, 1023);

    CString szFullPath = szCurFolder;
    szFullPath = szFullPath.Left(szFullPath.ReverseFind('\\'));

    g_szProgramFolder = szFullPath;

    CCommandLineInfo oCmdLineInfo;
    ParseCommandLine(oCmdLineInfo);

    g_szCmdLine = oCmdLineInfo.m_strFileName;

    if(IsVista()) {
        if(stricmp(g_szCmdLine, "elevation") == 0) {
            char szCmdLine[1024] = { 0, };
            char szCurFileName[1024] = { 0, };
            GetModuleFileName(GetModuleHandle(NULL), szCurFileName, 1023);

            BOOL bRet = 
                RunAsAdministrator( szCurFileName, (LPSTR)(LPCTSTR)g_szProgramFolder );

            if(bRet == TRUE) {
                return FALSE;
            }
        } else if(stricmp(g_szCmdLine, "runasadmin") == 0) {
            //
            // go trough!.
            //
        } else {
            char szCmdLine[1024] = { 0, };
            char szCurFileName[1024] = { 0, };
            GetModuleFileName(GetModuleHandle(NULL), szCurFileName, 1023);

            sprintf(szCmdLine, "\"%s\" elevation", szCurFileName);

            WinExec(szCmdLine, SW_SHOW);

            return FALSE;
        }
    }
    .
    .
    .
}

Points of Interest

RunAsAdministrator function returns FALSE when a user selects 'Cancel'. So, you can execute a program repeatedly until the user selects 'Allow'.

History

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralWindows damaged after run application as elevated to write to registry [modified] Pin
Ha_Tim
21:22 15 Nov '09  
GeneralFull source code Pin
lemonlyt
1:41 31 Mar '09  
GeneralProcessShellCommand() reports error Pin
kuan deng
7:05 18 Mar '09  
GeneralRe: ProcessShellCommand() reports error Pin
Ha_Tim
18:09 16 Nov '09  
GeneralSource code Pin
MasterPr
0:38 23 Jun '08  
GeneralRe: Source code Pin
Member 3928082
1:21 18 Sep '08  
GeneralRe: Source code Pin
lzf8977
2:00 24 Oct '08  
GeneralBuffer overflow Pin
mav.northwind
21:51 17 May '08  
GeneralRe: Buffer overflow Pin
Kwon Yong Hwi
5:36 18 May '08  
GeneralRe: Buffer overflow Pin
SteveKing
20:23 18 May '08  
GeneralRe: Buffer overflow Pin
Kwon Yong Hwi
4:54 19 May '08  
GeneralRe: Buffer overflow Pin
Mihai Nita
9:26 19 May '08  
GeneralRe: Buffer overflow Pin
Kwon Yong Hwi
14:45 19 May '08  
GeneralRe: Buffer overflow Pin
Mihai Nita
14:42 22 May '08  
GeneralYou shouldn't display an elevation prompt at login Pin
Daniel Grunwald
7:13 17 May '08  
GeneralRe: You shouldn't display an elevation prompt at login Pin
axelriet
16:00 17 May '08  
GeneralRe: You shouldn't display an elevation prompt at login Pin
Leo Davidson
8:36 18 May '08  


Last Updated 17 May 2008 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009