=============================================================================
WIN32 应用程序:CppUACSelfElevation 项目概述
=============================================================================
/////////////////////////////////////////////////////////////////////////////
摘要:
用户账户控制 (UAC)是Windows Vista及后续操作系统中的一个新安全组件。当UAC被
完全开启时,管理员的交互操作通常运行在普通用户权限下。这个示例演示了如何去检
测当前进程的权限等级,和如何通过许可验证对话框来确认并自我提升此线程的权限等
级。
/////////////////////////////////////////////////////////////////////////////
先决条件:
你必须在Windows Vista及后续操作系统中运行此示例程序。
/////////////////////////////////////////////////////////////////////////////
演示:
以下步骤演示了此UAC示例程序。
步骤1、在使用Visual Studio2008成功生成示例项目后, 你将得到一个应用程序:
CppUACSelfElevation.exe
步骤2、在一个UAC完全开启的Windows Vista或Windows 7系统中,使用受保护的管理员账
户执行此程序。此程序会显示一个对话框包含以下内容:
用户是否是系统管理员: 是
是否以管理员身份运行: 否
进程权限是否被提升: 否
完整性级别: 中
在“自我提升权限”按钮上有一个UAC盾状图标。
步骤3、点击“自我提升权限”按钮, 你将会看到一个许可验证对话框
用户账户控制
----------------------------------
您想允许来自未知发布者的以下程序对此计算机进行更改吗?
步骤4、点击“是”允许提升权限。之前的程序会被启动并显示以下内容
用户是否是系统管理员: 是
是否以管理员身份运行: 是
进程权限是否被提升: 是
完整性级别: 高
此时对话框中的“自我提升权限”按钮没有了之前的UAC盾状图标。这是由于此应用程序
以一个已提升的管理员运行。成功进行权限提升。如果你再次点击“自我提升权限”按钮,
此程序会告知你它已经作为管理员身份运行。
步骤5、 点击[X]关闭此应用程序。
/////////////////////////////////////////////////////////////////////////////
创建过程:
步骤1、创建一个基于对话框的Win32 VC++应用程序
新建一个Visual C++ / Win32 / Win32 项目。把其命名为CppUACSelfElevation并在应用
程序设置页中把应用程序类型设置为Windows应用程序。在程序被创建后,在项目属性/
配置属性/ C/C++ /预编译头中关闭预编译头。在资源视图中,删除所有默认Accelerator
dialog, icon, menu, 和 string table资源。这是由于这些资源在本示例中不是必须的。
接下来, 添加一个dialog资源,其ID设置为:IDD_MAINDIALOG。它作为本Windows应用程
序的主对话框。在解决方案资源管理器中,删除向导所生成的文件:stdafx.cpp, stdafx.h,
targetver.h, CppUACSelfElevation.h, CppUACSelfElevation.ico,和small.ico。这将
简化此项目。打开CppUACSelfElevation.cpp,使用以下代码替换其内容。以下这些代码
描述了一个VC++ Win32基于对话框应用程序的基本框架。
#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
#include "Resource.h"
BOOL OnInitDialog(HWND hWnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}
void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch (id)
{
case IDOK:
case IDCANCEL:
EndDialog(hWnd, 0);
break;
}
}
void OnClose(HWND hWnd)
{
EndDialog(hWnd, 0);
}
INT_PTR CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
HANDLE_MSG (hWnd, WM_INITDIALOG, OnInitDialog);
HANDLE_MSG (hWnd, WM_COMMAND, OnCommand);
HANDLE_MSG (hWnd, WM_CLOSE, OnClose);
default:
return FALSE;
}
return 0;
}
int APIENTRY wWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, DialogProc);
}
步骤2、在主对话框中添加控件
类型:Button
ID: IDC_ELEVATE_BN
Caption: "自我提升权限"
类型: Static Text
ID: IDC_INADMINGROUP_STATIC
用法:即使在还没有为当前用户提升权限的前提下,此控件显示拥有此进程的主访问令
牌的用户是否是本地管理员组的成员。
类型: Static Text
ID: IDC_ISRUNASADMIN_STATIC
用法:此控件显示此程序以管理员身份运行。
类型: Static Text
ID: IDC_ISELEVATED_STATIC
用法:此控件显示当前进程的权限是否已经被提升。令牌提升只有在Windows Vista
及后续版本的Windows中才被支持。此控件在Windows Vista之前版的Windows中显示
显示N/A。
类型: Static Text
ID: IDC_IL_STATIC
用法:此控件显示当前进程的完整性级别。完整性级别只有在Windows Vista及后续版
本的Windows中才被支持。此控件在Windows Vista之前版的Windows中显示显示N/A。
步骤3、在程序初始化主对话框时检查并显示当前进程的“以管理员身份运行”的状态,
权限提升信息及完整性级别。
创建以下四个辅助函数:
//
// 函数:IsUserInAdminGroup()
//
// 用途:即使在还没有为当前用户提升权限的前提下,此函数检测拥有此进程的主访
// 问令牌的用户是否是本地管理员组的成员。
//
// 返回值:如果拥有主访问令牌的用户是管理员组成员则返回TRUE,反之则返回FALSE。
//
// 异常:如果此函数出错,它抛出一个包含Win32相关错误代码的C++ DWORD异常。
//
//
// 调用示例:
// try
// {
// if (IsUserInAdminGroup())
// wprintf (L"用户是管理员组成员\n");
// else
// wprintf (L"用户不是管理员组成员\n");
// }
// catch (DWORD dwError)
// {
// wprintf(L"IsUserInAdminGroup 调用失败 w/err %lu\n", dwError);
// }
//
BOOL IsUserInAdminGroup();
//
// 函数:IsRunAsAdmin()
//
// 用途:此函数检测当前进程是否以管理员身份运行。换而言之,此进程要求用户是
// 拥有主访问令牌的用户是管理员组成员并且已经执行了权限提升。
//
// 返回值:如果拥有主访问令牌的用户是管理员组成员且已经执行了权限提升则返回
// TRUE,反之则返回FALSE。
//
// 异常:如果此函数出错,它抛出一个包含Win32相关错误代码的C++ DWORD异常。
//
// 调用示例:
// try
// {
// if (IsRunAsAdmin())
// wprintf (L"进程以管理员身份运行\n");
// else
// wprintf (L"进程没有以管理员身份运行\n");
// }
// catch (DWORD dwError)
// {
// wprintf(L"IsRunAsAdmin 失败 w/err %lu\n", dwError);
// }
//
BOOL IsRunAsAdmin();
//
// 函数:IsProcessElevated
//
// 用途:此函数获取当前进程的权限提升信息。它由此进程是否进行了权限提升所
// 决定。令牌权限提升只有在Windows Vista及后续版本的Windows中有效。所以在
// Windows Vista之前的版本中执行IsProcessElevated, 它会抛出一个C++异常。
// 此函数并不适用于检测是否此�
评论2
最新资源