提高进程的权限(调试权限)
#include<windows.h>
#include<tchar.h>
#include<Shlobj.h>
/*
这个函数将进程权限提升成具有调试权限的进程,这个权限应该是进程所能具有
的最大权限(调试权限是最大权限)
这个函数成功的前提是,启动这个进程的账号必须是管理员账号
当fEnable=TRUE的时候,授予当前进程调试权限
当fEnable=FALSE的时候,取消当前进程的调试权限
当函数返回TRUE的时候,说明权限调整成功,否则失败。
*/
BOOL EnableDebugPrivilege(BOOL fEnable)
{
//Enable the debug privilege allows the application to see
//information about service application
BOOL fok = FALSE; //Assume function fails
HANDLE hToken;
//获取当前进程的令牌
//这个函数第一个参数是当前进程句柄,第二个参数是:进程对获得的令牌有哪些操作权限
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
//开始激活当前令牌的调试权限
TOKEN_PRIVILEGES tp; //结构体,表示令牌权限
/*
typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;//这个结构体,有几个权限,也就是第二个成员变量privileges数组有几个元素
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid; //唯一标识符,不能重复的一个数组,这个东西和GUID是一个东西
DWORD Attributes; //权限属性
} LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
*/
tp.PrivilegeCount = 1;//此时我们值启动调试权限,所以是1
//下面一个函数,查找调试权限LUID,如果第一个参数是NULL
//表示获取本地的某个权限的LUID
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
//上面的LookUpPrivilegeValue函数,获取本地系统的调试权限LUID
//下面一句话,在tp.Privileges[0].Attributes属性中,设置开启这个权限还是关闭这个权限
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
//当Attributes=SE_PRIVILEGE_ENABLE时,激活权限
//当Attributes=0时,关闭权限
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
//AdjustTokenPrivileges激活或者关闭tp中给定的权限
fok = (GetLastError() == ERROR_SUCCESS);//确认激活是否成功
CloseHandle(hToken);
}
return fok;
}
int _tmain()
{
if (EnableDebugPrivilege(TRUE))
{
_tprintf(L"Enable Debug privilege is ok!\n");
}
else
{
_tprintf(L"Enable Debug privilege is Failure!\n");
}
EnableDebugPrivilege(FALSE);//权限收回
_gettchar();
return 0;
}