我有一个前端应用程序(在 PowerBuilder 中,但这并不重要),它正在调用一个用 Java 开发并与 launch4j 打包的帮助应用程序。
应用程序的最终用户可以自由配置到前端的路径,其中一些文件将由前端或后端生成。
我注意到,在激活了 UAC 的 Windows Vista 或 Windows7 上,如果用户(没有管理员权限)已将输出配置为C:\
,则生成的文件会以静默方式虚拟化到c:\Users\user_name\AppData\Local\VirtualStore\
目录中。
但是,当该过程使 java 应用程序FileOutputStream
在同一文件中创建一些文件(通过 a )时C:\
,java 会因“拒绝访问”异常而失败,这可能与用户无法访问驱动器根目录这一事实相一致,但另一个应用程序是虚拟化的。任务管理器确认一个是虚拟化的,而不是另一个。
我发现其他 SO question提供了一些线索但不是我的案例的答案,因为这两个应用程序在 32 系统上都是 32 位的,并且两者都没有涉及清单。
有没有办法让 java 表现得像 PB 应用程序(即被虚拟化 - 它是客户请求)?当然,更好的解决方案是检查路径是否可访问,如果不是,则通知用户。
编辑: 在查看 java.exe 二进制文件时,我注意到它包含一个声明(但我不熟悉)
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
也许这是问题的答案:java不是设计虚拟化的?编辑:我确实明白清单机制会禁用虚拟化。
结语:感谢您的解释,您的论点有助于改变客户的要求。现在人们承认,处理缺少写入某些文件夹的权限比让 Windows 虚拟化以太中某处的文件要好:o)