如果我尝试在 Excel 2016(桌面版)的 Office-js 加载项中运行此代码,它会抛出错误并显示访问被拒绝。
ngOnInit() {
console.log('Writing to localStorage...' );
localStorage.setItem('foo', 'bar');
console.log('done.');
}
但是,这只发生在一台计算机上,但在其他所有计算机上都可以按预期工作。此外,此代码在包括 IE 11 在内的任何浏览器中运行时都可以完美运行。此外,如果我在管理员模式下运行 excel,它也可以按预期运行。
在 Excel 的 IE11 沙盒实例中写入 localStorage 时,某些权限或某些内容被关闭,但我不知道它在哪里或是什么。
我想我已经尝试了对此相关问题的所有修复,但在这种情况下,它们似乎都没有发挥作用( Access Denied for localstorage in IE10 )。
更多背景: 最初,这在我的计算机上有效(我试图为同事修复它),但我将 CachePath 注册表项(如此处所述: Access Denied for localstorage in IE10 )更改为 Local 而不是 LocalLow ,以便能够重现该错误在我的盒子上。然而,在尝试了各种方法来修复它之后,即使将该注册表项切换回 LocalLow 也无法像我预期的那样解决我的盒子上的问题。
但是,使用进程监视器,我可以看到它使用了错误的路径并忽略了注册表项更新:
为什么它忽略我的注册表更新?
有什么想法吗?
最佳答案
简短回答:
关闭 IE 和 Excel 并运行此命令:
icacls %userprofile%\Appdata\LocalLow /t /setintegritylevel (OI)(CI)L
仍然无法工作?打开regedit并从注册表中删除这两个文件夹:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\Cache\Extensible Cache Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\LowCache\Extensible Cache
仍然无法工作?从注册表中删除整个 Internet Explorer 文件夹:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer
更长的答案:
通常,在 Excel 内以保护模式运行的 IE11 会将 JavaScript 中 localStorage 对象中设置的任何内容写入此文件位置:
%userprofile%\AppData\LocalLow\Microsoft\Internet Explorer\DOMStore
注意路径中的 LocalLow 文件夹。大多数程序会将数据写入本地目录(这是仅保留在本地计算机上的数据,而不是漫游数据,无论他们登录到何处,漫游数据都会随其配置文件漫游),但 LocalLow 文件夹中的 Low 指的是 Windows 引入的内容在 Vista 中称为 "Integrity" Levels 。我相信 Excel 中的保护模式,IE 只能处理低完整性级别的文件,通常这不是问题,因为 LocalLow 中的所有内容都应该是低完整性的。
LocalLow 中的子文件夹以某种方式将其完整性级别设置为高于低值。
- 在这种情况下,即使用户对他们尝试写入的文件拥有完全权限,如果只能处理低完整性文件的进程尝试对较高完整性文件执行某些操作,他们的访问也会被拒绝。里>
通过将 LocalLow 中的所有内容设置回低完整性来修复此问题:
icacls %userprofile%\Appdata\LocalLow /t /setintegritylevel (OI)(CI)L
- 如果在管理员模式下运行 Excel 时一切正常,则可能是问题所在。 (管理员用户以高度完整性运行,不会出现这些问题)
不知何故,IE11 尝试将 localStorage 写入 DOMStore 目录,但位于 LOCAL 文件夹下。
- IE 在注册表中查找应写入 localStorage 的路径地址(该地址可能会根据 IE 运行的模式/设置而改变)。
- 有时该路径会变得困惑,需要修复。这里的答案显示了注册表中您可以将 Local 更改为 LocalLow 的位置,以便它写入正确的 DOMStore 文件夹:https://stackoverflow.com/a/23583134/3806701
- 这里最大的问题是,你如何知道它首先要写入的位置?使用进程监视器这个很酷的工具,您可以看到 iexplore.exe 进程的幕后情况,并准确查看它正在查找/获取哪些注册表项以及它试图写入的确切位置: https://learn.microsoft.com/en-us/sysinternals/downloads/procmon enter link description here
最后,如果上述解决方案都不能解决问题,并且注册表的 CachePath 已正确设置为在路径中包含 LocalLow,我删除了注册表中的以下项:
首先备份注册表可能是一个好主意,以防万一,也是最佳实践,同时确保并关闭 iexplore.exe 的所有实例,然后删除这些项:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion\Internet Settings\5.0\Cache\Extensible Cache Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows \CurrentVersion\Internet Settings\5.0\LowCache\Extensible Cache Computer\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer
对我来说,这比重新安装 IE 更好,下次启动它时,它会认为它已重新安装,并将正确设置注册表文件夹...
关于windows-10 - IE 11/Office.js : Access is Denied trying to use localStorage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48331783/