程序员人生 网站导航

NTFS 权限导致的程序疑难问题排查

栏目:服务器时间:2013-11-18 18:12:31

  家中台式电脑上的 Windows 7 是在前年刚买的时候装的,一直没有重装。在这期间没有使用任何第三方优化软件,但运行起来一切正常。这说明只要使用得当,Windows 完全可以很稳定的长期运行,不需要定期重装,也不需要使用优化软件。

  不过,这个系统最近出了一点问题,每天都会有 mcupdate.exe 这个进程产生异常,无法正常执行。

image

  由于当前系统中安装有 Visual Studio,因此在产生异常时会弹出是否使用 Visual Studio 进行调试的对话框。

  mcupdate.exe 是 Windows Media Center 组件(包含在Win7家庭高级版以上版本中)的更新程序,用于检测更新微软为媒体中心提供的在线服务和电视节目指南等内容。例如“互联网视频”功能本身不包含在 Windows 中,是通过 mcupdate.exe 网络更新的方式安装到系统中的。

  如果用户没有运行过 Windows Media Center,该更新程序并不会运行;如果用户曾经运行过 Windows Media Center,那么他会被 Windows “任务计划”周期性的调用执行。这也就是为什么每天都会发生一次异常。

  所幸 Windows Media Center 是基于 Microsoft .NET Framework 开发的,由于运行的是 MSIL 代码而不是直接以二进制代码运行,所以在没有对代码进行混淆和加密的情况下,可以很方便的进行调试。开始调试后可以直接看到错误的原因:

image

  Failed to recover store: C:ProgramDataMicrosofteHomemcepg2-1.db

  意思是无法还原 Windows Media Center 的电视节目指南数据库 mcepg2-1.db 文件。先打开文件所在位置看一下有何异常,文件好好的在那里,看起来一切正常啊。没关系,继续在Visual Studio中查看异常信息,点击“查看详细信息…”,可以看到如下内容:

image

  原来,出发这个异常的原因是另外一个异常:Could not open file stream: [c:programdatamicrosoftehomeCounter.mem]. Error code: 5. 无法打开文件 Counter.mem,而实际上这个文件我可以正常打开。

  不过,想到 mcupdate.exe 是由任务计划程序启动而不是由用户启动的,所以其使用的用户帐户应该是系统服务帐户,而不是管理员用户帐户,可能是由于NTFS权限的原因,导致系统服务帐户不能打开这个文件。对比查看这两个文件的属性和 mcupdate.exe 的帐户权限信息,内容如下:

image image

  果然,该程序以 NETWORK SERVICE 帐户身份运行(隶属于Users组),而发生访问错误的文件只允许Users组账户具有读取权限。为Users用户组手动分配读写权限之后,在系统的任务计划程序库中找到 mcupdate 任务,手动运行它,果然工作正常,再也没有出现异常提示:

image

  但我认为,这两个文件的权限一定是被修改了,才会导致这样的问题。那他们的默认权限究竟是怎样的呢?一种方法是从其他正常的系统中查看一下这里的文件权限,另外还可以尝试一下把他们删除掉,看程序能否自动创建他们,如果可以,那一定可以为他们分配一个正确的NTFS访问权限列表。

  为了保险起见,把 C:programdatamicrosofteHome 文件夹备份了一下,然后整个删除掉,再手动运行 mcupdate 任务,果不其然,程序自动新建了一个 ehome 文件夹,看看其文件夹权限,原来是这样的:

image

  并且,ehome 文件夹下的文件全都继承了它的权限列表,因此现在应该不会有问题了。

  为何该文件夹的权限被修改,我没有去深究,但是这个问题启发我在以后的排错过程中应当包含对访问权限的测试和检查,有时候即使文件的其他方面没有任何问题,错误的访问权限也会带来一些麻烦,所以奉劝大家以后也不要随便修改系统文件和文件夹的NTFS权限,说不定下次出问题就没这么容易排查了。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐