开篇:润墨网以专业的文秘视角,为您筛选了一篇Vista下提升应用程序权限范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
(大连外国语学院 软件学院,辽宁 大连 116044)
摘要:很多应用程序在运行的过程中,都会在系统盘下保存一些操作信息和修改的数据等信息。如果在vista系统的不同权限的用户下运行这样的应用程序,会由于文件访问权限问题导致系统崩溃。本文从两个方面阐述了如何提升应用程序的访问权限,一是通过修改Manifest文件,二是在代码中提升。两个方法各有利弊,在使用时需要用户根据需要慎重选择。
关键词:Vista;Manifest文件;UAC;应用程序崩溃;提升访问权限
中图分类号:TP393文献标识码:A文章编号:1009-3044(2009)28-7899-02
Raise Access Authority of Application on VISTA System
LU Lin-lin,WAN Li-ying
(Software College, Dalian University of Foreign Language, Dalian 116044, China)
Abstract:Many applications store their operation information, modified data and other information at the system disk while running. In Vista, if such application runs under users with different authority, different file access authority may lead to application crush. This document tells how to raise application’s access authority in two ways. One is to modify Manifest file, and the other is to raise authority by coding. Because these two methods have their own advantages and disadvantages, users should make choices carefully according their need when using them.
Key words:VISTA;manifest file;UAC;application crash;raise access authority
目前,很多的应用程序在运行的过程中,都会在系统盘安装目录下保存一些操作信息和修改的数据,对于这样的应用程序,当使用Standard权限用户登录Vista系统,启动已经在Administrator Group权限的用户下进行编辑操作的应用程序,会因为文件操作失败,导致APP Error。查找了一些Vista方面的资料,发现是因为Vista系统的新特性UAC导致,原因是在一些特定目录下,低权限的用户无法修改由高权限用户所创建的文件。访问权限问题会使应用程序访问文件失败,进而导致程序失败。那么如何提升应用程序的权限,使得在低权限用户下运行的程序能够修改这些文件呢?
1 UAC
UAC的全称是User Account Control(用户账户控制),它是Windows Vista提供的一个安全特性。它会在用户使用计算机进行更改系统设置或者安装软件等会影响到系统安全性、稳定性的操作时弹出一个对话框,友善的提示用户他们要进行的操作。
当用户使用Windows Vista时,默认是启用UAC的。当UAC启用时,无论用户以什么身份登录Vista系统,即使他以Administrator Group的身份登录计算机,都只具有普通用户的权限。当用户右键选择应用程序的“Run as Administrator”时,Vista系统会弹出一个对话框,提示用户他们要进行的操作。在这个过程中,如果您使用的是Administrator Group用户登录Windows Vista,那么只需要点击“Continue”或者“Allow”就可以继续进行操作了。如图1所示。
如果使用的是Standard用户登录,就需要输入Administrator或Group的密码,如图2所示。
点击的时候,UAC进行了一次权限的提升,这时Group用户才真正具有了Administrator的权限。如果是以Standard用户登录计算机,当他们执行这样的操作时,Vista会弹出一个对话框,让这个Standard用户输入一个管理员的账号和密码。如何才能让我们自己编写的程序在双击运行时就弹出这个对话框呢?
2 MAINFEST
dll是被动态调用的,所以会被若干个程序共享使用的 但是如果dll在应用程序不知道的情况下升级了、或是被另一个程序更改了,就可能会出现问题。VS2005版本之后,采用了一种新的方案,即为每个dll文件配置一个Manifest文件,用来管理这些文件被动态调用时产生的问题。对于每个应用程序Application也有自己的Manifest文件。通过添加Manifest文件,可以使程序的图标上添加小盾牌,在双击运行时弹出对话框。Manifest是个XML的描述文件。为应用程序添加的Manifest文件如下。
level="requireAdministrator"
uiAccess="false">
level参数有三种:
1) asInvoker:应用程序将使用与启动它的进程相同的权限运行。可通过选择“以管理员身份运行”将应用程序提升为更高权限。
2) highestAvailable:应用程序将使用可能的最高权限级别运行。如果启动该应用程序的用户为管理员组的一个成员,则此选项与 requireAdministrator 相同。如果可用的最高权限级别高于打开进程的级别,则系统将提示提供凭据。
3) requireAdministrator:应用程序将使用管理员权限运行。启动该应用程序的用户必须是管理员组的一个成员。如果打开进程未使用管理权限运行,则系统将提示提供凭据。
在VS2005中使用Manifest文件的方法:将上述文件命名为TestUAC.manifest,置于启动工程的目录下,配置启动工程的工程属性,在Configuration Properties->
Manifest Tool->Input and Output->Additional Manifest Files配置项下添加文件名 TestUAC.manifest。
在VS2008中,不需要该manifest文件,直接在启动工程的工程属性中设置即可。将Configuration Properties->Linker->Manifest File->UAC Execution Level配置项设置为如上三个参数中的一个即可。
3 存在的问题
如果在软件设计的过程中没有考虑低权限用户的问题,即将Manifest文件中level参数设置为asInvoker,即应用程序的权限与启动它的进程的权限相同,那么在低权限运行时就因为无法修改文件而导致App Error。将level参数改为requireAdministrator,双击运行的时候就可以弹出UAC提示信息,如图3所示。
通过UAC提升权限的方式,使用户真正具有了Administrator权限,可以任意修改位于受限目录下的文件。但是如果将UAC关闭,那么无论是否配置了Manifest文件,在运行时都不会弹出UAC提示信息,用户无法通过UAC提供的功能进行权限的提升,那么上面提到的问题就又出现了,即UAC关闭时,在应用程序运行过程中,低权限用户仍然无法修改由高权限用户所创建的文件。
4 代码提升访问权限
既然UAC关闭时,无法提供权限提升的功能,那么我们是不是可以从代码中来提升应用程序的权限呢?
Program Data是Vista下新增的目录,用来对用户数据进行分离,目的是保护Program Files目录下的文件不被用户随意的更改。当平台从XP升级到Vista后,在应用程序代码中,也可以将XP系统下创建在Program Files目录下的文件重定向到Vista系统的Program Data目录中,只要在高权限下创建的文件的属性具有everyone可访问的权限,那么在低权限访问高权限用户创建的文件时,就不会出现由于权限不足导致的App Error问题。代码中创建了一个具有everyone可访问权限的文件夹,文件夹中创建的文件自动继承了everyone可访问权限。
HRESULT hResult = S_FALSE;
SECURITY_ATTRIBUTES sa;
sa.nLength =
sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
/*通过SHGetSpecialFolderPath取得Program Data路径*/
SHGetSpecialFolderPath(NULL, szAppDataPath,
CSIDL_COMMON_APPDATA, false);
CString strPath =
szAppDataPath + _T("\\TestFolder");
/*指定文件夹的访问权限*/
// Access Control List
TCHAR* szSD = TEXT("D:")
// Allow access to create owner
TEXT("(A;OICI;WO;;;CO)")
// Allow full control to everyone
TEXT("(A;OICI;GA;;;WD)")
// Allow full control to administrator(下转第7929页)
(上接第7900页)
TEXT("(A;OICI;GA;;;BA)")
// Allow read\execute to user
TEXT("(A;OICI;GRGX;;;BU)");
/*将存取控制的字符串转化成安全描述符*/
BOOL bRet =
ConvertStringSecurityDescriptorToSecurityDescriptor( szSD, SDDL_REVISION_1,
&(sa.lpSecurityDescriptor), NULL);
if (!bRet)
{
return hResult;
}
/*用得到的安全描述符来创建文件夹*/
if (!::CreateDirectory(strPath, &sa))
{
return hResult;
}
ConvertStringSecurityDescriptorToSecurityDescriptor这个函数在sddl.h文件中,使用时需要将该头文件包含,并且该函数在(_WIN32_WINNT >= 0x0500)条件下定义,因此需要在该文件对应的头文件中进行 #define _WIN32_WINNT 0x0500定义。这样我们就可以创建一个具有everyone访问权限的文件夹,在关闭UAC时,低权限用户访问高权限用户所创建的文件就不会因为没有权限而拒绝被访问。
5 结论
使用UAC来提升应用程序权限的方式是Vista提供的,能够真正意义上的进行权限的提升,使用该方法的前提是UAC必须是打开的,而且是在双击应用程序图标的时候会有一个提示框,用户需要知道Administrator或者Admin Group的密码才可以继续运行;而在代码中提升应用程序权限的本质是提升数据文件的访问权限,没有UI交互,用户不
需要了解高权限账号的密码即可正常运行,但这样又会违背Vista的安全特性。因此在使用时还需要慎重选择。
参考文献:
[1] 范文庆, 周彬彬, 安靖.精通Windows API[M]. 北京:人民邮电出版社. 2009.
[2] MSDN Library for Visual Studio 2008- ENU[Z].
[3] MS 安全性设定工具集白皮书[R/OL].[2009-05-22]. /taiwan/technet/prodtechnol/windows2000serv/technologies/activedirectory/howto/securcon.aspx.