提升进程权限函数OpenProcessToken 及相关函数详解

提升进程权限函数OpenProcessToken 及相关函数详解

http://m.blog.csdn.net/blog/Armstronghappy/8797630

 

LookupPrivilegeValue

函数查看系统权限的特权值,返回信息到一个LUID结构体里。
BOOL LookupPrivilegeValue(LPCTSTR lpSystemName,LPCTSTR lpName,PLUID lpLuid);

第一个参数表示所要查看的系统,本地系统直接用NULL
第二个参数表示所要查看的特权信息的名称,定义在winnt.h中,具体指请MSDN索引“windows nt privileges”
第三个参数用来接收所返回的制定特权名称的信息。

函数调用成功后,信息存入第三个类型为LUID的结构体中,并且函数返回非0。

函数定义在winbase.h中,链接使用advapi32.lib库。

示例:
CString str;
LUID Luid; //LUID 就是LARGE_INTEGER的定义
LookupPrivilegeValue(NULL,"SeDebugPrivilege",&Luid);
str.Format("%d,%d\n",Luid.HighPart,Luid.LowPart);
MessageBox(str);


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++ Windows服务中,使用CreateProcessAsUser函数启动另一个进程,并指定Local System权限,可以通过以下步骤实现: 1. 获取Local System用户的访问令牌。使用OpenProcessToken函数获取当前进程的访问令牌,然后使用DuplicateTokenEx函数创建一个访问令牌的副本。在DuplicateTokenEx函数中指定TokenPrimary参数,以便创建一个主访问令牌,这样后续可以使用该访问令牌来启动新进程。 ```c++ HANDLE hToken = NULL; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) { // 获取当前进程的访问令牌失败 // TODO:处理错误 return; } HANDLE hTokenDup = NULL; if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hTokenDup)) { // 创建访问令牌的副本失败 // TODO:处理错误 CloseHandle(hToken); return; } CloseHandle(hToken); ``` 2. 设置访问令牌的安全属性。使用SetTokenInformation函数设置TOKEN_MANDATORY_LABEL信息,以便指定访问令牌的安全属性。 ```c++ // 设置SDDL字符串,表示为Local System用户创建一个低完整性级别的安全标签 LPCTSTR szSDDL = _T("S-1-16-4096"); PSECURITY_DESCRIPTOR pSD = NULL; if (!ConvertStringSecurityDescriptorToSecurityDescriptor(szSDDL, SDDL_REVISION_1, &pSD, NULL)) { // 转换SDDL字符串为安全描述符失败 // TODO:处理错误 CloseHandle(hTokenDup); return; } TOKEN_MANDATORY_LABEL tml = { 0 }; tml.Label.Attributes = SE_GROUP_INTEGRITY; tml.Label.Sid = NULL; if (!ConvertStringSidToSid(szSDDL, &(tml.Label.Sid))) { // 转换SDDL字符串为SID失败 // TODO:处理错误 CloseHandle(hTokenDup); LocalFree(pSD); return; } if (!SetTokenInformation(hTokenDup, TokenIntegrityLevel, &tml, sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(tml.Label.Sid))) { // 设置访问令牌的安全属性失败 // TODO:处理错误 CloseHandle(hTokenDup); LocalFree(pSD); return; } LocalFree(pSD); ``` 3. 使用CreateProcessAsUser函数创建一个新进程,并使用访问令牌的副本来启动该进程。在CreateProcessAsUser函数中指定CREATE_NEW_CONSOLE标志,以便在新控制台窗口中启动新进程。 ```c++ STARTUPINFO si = { 0 }; si.cb = sizeof(si); si.lpDesktop = _T("winsta0\\default"); PROCESS_INFORMATION pi = { 0 }; if (!CreateProcessAsUser(hTokenDup, NULL, _T("cmd.exe"), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { // 使用访问令牌启动新进程失败 // TODO:处理错误 CloseHandle(hTokenDup); return; } ``` 4. 关闭访问令牌的副本和新进程的句柄。 ```c++ CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(hTokenDup); ``` 希望这些步骤能够帮助您在C++ Windows服务中使用CreateProcessAsUser函数启动另一个进程,并指定Local System权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值