【动态UAC权限】无盾程序(win32&cmd)
可以看到两种不同的提权方式,注意是动态,用代码提权,而不是用清单文件提前处理。
函数都写好了,这里不多做解释。
win32程序:
首先需要这俩头文件,第二个我忘了啥函数要用了,总之出问题加上就对了:(补:获取程序路径的函数)
#include#include
检测是否以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#include
还是让我多说了,唉,我真是太好了。
控制台的参数可以直接获得程序路径,就不用其它函数了,通常不这么做:
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】