您的位置:首页 > 编程语言

Windows核心编程-如何以管理员的身份启动一个程序

2016-11-27 15:24 836 查看
怎样以管理员的身份,来启动一个程序

可以将下面这段代码写在_tmain()函数中,起始相当于开了两个进程,第一个进程起过渡作用,用来

启动第二个管理员权限的进程,但是用户看不见的。

类似于上一章代码,将上面的代码粘贴在主函数中,就ok了

#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);//权限收回

//////////////////////////////////////
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"runas"; //这个参数设置,就是让ShellExecuteEx函数启动的进程,不要使用过滤令牌
ShExecInfo.lpFile = L"cmd"; //这个就是你要启动的程序
ShExecInfo.lpParameters = L"";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW; //如果这个参数不设置,那么你看不见被启动程序的窗口
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);

_gettchar();
return 0;
}
/*
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"runas";
ShExecInfo.lpFile = L"cmd";
ShExecInfo.lpParameters = L"";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: