【動態UAC許可權】 無盾和有盾 (win32&cmd)
阿新 • • 發佈:2020-09-02
可以看到兩種不同的提權方式,注意是動態,用程式碼提權,而不是用清單檔案提前處理。
函式都寫好了,這裡不多做解釋。
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】