我们知道要使我们的应用程序权限是在管理员权限下运行,那么我们可以在我们的应用程序中(DLL, EXE)VC工程中增加.mainfest文件,重新编译。如果Release出去的应用程序在Vista下运行,并且打开UAC,那么当双击运行我们的应用程序,就会弹出一对话框要求我们输入管理员账号和密码。经测试的确是这样。(在EXE文件中)但是在DLL中为什么没有弹出这样一个对话框出来呢?
(说明:比如用一个test.exe测试,test.exe中会调用.dll中导出的函数,但是dll工程中加入mainfest文件,而test.exe工程中没加,我的目的也就是当test.exe去动态加载该dll,并调用导出的函数的时候才提高权限,但是测试过程中就是没有弹出让我们输入管理员账号和密码的对话框)

解决方案 »

  1.   

    被加载的dll中,函数运行的权限取决于加载它的可执行文件的权限.
    如果test.exe以管理员权限运行,那么dll中的函数也是以管理员权限执行.
    在dll的函数中用下面的语句提升权限 HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    szPrivName[MAX_PATH] = SE_DEBUG_NAME; if (!OpenProcessToken( GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    {
    return false;
    }

    if (!LookupPrivilegeValue( NULL, szPrivName, &sedebugnameValue ) )
    {
    CloseHandle( hToken );
    return false;
    }

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, NULL, NULL, NULL ) )
    {
    return false;
    }
    CloseHandle(hToken);
    return true;
      

  2.   

    Dll依赖于EXE的权限,EXE是什么权限,DLL自然会获取到,所以一般都是通过EXE调用者来设定UAC,而不是由DLL被调用者来决定