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);
*/
可以将下面这段代码写在_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);
*/
相关文章推荐
- 如何让Delphi程序启动自动“以管理员身份运行"
- Windows 如何以管理员权限启动程序
- 如何代码设置以管理员身份启动程序
- 如何在Windows服务中以当前用户启动一个程序
- 如何让 Windows 8 的程序双击后自动以管理员身份运行
- 基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序
- Delphi Xe2 后的版本如何让Delphi程序启动自动“以管理员身份运行"
- Windows 编程控制以管理员权限启动进程(包括QT程序)
- C# windows权限问题 程序如何以管理员身份运行程序
- 如何跳过UAC以管理员身份启动程序
- 如何让windows8/10默认以管理员身份运行任何程序
- 使用和管理Windows 8如何以管理员身份打开程序
- 基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序
- 如何自动以管理员身份运行.NET程序?
- 实验:上电后, 在未登录状态下, 由Windows Service启动一个程序
- 一个正执行的程序如何启动另一新程序并关闭现执行程序
- Win7如何提升为管理员权限,如何开机启动需要管理员权限的程序,解决win7开机不能自动运行的问题等
- 如何设置C#程序在Windows 7 Vista下以管理员权限运行
- ASP.NET 3.5核心编程学习笔记(48):ASP.NET的安全性之Windows身份验证与Passport身份验证
- 如何自动以管理员身份运行.NET程序?