我正在使用一些传统应用程序(10-15岁),并试图find“正确”的方式来安装和运行它们(和任何用户应用程序)在Windows 7上的指导,而不需要完整的pipe理员权限。
换句话说,在可执行文件/只读文件所在的位置,用户数据/读写文件所在的位置以及registry项的位置,以避免在安装期间和在安装过程中出现UAC和Windows 7文件/registry虚拟化问题运行。
几年前,我似乎记得有关这个主题的微软白皮书,但是现在还找不到任何相关的信息。 我已经在用户端find了信息(如何通过兼容性调整让Windows应用程序在Windows 7上运行),但是在开发人员方面却没有(如何创build/安装应用程序以便在Windows 7本身很好地运行)。
任何指向这样的信息的指针将不胜感激。 谢谢。
渣子
您正在考虑Windows徽标要求 。
- 默认安装到正确的文件夹
用户应该对文件的默认安装位置具有一致和安全的经验,同时保持选择将应用程序安装到他们选择的位置。 还有必要将应用程序数据存储在正确的位置,以允许多个人使用同一台计算机,而不会破坏或覆盖彼此的数据和设置。
Windows提供文件系统中的特定位置来存储程序和软件组件,共享应用程序数据以及特定于用户的应用程序数据:
- 应用程序应默认安装到Program Files [16]文件夹中。 由于为此文件夹配置了安全权限,用户数据或应用程序数据不得存储在此位置
[16] %ProgramFiles%用于本机32位和64位应用程序, %ProgramFiles(x86)%用于分别在x64上运行的32位应用程序
所有必须在计算机上的用户之间共享的应用程序数据应存储在ProgramData中
所有专用于特定用户且不与计算机其他用户共享的应用程序数据必须存储在Users \\ AppData中
切勿直接写入“Windows”目录和/或子目录。 使用正确的方法来安装文件,如字体或驱动程序
在“每台机器”安装中,用户数据必须在第一次运行时写入,而不是在安装期间。 这是因为在安装时没有正确的用户位置来存储数据。 尝试通过应用程序在安装后修改计算机级别的默认关联行为将不成功。 相反,必须在每个用户级别声明默认值,这样可以防止多个用户覆盖对方的默认值。
接下来就是你不应该写信给任何需要管理权限的位置。
注意:您可以简单地通过(如所需的Windows 2000徽标要求)作为标准用户运行,在Windows 2000或Windows XP上测试所有这些内容。
由于大多数应用程序忽略了标识要求,并且在使用标准用户权限运行时会失败,因此Windows Vista包括通过虚拟化写入受保护位置来保持这些错误应用程序的功能 – 而不是使其失败。
您可以通过将您的应用程序显示给RunAs Invoker来退出这个兼容的黑客行为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> ... <!-- Disable file and registry virtualization --> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> ... </assembly>
徽标指南讨论UAC和写入某些位置的虚拟化:
- 遵循用户帐户控制(UAC)指南
某些Windows应用程序在管理员帐户的安全上下文中运行,许多Windows应用程序需要过多的用户权限和Windows权限。 控制对资源的访问使得用户能够控制他们的系统以防止不必要的改变。 控制访问资源的最重要的规则是提供用户执行他或她的必要任务所需的最少量的访问“标准用户上下文”。 遵循UAC准则,在需要时为应用程序提供必要的许可,而不会使系统不断暴露于安全风险。
大多数应用程序在运行时不需要管理员权限,作为标准用户应该可以正常运行。 Windows应用程序必须有一个清单21(嵌入的或外部的22)来定义它们的执行级别,并告诉操作系统应用程序需要什么特权才能运行。
例如,
应用程序的主要过程必须作为标准用户(asInvoker)运行。 任何管理功能都必须移动到以管理权限运行的单独进程中。
运行具有较高特权的主进程23的应用程序需要弃权(requireAdministrator或highestAvailable)
下列情况将考虑豁免:
- 将执行级别设置为highestAvailable的管理或系统工具,或者requireAdministrator
要么
- 只有辅助功能或UI自动化框架应用程序将uiAccess 24标志设置为true才能绕过用户界面特权隔离(UIPI)
然后是高DPI。 十年来Windows徽标的要求已经要求应用程序对高(即非96dpi)显示器作出适当的响应。 因为如果用户使用“大字体”,大多数应用程序都会崩溃,微软放弃了,就像虚拟化文件系统一样,他们也虚拟化了dpi设置。 除非应用程序选择退出兼容性攻击:Windows将骗你,并告诉你,你是96dpi。
只有在您正确地编写应用程序之后,才能向应用程序的清单中添加条目以禁用高dpi缩放:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> ... <!-- We are high-dpi aware on Windows Vista --> <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application> ... </assembly>
无论如何,这就是Windows 7客户端软件标识程序 。
注意:如果您在15年前(1995年)编写Windows应用程序,我假定您正在撰写:
而不是:
需要注意的是,Windows NT被设计为一个安全的操作系统。 你不能任意做任何你想做的事情。 这是与以下的根本区别:
没有安全的
写入Windows和Program Files文件夹需要管理员权限。 这是因为通常只有管理员应该安装应用程序。 但是,普通用户不能修改或损坏安装的程序 – 或者Windows本身的安装,例如:
Windows 7培训工具包在应用程序兼容性方面有很大的一部分,包括与UAC良好地玩,安装到适当的文件夹等。
如果您也希望使用Windows 7的新功能,而不仅仅是让您的应用程序兼容,那么套件中有很多可以帮助您。