“没有权限”
如果我们比较一下EditPlus和记事本的exe文件,我们就可以看到区别了:
比较一下EditPlus和记事本的exe文件
我们会发现记事本exe文件的manifest中多了以下代码:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
以上代码告诉Vista上的UAC,记事本现在使用asInvoker的权限,也就是和调用者同样的权限;我在专门介绍UAC的文章中提到过,Vista上的用户默认是标准用户,没有访问\program files\的权限,这就是为什么记事本会保存失败。
多用户应用环境
从Windows开始支持多用户开始,其实就已经有了用户目录的概念,但是我们一直都没有在软件开发中对这个问题作足够多的重视,造成了很多的应用程序都把一些用户自己的配置内容写入到了\program files\application name目录中。这个问题有很多人不理解,到底那些内容是应该保存在\program files\application name目录中,那些应该保存到\users\username\appdata目录中。其实我们可以简单的这样区分:
\program files\application name:保存安装过程中固化的应用程序配置,这些配置不应被个别用户更改;比如:固定的网关,服务器地址,应用程序的动态链接库列表,程序版本信息等。
\users\username\appdata:保存可以由用户修改的内容,并且这个配置文件应该是在应用程序第一次运行的时候由程序动态创建的。比如:窗口的位置,大小,上次登录的时间,用户名,cookie等等。
为什么不能由安装程序创建这个文件呢?主要是为了支持无值守的部署情况,这种情况下安装程序无从知晓个别用户的具体情况;所以无法正确创建这个文件。
其实,创建这个文件最简单的方式就是使用.net framework 中的Appl???$?icationBlock的Configuration模块,因为它会自动的处理文件的读写和创建;对应用程序是完全透明的。