关于Win7系统中软件安装目录下ini配置文件的读写问题

来源:互联网 发布:网络监控摄像头 编辑:程序博客网 时间:2024/06/05 19:53

情景提要:
      安装采集系统软件至"C:\Program files\MultiCapture"文件夹中,采集系统软件中

有相关参数的ini配置文件。直接修改ini文件中的配置参数,保存,弹出“访问被拒绝”

窗口。


                                            

右键ini文件,点击"属性",切换至"Security"标签页,选中当前用户"Users(abing_hu

-PC"),可以发现下面的用户权限处没有“写”的权限。通过点击"Edit"按钮给当前用户

勾选所有权限,这样就可以修改ini配置文件了。

                           

诡异的现象:
      
       上图ini文件中的"DisplayBufferNumber=2"项对应于配置工具中的"屏幕个数:2",
ini文件中的相关参数可以通过配置程序来进行读取显示和修改,现做如下测试:

       <1>现在对ini文件进行手动修改并保存,更改为"DisplayBufferNumber=1",重新

打开配置程序,屏幕个数处仍为2。
      
运行采集软件效果仍为"屏幕个数:2"时的效果。


       <2>现在手动更改ini文件中"DisplayBufferNumber"项为2并保存,通过配置程

序设置"屏幕个数"项为1,重新打开ini文件,"DisplayBufferNumber"项仍为2。运行

采集软件效果为"屏幕个数:1"时的效果。


对于上述现象的发生,非常确定的2件事:
       <1>配置程序读取的ini文件的路径是正确的。通过printf函数打印出路径信息。
       <2>采集软件绝对是读取"DisplayBufferNumber"项来产生相应的效果的。




谜底揭晓:

      Vista和Win7采用"用户账户控制"的新技术。在Windows Vista之前,通常人们使

管理员身份运行应用程序。因此,应用程序可以随意读取和写入系统文件和注册

表键。如果标准用户运行此类应用程序,可能会因为无法访问而失败。Vista通过将

写入(以及后续的文件或注册表操作)重定向到每个用户配置文件内可写入位置的

方法,改善了此类应用程序兼容性问题。


      例如,如果某个应用程序尝试写入到c:\Program Files\Contoso\Setting.ini,而

用户没有写入到该目录(Program Files)的权限,写入操作将会被重定向到C:\Users

\Username\AppData\Local\VirtualStore\Program Files\Contoso\settings.ini。如果

某个应用程序尝试写入到注册表的"HKEY_LOCAL_MACHINE\Software\Contoso\"

位置,则会被自动重定向到"HKEY_CURRENT_USER\Software\Classes\VirtualStore

\MACHINE\Software\Contoso"或"HKEY_USERS\UserSID_Classes\VirtualStore

\Machine\Software\Contoso"。


      下图所示即为Windows中两个组件的虚拟化流程:文件虚拟化,以及注册表虚

拟化。

                                          



具体问题分析:

      当我们运行安装在"C:\Program Files\MultiCapture"中的采集软件时,采集软

件会在当前目录中读取相关的ini配置文件。此时并不会在"C:\Users\Username

\AppData\Local\VirtualStore\Program Files\MultiCapture"中生成ini配置文件,因

为标准用户拥有对"C:\Program Files"路径的可读和执行的权限。而当我们使用配

置工具进行配置ini文件时,由于没有"写"的权限,操作系统首先会在"C:\Users

\Username\AppData\Local\VirtualStore\Program Files\MultiCapture"中生成一份当

前配置文件的副本(数据重定向文件),然后根据配置工具的配置来修改ini文件

中相应的参数项。


      当采集软件运行并读取相关ini配置文件时,操作系统会根据用户的权限做一个

判别:如果当前用户为标准用户(只有可读和执行的权限),则继续判别所读的ini

文件是否存在着有"数据重定向"的ini文件若有则读取相应的数据重定向的ini文件,

若无则读取当前目录中的ini文件;如果当前用户为更高权限用户(还拥有"写"的权

限),则直接读取当前目录中的ini文件。


      现对之前所做两个测试中遇到的诡异现象做一个明确的解释:

      <1>这里虽然临时增加了用户对ini文件"写"的权限,且我们也可以更改ini文件中

参数项保存,但是对于系统中的用户控制模块来说权限修改还未生效,需要重启

以后才会采用新的权限。所以当前仍是标准用户的权限,配置工具和采集软件所读

取的ini文件仍是"数据重定向"的ini文件。


      <2>由于当前仍是标准用户权限,配置工具和采集软件所读取的ini文件仍是"数据

重定向"ini文件。