对当前进程进行提升权限
2012-02-08 17:26
399 查看
对于进程提升权限主要用到下面三个API
OpenProcessToken(); 打开权限令牌
LookupPrivilegeValue(); 检索一个唯一的本地标识符 LUID
AdjustTokenPrivileges(); 调整令牌特权
BOOL OpenProcessToken(
HANDLE ProcessHandle, //要修改访问权限的进程句柄
DWORD DesiredAccess, //指定你要进行的操作类型
PHANDLE TokenHandle //返回的访问令牌指针
);
BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, //
表示所要查看的系统,本地系统直接用NULL
LPCTSTR lpName, //
表示所要查看的特权信息的名称
PLUID lpLuid //接收所返回的制定特权名称的信息
);
LUID是用来填充如下结构体的
typedef struct _TOKEN_PRIVILEGES {
DWORD
PrivilegeCount; //令牌属性的个数
LUID_AND_ATTRIBUTES
Privileges[]; //LUID和属性数组
} TOKEN_PRIVILEGES, *PTOKEN
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, //包含特权的句柄
BOOL DisableAllPrivileges,//禁用所有权限标志
PTOKEN_PRIVILEGESNewState,//新特权信息的指针(结构体)
DWORD BufferLength, //缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
PTOKEN_PRIVILEGES PreviousState,//接收被改变特权当前状态的Buffer
PDWORD ReturnLength //接收PreviousState缓存区要求的大小
);
看代码:
HANDLE TokenHandle;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle))
{
return ;
}
TOKEN_PRIVILEGES t_privileges = {0};
if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &t_privileges.Privileges[0].Luid))
{
return ;
}
t_privileges.PrivilegeCount = 1;
t_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(TokenHandle, FALSE, &t_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
{
CloseHandle(TokenHandle);
return ;
}
OpenProcessToken(); 打开权限令牌
LookupPrivilegeValue(); 检索一个唯一的本地标识符 LUID
AdjustTokenPrivileges(); 调整令牌特权
BOOL OpenProcessToken(
HANDLE ProcessHandle, //要修改访问权限的进程句柄
DWORD DesiredAccess, //指定你要进行的操作类型
PHANDLE TokenHandle //返回的访问令牌指针
);
BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, //
表示所要查看的系统,本地系统直接用NULL
LPCTSTR lpName, //
表示所要查看的特权信息的名称
PLUID lpLuid //接收所返回的制定特权名称的信息
);
LUID是用来填充如下结构体的
typedef struct _TOKEN_PRIVILEGES {
DWORD
PrivilegeCount; //令牌属性的个数
LUID_AND_ATTRIBUTES
Privileges[]; //LUID和属性数组
} TOKEN_PRIVILEGES, *PTOKEN
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, //包含特权的句柄
BOOL DisableAllPrivileges,//禁用所有权限标志
PTOKEN_PRIVILEGESNewState,//新特权信息的指针(结构体)
DWORD BufferLength, //缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
PTOKEN_PRIVILEGES PreviousState,//接收被改变特权当前状态的Buffer
PDWORD ReturnLength //接收PreviousState缓存区要求的大小
);
看代码:
HANDLE TokenHandle;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle))
{
return ;
}
TOKEN_PRIVILEGES t_privileges = {0};
if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &t_privileges.Privileges[0].Luid))
{
return ;
}
t_privileges.PrivilegeCount = 1;
t_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(TokenHandle, FALSE, &t_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
{
CloseHandle(TokenHandle);
return ;
}
相关文章推荐
- 对当前进程进行提升权限
- 对当前进程进行提升权限
- .NET中提升当前进程的UAC权限
- .NET中提升当前进程的UAC权限
- 判断当前进程是否以管理员权限运行(AllocateAndInitializeSid后,用CheckTokenMembership与AdministratorsGroup进行比较,和Delphi的那个例子还有点不一样)
- 转--让一个运行在SYSTEM权限下的进程与当前用户的桌面进行交互
- 代码注入(提升当前进程权限,创建远程线程)
- 对经过权限提升/筛选的进程进行调试
- :让一个运行在SYSTEM权限下的进程与当前用户的桌面进行交互 代码:
- sharepoint 权限提升和杜绝当前上下文环境影响
- 提升当前用户在MOSS中代码的运行权限
- 如何提高当前进程的权限
- Windows下提升进程权限
- 提升进程权限函数OpenProcessToken 及相关函数详解
- C#实现杀掉MSSQL中数据库当前连接的所有进程(进行数据还原的时候需要用到)
- [ArgumentException: 可能证书“CN=JRNet01-PC”没有能够进行密钥交换的私钥,或者进程可能没有访问私钥的权限。有关详细信息,请参见内部异常。]
- 提升进程权限-OpenProcessToken等函数的用法
- 提升进程权限为DEBUG权限
- VS2010 在Win 7 附加w3wp.exe进程进行调试和权限问题
- 【转载】MFC手动提升进程权限