c++ 提升应用程序的权限
2015-07-02 11:49
405 查看
转自:http://blog.csdn.net/leez0301/article/details/8608609
1、判断当前用户权限是否管理员权限
[cpp] view
plaincopy
BOOL IsRunAsAdmin()
{
BOOL fIsRunAsAdmin = FALSE;
DWORD dwError = ERROR_SUCCESS;
PSID pAdministratorsGroup = NULL;
// Allocate and initialize a SID of the administrators group.
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdministratorsGroup))
{
dwError = GetLastError();
goto Cleanup;
}
// Determine whether the SID of administrators group is enabled in
// the primary access token of the process.
if (!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin)){
dwError = GetLastError();
goto Cleanup;
}
Cleanup:
// Centralized cleanup for all allocated resources.
if (pAdministratorsGroup){
FreeSid(pAdministratorsGroup);
pAdministratorsGroup = NULL;
}
// Throw the error if something failed in the function.
if (ERROR_SUCCESS != dwError){
throw dwError;
}
return fIsRunAsAdmin;
}
2、 如果当前用户权限非管理员,提升当前用户权限
[cpp] view
plaincopy
BOOL ElevateCurrentProcess(CString sCmdLine)
{
USES_CONVERSION;
TCHAR szPath[MAX_PATH] = {0};
if (::GetModuleFileName(NULL, szPath, MAX_PATH)){
// Launch itself as administrator.
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
sei.lpVerb = _T("runas");
sei.lpFile = szPath;
sei.lpParameters = (LPCTSTR)sCmdLine;
// sei.hwnd = hWnd;
sei.nShow = SW_SHOWNORMAL;
if (!ShellExecuteEx(&sei)){
DWORD dwStatus = GetLastError();
if (dwStatus == ERROR_CANCELLED) {
return FALSE;
}else if (dwStatus == ERROR_FILE_NOT_FOUND) {
return FALSE;
}
return FALSE;
}
return TRUE;
}
return FALSE;
}
1、判断当前用户权限是否管理员权限
[cpp] view
plaincopy
BOOL IsRunAsAdmin()
{
BOOL fIsRunAsAdmin = FALSE;
DWORD dwError = ERROR_SUCCESS;
PSID pAdministratorsGroup = NULL;
// Allocate and initialize a SID of the administrators group.
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdministratorsGroup))
{
dwError = GetLastError();
goto Cleanup;
}
// Determine whether the SID of administrators group is enabled in
// the primary access token of the process.
if (!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin)){
dwError = GetLastError();
goto Cleanup;
}
Cleanup:
// Centralized cleanup for all allocated resources.
if (pAdministratorsGroup){
FreeSid(pAdministratorsGroup);
pAdministratorsGroup = NULL;
}
// Throw the error if something failed in the function.
if (ERROR_SUCCESS != dwError){
throw dwError;
}
return fIsRunAsAdmin;
}
2、 如果当前用户权限非管理员,提升当前用户权限
[cpp] view
plaincopy
BOOL ElevateCurrentProcess(CString sCmdLine)
{
USES_CONVERSION;
TCHAR szPath[MAX_PATH] = {0};
if (::GetModuleFileName(NULL, szPath, MAX_PATH)){
// Launch itself as administrator.
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
sei.lpVerb = _T("runas");
sei.lpFile = szPath;
sei.lpParameters = (LPCTSTR)sCmdLine;
// sei.hwnd = hWnd;
sei.nShow = SW_SHOWNORMAL;
if (!ShellExecuteEx(&sei)){
DWORD dwStatus = GetLastError();
if (dwStatus == ERROR_CANCELLED) {
return FALSE;
}else if (dwStatus == ERROR_FILE_NOT_FOUND) {
return FALSE;
}
return FALSE;
}
return TRUE;
}
return FALSE;
}
相关文章推荐
- 将字符串中最长的单词输出
- c语言中static用法总结
- C/C++中的输入与输出及如何读取一行文本
- 浅谈 C++ 中的 new/delete 和 new[]/delete[]
- 《C语言及程序设计》实践参考——随便改
- 《C语言及程序设计》实践项目——程序的多文件组织
- C++抽奖程序实现方法
- 《C语言及程序设计》程序阅读——程序的多文件组织
- c++11 & 14: unique_ptr shared_ptr std::make_unique(c++14)
- C++ Primer 学习笔记(1)——巧妙利用cin返回值为其左操作数的特点
- MFC,VC++中,CView类意外消失
- C++ Sort类成员的传递
- JNI初次使用---在C++中得到一系列圆并返回ArrayList
- C/C++中函数参数传递详解
- 数独检测器:帝国理工C++作业
- 2048控制台程序:一份帝国理工C++作业
- 在C++ 中 如何调用 C# 写的DLL
- c语言结构体中保存函数指针的用法
- C++ STL中常见容器的时间复杂度
- 黑马程序员---C语言基础---语句概述