可能重复:
防止不需要的应用程序提升权限 (UAC)
我正在使用一个在 Windows Vista/Windows 7 之前编写的应用程序。Windows 已决定该应用程序需要以管理员身份运行(即它有盾牌图标)。我很确定该应用程序的清单中没有任何内容表明它需要以提升的权限运行(它是在 Windows Vista 之前编写的)。
有什么方法可以告诉 Windows 某个特定应用程序不需要提升权限?
答案1
Windows 根据各种标准自动提升应用程序的权限(列于了解和配置 Windows Vista 中的用户帐户控制):
在创建 32 位进程之前,将检查以下属性以确定它是否是安装程序:
- 文件名包含“安装”、“设置”、“更新”等关键字。
- 以下版本控制资源字段中的关键字:供应商、公司名称、产品名称、文件描述、原始文件名、内部名称和导出名称。
- 可执行文件中嵌入的并行清单中的关键字。
- 可执行文件中链接的特定 StringTable 条目中的关键字。
- 可执行文件中链接的 RC 数据中的关键属性。
- 可执行文件中的目标字节序列。
如果你无法通过重命名文件来防止提升,你应该能够创建一份防止提升的清单。
答案2
假设程序编写正确,并且确实工作当以标准用户身份运行时,您可以将其显示为以标准用户身份运行。
笔记:如果该程序在 Windows XP 上无法运行,则它在 Windows Vista 或 Windows 7 上也会继续失败。您可以通过登录 Windows XP 来测试此应用程序,看看它是否能运行。(您做以标准用户身份登录 Windows XP,对吗?
如果程序无法在 Windows XP 上以标准用户身份正确运行,则也无法在 Windows 7 上以标准用户身份运行。如果您必须在 Windows XP 上以管理员身份运行该程序,则您必须在 Windows 7 上以管理员身份运行该程序。
如果您认为该程序不需要以管理员身份运行,则可以添加显现指示 Windows 它应该以您所在的标准用户身份运行。
在与您的应用程序相同的文件夹中创建清单文件。例如,Goldwave.exe
您创建:
Goldwave.exe.manifest
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="IsUserAdmin"
type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
笔记:这就是所谓的外部的清单,因为它位于单独的文件中。应用程序完全有可能已经有一份清单。
Windows 2000 引入了清单,用于声明对某些版本的 DLL 的依赖关系。该清单的一个常见用途是随 Windows XP 一起出现,用于程序声明对版本 6–
comctl32.dll
以便应用程序具有“主题”。
如果应用程序已经有一个嵌入清单,Windows 将忽略任何外部的清单。在这种情况下,你需要使用资源黑客修改嵌入的RT_MANIFEST
(资源类型 24)清单。
接下来你可以检查注册表,看看是否有人已经申请了提升shim 到你的程序中。加载 Regedit 并检查:
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags
\Layers
您可能会在其中找到大量列出的程序,它们以空格分隔:
- C:\Program 文件(x86)\ACDSee32\ACDSee32.exe
HIGHDPIAWARE
- C:\Program 文件(x86)\Google\Picasa3\Picasa3.exe
ELEVATECREATEPROCESS
- C:\Program 文件(x86)\skiStunt\skiStunt\bin\skiStunt.exe
WINXPSP2
- C:\Program 文件(x86)\Steam\Steam.exe
HIGHDPIAWARE ELEVATECREATEPROCESS
- C:\Program 文件(x86)\SysInternals\autoruns.exe
ELEVATECREATEPROCESS RUNASADMIN
- C:\Program 文件(x86)\Windows Live\Messenger\msnmsgr.exe
VISTASP2
- D:\游戏\使命召唤\CoDSP.exe
WINXPSP3
- 目录:\共享\Win32app\Spy\SPYXX.EXE
DISABLEDWM
检查你的程序是否不在其中。你还可以找到一组类似的条目(“全部用户“) 在:
HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers
答案3
如果应用程序是在 Windows Vista / 7 之前编写的,那么很有可能需要管理员权限才能运行。许多程序都假设安装者拥有管理员权限,因此它们只会写入程序员认为最好的注册表和文件系统部分。
我从自己的亲身经历中知道这一点。大约十年前,我在一家向大型汽车公司销售软件的公司工作。他们所有的 PC 都被锁定了。我们必须修改代码,以便仅具有“用户”权限的人可以安装它。