【动态UAC权限】无盾程序(win32&cmd)


可以看到两种不同的提权方式,注意是动态,用代码提权,而不是用清单文件提前处理。

函数都写好了,这里不多做解释。


win32程序:

首先需要这俩头文件,第二个我忘了啥函数要用了,总之出问题加上就对了:(补:获取程序路径的函数)

#include <windows.h>
#include <Shlobj.h>

检测是否以UAC启动:

//返回1为管理员权限,0位普通 
BOOL IsUserAdmin(void){
    BOOL b;
    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    PSID AdministratorsGroup; 
    AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &AdministratorsGroup); 
    CheckTokenMembership(NULL,AdministratorsGroup,&b);
    FreeSid(AdministratorsGroup); 
    return(b);
}

主要部分,此处应注意返回值,程序中应在开头这样编写:

  if(IsUserAdmin()){
        //is UAC
        //什么都不做 
    }
    else{
        //not UAC
        char path[100];
        GetModuleFileName(NULL,path,100);
    
        SHELLEXECUTEINFO execinfo;  
        memset(&execinfo,0,sizeof(execinfo));  
        execinfo.lpFile         =path;  
        execinfo.cbSize         =sizeof(execinfo);  
        execinfo.lpVerb         ="runas";  
        execinfo.fMask          =SEE_MASK_NO_CONSOLE;  
        execinfo.nShow          =SW_SHOWDEFAULT;  
        //execinfo.lpParameters   =NULL;  
  
        ShellExecuteEx(&execinfo);
        CloseHandle(execinfo.hProcess);
        
        exit(0);
    }

此处的else内就是UAC提权的过程,通过 ShellExecuteEx 函数以UAC权限启动,启动完成后当前程序退出。

我懒得讲解,不明白的可以查微软文档。


控制台程序:

看到没我这么贴心,快来感谢我。

头文件不用多说:

#include <stdio.h>
#include <windows.h>

还是让我多说了,唉,我真是太好了

控制台的参数可以直接获得程序路径,就不用其它函数了,通常不这么做:

int main(int argc,char const *argv[])

好,下一步直接把这一坨往开头一方,完事:

if(IsUserAdmin()){
        //is UAC
        //什么都不做 
    }
    else{
        //not UAC
        char path[100];
        GetModuleFileName(NULL,path,100);
    
        SHELLEXECUTEINFO execinfo;  
        memset(&execinfo,0,sizeof(execinfo));  
        execinfo.lpFile         =path;  
        execinfo.cbSize         =sizeof(execinfo);  
        execinfo.lpVerb         ="runas";  
        execinfo.fMask          =SEE_MASK_NO_CONSOLE;  
        execinfo.nShow          =SW_SHOWDEFAULT;  
        //execinfo.lpParameters   =NULL;  
  
        ShellExecuteEx(&execinfo);
        CloseHandle(execinfo.hProcess);
        
        exit(0);
    }

事了拂衣去,深藏功与名~

【欢迎加入我的qq群:789209269

原文地址:https://www.cnblogs.com/pta00/p/13602349.html