///说明:VC6编译通过//文件名:UAC.h//调用:UAC(进程名,可执行文件路径);

#pragma once
#include <windows.h>
#include <Aclapi.h>
#include <TLHelp32.h>typedef DWORD (WINAPI *WTSGetActiveConsoleSessionIdFunc)();
typedef    BOOL (WINAPI *ProcessIdToSessionIdFunc)(DWORD dwProcessId,DWORD* pSessionId);
typedef BOOL (WINAPI *WTSQueryUserTokenFunc)(ULONG SessionId,PHANDLE phToken);
typedef BOOL (WINAPI *CreateEnvironmentBlockFunc)(LPVOID *lpEnvironment,HANDLE hToken,BOOL bInherit);WTSGetActiveConsoleSessionIdFunc    WTSGetActiveConsoleSessionId=NULL;
ProcessIdToSessionIdFunc    ProcessIdToSessionId=NULL;
WTSQueryUserTokenFunc        WTSQueryUserToken=NULL;
CreateEnvironmentBlockFunc    CreateEnvironmentBlock=NULL;//获取所需函数地址
void GetFunc()
{HMODULE hKernel32=LoadLibrary("Kernel32.dll");HMODULE hWtsapi32=LoadLibrary("Wtsapi32.dll");HMODULE hUserenv=LoadLibrary("userenv.dll");if (hKernel32 && hWtsapi32 && hUserenv){WTSGetActiveConsoleSessionId = (WTSGetActiveConsoleSessionIdFunc)GetProcAddress(hKernel32,"WTSGetActiveConsoleSessionId");ProcessIdToSessionId = (ProcessIdToSessionIdFunc)GetProcAddress(hKernel32,"ProcessIdToSessionId");WTSQueryUserToken = (WTSQueryUserTokenFunc)GetProcAddress(hWtsapi32,"WTSQueryUserToken");CreateEnvironmentBlock=(CreateEnvironmentBlockFunc)GetProcAddress(hUserenv,"CreateEnvironmentBlock");}
}//开启本线程的SeDeDebug权限
bool EnableDebugPrivilege()
{HANDLE hToken;TOKEN_PRIVILEGES tp;if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))return false;if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid))return false;tp.PrivilegeCount=1;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if (!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))return false;return true;
}//主函数
BOOL UAC(char *ProcessName,char *ExecuteFilePath)
{DWORD    dwSessionId=0,TmpSessionId=0,PID=0,dwCreateFlags,dwSdLen,dwRet,dwAclSize=0,dwSaclSize=0,dwSidOwnLen=0,dwSidPrimLen=0;HANDLE    hSnap=NULL,hUserToken=NULL,hNewUserToken=NULL,hToken=NULL,hProcess;PROCESSENTRY32    pe={0x00};BOOL    Flag=false,bRet=false,bDAcl,bDefDAcl;TOKEN_PRIVILEGES    tp;LPVOID                lpEnv;STARTUPINFO            si;PROCESS_INFORMATION    pi;EXPLICIT_ACCESS        ea;PSECURITY_DESCRIPTOR    pOrigSd=NULL,pNewSd=NULL;PACL    pOldDAcl=NULL,pNewDAcl=NULL,pSacl=NULL;PSID    pSidOwner=NULL,pSidPrimary=NULL;//获取所需函数
    GetFunc();//开启本线程权限
    EnableDebugPrivilege();//Baby,come on!dwSessionId=WTSGetActiveConsoleSessionId();//查找进程,获取PIDhSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);pe.dwSize=sizeof(pe);Flag=Process32First(hSnap,&pe);while (Flag){if (strcmp(strlwr(pe.szExeFile),strlwr(ProcessName))==0){ProcessIdToSessionId(pe.th32ProcessID,&TmpSessionId);if (TmpSessionId==dwSessionId){PID=pe.th32ProcessID;break;}}Flag=Process32Next(hSnap,&pe);}//获取用户令牌WTSQueryUserToken(dwSessionId,&hUserToken);hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);if (!hProcess)return FALSE;if (!OpenProcessToken(hProcess,READ_CONTROL|WRITE_DAC,&hToken))return FALSE;//设置ACE具有所有访问权限ZeroMemory(&ea,sizeof(EXPLICIT_ACCESS));BuildExplicitAccessWithName(&ea,"Everyone",TOKEN_ALL_ACCESS,GRANT_ACCESS,0);//第一次调用肯定返回这个错误,这是为了得到原安全描述符 pOrigSd 的长度if (!GetKernelObjectSecurity(hToken,DACL_SECURITY_INFORMATION,pOrigSd,0,&dwSdLen)){if (GetLastError()==ERROR_INSUFFICIENT_BUFFER){pOrigSd = (PSECURITY_DESCRIPTOR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSdLen);if (pOrigSd==NULL)return FALSE;}}//第二次调用得到安全描述符 pOrigSdif (!GetKernelObjectSecurity(hToken,DACL_SECURITY_INFORMATION,pOrigSd,dwSdLen,&dwSdLen))return FALSE;//得到原安全描述符的访问控制列表 ACLif (!GetSecurityDescriptorDacl(pOrigSd,&bDAcl,&pOldDAcl,&bDefDAcl))return FALSE;// 生成新 ACE 权限的访问控制列表 ACLdwRet=SetEntriesInAcl(1,&ea,pOldDAcl,&pNewDAcl);if (dwRet!=ERROR_SUCCESS)return FALSE;//第一次调用肯定返回错误,为了创建新的安全描述符 pNewSd 而得到各项的长度if (!MakeAbsoluteSD(pOrigSd,pNewSd,&dwSdLen,pOldDAcl,&dwAclSize,pSacl,&dwSaclSize,pSidOwner,&dwSidOwnLen,pSidPrimary,&dwSidPrimLen)){if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){pOldDAcl = (PACL)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwAclSize);pSacl = (PACL)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSaclSize);pSidOwner = (PSID)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSidOwnLen);pSidPrimary=(PSID)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSidPrimLen);pNewSd = (PSECURITY_DESCRIPTOR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSdLen);if (pOldDAcl==NULL || pSacl==NULL || pSidOwner==NULL || pSidPrimary==NULL || pNewSd==NULL)return FALSE;}}//再次调用才可以成功创建新的安全描述符 pNewSdif (!MakeAbsoluteSD(pOrigSd,pNewSd,&dwSdLen,pOldDAcl,&dwAclSize,pSacl,&dwSaclSize,pSidOwner,&dwSidOwnLen,pSidPrimary,&dwSidPrimLen))return FALSE;//将具有所有访问权限的访问控制列表 pNewDAcl 加入到新的 安全描述符 pNewSd 中if (!SetSecurityDescriptorDacl(pNewSd,bDAcl,pNewDAcl,bDefDAcl))return FALSE;//将新的安全描述符加到 TOKEN 中if (!SetKernelObjectSecurity(hToken, DACL_SECURITY_INFORMATION, pNewSd))return FALSE;//再次打开进程的 TOKEN,这时已经具有所有访问权限if (!OpenProcessToken( hProcess, TOKEN_ALL_ACCESS, &hToken))return FALSE;//复制令牌if (!DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary,&hNewUserToken))return FALSE;//结束进程,危险,虚拟机测试//TerminateProcess(hProcess,0);//不虚拟登陆用户的话,创建新进程会提示
     ImpersonateLoggedOnUser(hNewUserToken);//创建环境if (CreateEnvironmentBlock(&lpEnv,hNewUserToken,TRUE))dwCreateFlags=NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE|CREATE_UNICODE_ENVIRONMENT;elselpEnv=NULL;ZeroMemory(&si,sizeof(si));ZeroMemory(&pi,sizeof(pi));si.cb=sizeof(si);si.lpDesktop="winsta0\default";bRet=CreateProcessAsUser(hNewUserToken,ExecuteFilePath,NULL,NULL,NULL,FALSE,dwCreateFlags,lpEnv,NULL,&si,&pi);//byeHeapFree(GetProcessHeap(),0,pOrigSd);HeapFree(GetProcessHeap(),0,pNewSd);HeapFree(GetProcessHeap(),0,pSidOwner);HeapFree(GetProcessHeap(),0,pSidPrimary);HeapFree(GetProcessHeap(),0,pSacl);HeapFree(GetProcessHeap(),0,pOldDAcl);CloseHandle(hSnap);CloseHandle(hProcess);CloseHandle(hToken);CloseHandle(hUserToken);CloseHandle(hNewUserToken);
}

另注:亦可以用来结束系统进程。

转载于:https://www.cnblogs.com/littleevil/archive/2012/05/22/2513747.html

以系统最高权限运行软件相关推荐

  1. xp无法使用计算机管理员权限,xp无法无法使用管理员权限运行软件的解决步骤...

    在使用一些不常用软件的时候,我们经常需要管理员的权限,因为只有管理员才有足够的权限来运行系统上的一些东西,可是在xp系统上有时候无法使用管理运行一些东西,怎么办呢,如图所示要怎么办? 小编终于找到了一 ...

  2. 计算机无法以管理员模式运行,电脑为什么没法以管理员身份运行软件

    说说我的看法,可能有帮助. 1.确保你的电脑登陆账号能够获得管理员权限,最好就是登陆的是管理员账户: 2.使用管理员权限运行软件: (1)右键程序,以"管理员权限运行" (2)右键 ...

  3. McAfee Agent漏洞可导致黑客以Windows 系统权限运行代码

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 McAfee Enterprise(现更名为 Trellix)修复了McAfee Agent 软件 Windows 版中的一个漏洞(CVE-20 ...

  4. 启动root用户 银河麒麟_麒麟系统使用root权限运行程序

    最近在虚拟机里安装了个国产麒麟系统.(不知道麒麟系统的百度下.) ************************************************** PS:首次试用的同学可以先用 V ...

  5. Win10系统 默认以管理员权限运行所有程序

    WIN10中发现如ahk和目标程序不都是管理员权限,或不全是非管理员权限运行会有各种问题,遂找解决办法.以下文章来自网络,亲侧好用. 非原创,用的是网址 win10如何默认所有软件以管理员身份运行-系 ...

  6. 服务器系统可以使用软件吗,云服务器可以运行软件吗

    云服务器可以运行软件吗 内容精选 换一换 简要介绍OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.语言:C/C++一句话描述:软件 ...

  7. 使用cpau.exe让不是管理员的用户也有权限运行哪些需要管理员权限的软件。

    在日常工作中,很多软件是需要管理员权限运行的,但有时候我们并不会把管理员权限给用户,甚至连本地用户管理员权限都不会给用户,那么有些软件需要用管理员权限怎么办呢?? 那么你可以试试cpau,挺不错的,下 ...

  8. win10运行C语言的程序,win10系统运行软件提示应用程序发生异常0xc0000409的具体教程...

    有关win10系统运行软件提示应用程序发生异常0xc0000409的操作方法想必大家有所耳闻.但是能够对win10系统运行软件提示应用程序发生异常0xc0000409进行实际操作的人却不多.其实解决w ...

  9. Ubuntu18.04如何让桌面软件默认root权限运行?

    什么是gksu? 什么是gksu: Linxu中的gksu是系统中的su/sudo工具,如果安装了gksu,在终端中键入gksu会弹出一个对话框. 安装gksu: 在Ubuntu之前的版本中是继承gk ...

最新文章

  1. 2022年十大AI预测
  2. Elasticsearch 安装和使用
  3. MVVM Template
  4. Eigen(2) 模块与头文件
  5. 读入源文件,并在每行前加上行号和[Tab]
  6. oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法
  7. selenium+python设置爬虫代理IP的方法
  8. born to be wild---Bangkok篇
  9. 实现基于Keepalived高可用集群网站架构的多种方法
  10. linux 卸载你pip,ubuntu python pip无法卸载pi
  11. 自家主机建云服务器_是用云主机还是自己建服务器好?
  12. 在Linux上安装centos 7镜像详细步骤
  13. 用MATLAB对语音进行基频搬移,语音信号变声处理系.doc
  14. python 文字转换成声音
  15. 爬取《悲伤逆流成河》猫眼信息 | 郭敬明五年电影最动人之作
  16. [转载]CAE工程师:铁匠还是厨子,这是个问题
  17. 圣诞节用代码写一颗圣诞树【html5写的3D逼真圣诞树外加python无延迟的豪华圣诞树】
  18. 【苹果CMS技术教程】苹果CMSV10宝塔全自动定时采集教程
  19. 如何让Citrix客户端不能访问XenApp服务器的磁盘
  20. Hadoop-HDFS学习课件

热门文章

  1. Rancher Labs赋能合作伙伴抢滩容器市场
  2. 试用SpringBoot创建WEB应用
  3. Autodesk Cloud Accelerator Program 开始报名
  4. Js文本溢出自动添加省略号ellipsis
  5. 搭建自己的前端自动化测试脚手架(三)
  6. maven环境快速搭建
  7. SQL语句及索引优化
  8. php http请求封装
  9. 高清的GIF表情包如何制作
  10. linux下OpenSSL的RSA密钥生成