DISM 拒绝访问的原因(转载)


Catalogue
  1. 1. 参考资料

原作者题:前些日子在用DISM操作映像的时候遇到了拒绝访问的问题(详见:http://blog.163.com/silence_night/blog/static/24347908120151264914357),那时根据日志以为真的是权限问题,最近闲下来又开始研究这个问题。


还是从日志着手:

1
2
2015-02-02 15:00:45, Error                 DISM   DISM WIM Provider: PID=9528 G:\Windows\WinSxS\amd64_microsoft-windows-i..l-keyboard-00000807_31bf3856ad364e35_10.0.9926.0_none_c4cb587719c7f0c9\KBDSG.DLL (HRESULT=0x80070005) - CWimManager::WimProviderMsgLogCallback  
[9528] [0x80070005] RestoreFilesCallback:(5201): 拒绝访问。[9528] [0x80070005] EnumImageDataEntries:(1591): 拒绝访问。[9528] [0x80070005] GetImageErrorCode:(3784): 拒绝访问。[9528] [0x80070005] GetImageErrorCode:(3784): 拒绝访问。[9528] [0x80070005] ImageWorkerThread:(534): 拒绝访问。[9528] [0x80070005] ImageWorkerThread:(534): 拒绝访问。[9528] [0x80070005] RestoreAllData:(2551): 拒绝访问。[9528] [0x80070005] WIMApplyImageInternal:(1189): 拒绝访问。

我大致浏览了一下C:\WINDOWS\WINSXS文件夹,发现里面有很多类似amd64_microsoft-windows-i..l-keyboard-00000807_31bf3856ad364e35_10.0.9926.0_none_c4cb587719c7f0c9这样的文件夹,每个文件夹中都有一个DLL文件,都是以KBD开头,KBD明显是keyboard的缩写,所以这些个DLL肯定是类似键盘驱动的文件。

而查看文件属性里的详细信息也证实了这一点:

看来是瑞典和德国的键盘布局链接库文件。

之前一直是把目光放到后面的拒绝访问上面,后来一想,肯定不是权限问题,因为我最后动用了TrustedInstaller权限却还是提示拒绝访问,所以肯定是因为这个文件被占用了导致拒绝访问的,那如果我把这个文件删掉看看呢?当然直接删除肯定是不明智的,于是先尝试用超级命令行来备份出来。

复制也是一样拒绝访问,看来这个文件时时刻刻在内存中。

没办法了,直接进入PE然后复制出来并删除掉源文件。

然后重启之后尝试mount一个7601的WIM,结果成功了。

看来还真的是这个KBDSG.DLL搞的鬼,但是为什么呢?我们平时用的都是KBDUS.DLL,即美式键盘布局,所以这个KBDSG.DLL平时应该是用不到的,但是不能删除就证明这个文件其实一直都在内存之中,所以这里还有一点疑问。

另外一点疑问就是,虽然操作7601的WIM会因为拒绝访问而失败,但是操作9600的WIM却没有任何问题(DISM版本就是9600.17031),9600的DISM操作9600和9600之前的WIM所调用的东西是不一样的,言外之意就是,这个KBDSG.DLL是DISM处理旧版本WIM的组件之一,然后因为实时加载在内存中导致DISM无法直接调用而提示拒绝访问,不过为什么要调用这个KBDSG.DLL,还是不得而知。


参考资料