WIN7下权限问题分析与解答

1.WIN7下运行软件为什么会提示权限不足?

为了降低计算机系统的风险,Windows Vista引入UAC(User Access Control)机制,默认情况下,应用程序都运行在普通用户权限下。Windows 7继承了这一机制。一般应用程序通常都假设以管理员权限运行,在其它操作系统上(如:windows XP)没有UAC的限制,运行程序的权限不会降低。若以管理员账户登录后,安装软件不会出现什么问题。但在Windows 7上,因为UAC的存在,其将执行应用程序的用户权限降低了,最终导致应用程序无法正常运行。比如,一些应用程序确实是需要管理员权限才可以正常运行的,尤其是安装程序,他们需要向一些需要特殊权限的区域,比如“Program Files”或者是注册表的HKEY_LOCAL_MACHINE写入内容,这种情况下即使用户是以管理员账户登录的(非系统默认Administrators账户)它们会遇到访问拒绝的错误,或者是数据被UAC Virtualization重定向到其他位置而无法正确执行。

2.WIN7是如何判断需要管理员权限运行的应用程序的?

  微软操作系统采用了启发式安装程序检测方法来判断应用程序是不是一个安装程序(需要管理员权限运行),如果操作系统判断应用程序是一个安装程序,就会让它在执行的时候向用户请求获取管理员权限以便让应用程序正确的执行。

 2.1操作系统是如何检测的?

 所有在Windows Vista之前开发的没有manifest(包括外部的和内部的)的32位应用程序都会进行这种启发式的安装程序检测。操作系统会假设这些应用程序是旧有的,他们都需要进行安装程序检测以确定这些应用程序是否需要管理员权限才能正常运行。面对这样的应用程序,操作系统的启发式安装检测通常会通过以下这些途径来判断一个32位应用程序是不是安装程序:

1)文件名包含关键字:”install”, “setup”和”update”等等。

2)在版本资源的以下字段内包含关键字:厂商(Vendor)、公司名(CompanyName)、产品名(ProductName)、文件说明(File Description)、初始文件名(Original Filename)、内部文件名(Internal Name)、导出名(Export Name)。

3) 在可执行文件的manifest内包含关键字。

4)在链接到可执行文件的特定StringTable中包含关键字。

5)在链接到可执行文件的资源文件数据包含关键属性。

6)可执行文件包含特定的字节序列。

 2.2启发式安装程序检测方法存在的问题:

  原本以为操作系统会自动判断到我们的任何一个安装程序是否确实需要管理员权限,但事实并非如此,操作系统只是采用一种非常简单的方式来判断(如通过上述通过一些关键字来判断),所以这种判断方法并不准确。如果我们的安装程序进行的一系列操作(如,将文件复制到系统目录,写注册表等)是需要管理员权限的,而该安装程序并不具备上述检测特征,那么操作系统会认为该程序不需要管理员权限,从而导致安装失败。在安装过程中因权限不足,可能弹出如下图所示界面:

而在此种情况下,我们一般会选择以管理员身份运行软件。

3.为什么有的软件需要“以管理员身份运行”?

  对于含有需要管理权权限才能执行的操作(如修改注册表,监听端口,往系统目录写入文件等)的应用程序,其在执行时是需要管理员权限的。在开启UAC的时候,在Win7或者Vista中执行程序默认是以一种权限较低的方式执行的,在这种方式下,我们有些需要管理员权限的操作会失败。若要保证操作成功,则需要请求管理员权限,在获得管理员权限后,操作才能成功。对于需要管理员权限执行的程序大概可以分为三类:

1)有UAC盾牌图标标识:

1>操作系统根据启发式安装程序检测方法判断其是安装程序,需要管理员权限运行。

2>在应用程序中加入manifest文件,告知操作系统该应用程序是需要管理员权限运行的。

2)没有UAC盾牌图标标识,但程序中提升了进程权限

3)没有UAC盾牌图标标识,程序中也没有提升进程权限的操作

对于前两种情况,若用户是在管理员账户下运行该应用程序,则会自动弹出是否允许运行的对话框(若用户是在标准账户下运行该应用程序,则会弹出输入管理员密码的对话框),在得到用户许可后,自动提升为管理员权限执行程序,程序执行成功。

对于第三种情况,因其需要管理员权限才能执行,但操作系统不知道,程序中也没有提升权限的操作,所以直接运行程序会失败。这时用户就可以选择“以管理员身份运行”来执行应用程序。

4.如何让程序自己自动以管理员权限来运行?

有如下三种方式:

1)在安装程序中加入关键字(针对启发式安装程序检测方法)

2)简单地为应用程序添加一个Manifest文件,告诉操作系统我们到底是不是安装程序,是否需要请求管理员权限。如果应用程序的源代码无法获得,我们只需要在应用程序的同一目录下为应用程序添加一个外部的Manifest文件。

3)提升应用程序运行权限

5.如何加入manifest文件来请求管理员权限?

在VC6.0中可以通过如下方式添加:

添加一个“custom”资源,”resource type”填24,把资源ID改为1,内容为:

<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?>

   <assemb lyxmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity

    version="1.0.0.0"

    processorArchitecture="X86"

    name="CertAppIns.exe.manifest"

    type="win32"

    />

    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

    <security>

    <requestedPrivileges>

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

    </requestedPrivileges>

    </security>

    </trustInfo>

    </assembly>

注:CertAppIns.exe为应用程序名字。

6.如何提升应用程序权限?

VC中可以通过如下方式来实现:

BOOL ElevateCurrentProcess(CString sCmdLine)

{

       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)

                     {

                            // The user refused to allow privileges elevation.

                            return FALSE;

                     }

                     else

                            if (dwStatus == ERROR_FILE_NOT_FOUND)

                            {

                                   // The file defined by lpFile was not found and

                                   // an error message popped up.

                                   return FALSE;

                            }

                           

                            return FALSE;

                           

              }    

              return TRUE;

       }

       return FALSE;

}

7.WIN7下应用程序的开机自启动问题

  1)带盾牌图标(操作系统检测到了关键字或者加入了manifest文件)的应用程序,开机后不被执行(提升权限也没有用)。

  2)不带盾牌图标的应用程序,开机后能够执行。执行成功或者失败。

如果该应用程序本身不需要管理员权限就能够正确执行,则开机后自启动执行成功。如果该应用程序是需要管理员权限执行的,执行结果分两种情况:

       1>该应用程序中并没有提升权限的操作,则开机后能够执行,但执行失败;

       2>该应用程序中进行了提升权限的操作,则开机后能够执行,并执行成功。

综上所述,如果要开机自启动一个需要管理员权限运行的应用程序,则必须保证:

1)该应用程序没有关键字(参考启发式安装程序检测方法)

2)没有加入manifest文件来请求管理员权限

3)在程序中提升进程权限

注:前两条也就是保证应用程序不带盾牌图标。

 

若要保证一个需要管理员权限运行的应用程序能够正确运行(不需要开机自动启动),则可以通过采用简单的方式:加入关键字或者加入manifest来请求管理员权限。

8.UAC权限调整方式:

在默认设置下,用户帐户控制功能会授予用户标准权限。如果一个程序需要管理员权限才能运行的话,用户账户控制功能将询问用户是否提高该任务的权限。

权限调整类型:

1)及时权限提升(OTS);

2)同意型权限提升。

若当前用户是本地系统管理员组账户(非系统默认Administrators账户),则采用同意型权限提升方式。弹出是否允许运行的对话框,在得到用户许可后,提升为管理员权限。若当前用户非本地系统管理员组账户(如标准用户,来宾账户),则采用即时权限提升方式。在运行应用程序时,要求输入管理员口令,在确认后提升为管理员权限。

9.WIN7系统下以管理员账户登录,为什么没有管理员权限?

  因UAC(用户账户控制)机制,即使用户是以管理员账户登录的,但执行应用程序时权限降低,因此并没有真实意义上的管理员权限。

10.管理员与WIN7内置账户Administrators权限有何不同?

  此处的管理员也称为本地管理员组用户,而内置账户Administrators也有称其为超级管理员账户。其不同之处是,在默认情况下,管理员账户是开启了UAC的,受UAC机制的限制,而内置账户Administrators(默认情况下是禁用)拥有完全权限,且默认是关闭了UAC的(相当于其它操作系统,如windows XP下的管理员账户),安装软件时不受UAC的任何限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值