Windows10 DCOM报错10016 导致系统不定时黑屏死机
Table of Contents
背景
电脑一直以来时不时会突然黑屏,并且不会自动重启或者显示任何信息,尤其是看视频和玩游戏的时候,因为咱没有硬件层面没有排查的能力,一直拖着没有管。今天实在不能忍,打算从软件层面排查下问题所在。
不过,首先提一嘴目前并不能证明我电脑的黑屏死机100%的原因在于DCOM,也有可能是内存频率问题,内存显卡接触问题,甚至感觉有可能是电压不够。。。
收集信息
首先自然是使用事件查看器查看黑屏前的发生的异常事件了。于是注意到一连串的DistributedCOM的警告。事件ID是10016。具体来讲是某些DCOM组件没有Local Activation的权限。
提示模板为:
**分类** 权限设置并未向在应用程序容器 **容器别名** SID (**SID**)中运行的地址 LocalHost (Using LRPC) 中的用户 **用户名** SID (**SID**)授予针对 CLSID 为
{**容器对应的CLSID**}
、APPID 为
{**容器对应的APPID**}
的 COM 服务器应用程序的 Local Activation 权限。此安全权限可以使用组件服务管理工具进行修改。
两个星号包夹的地方为占位符,根据不同的容器内容会不一样。记录下的这些内容。
原因
根据网络和微软社区中相关问题的回复中可以确定,这个10016事件发生的原因是Microsoft组件没有某些DCOM组件所需的访问权限。
解决方法
用户组提权
容器信息收集
默认即使是管理员用户组也没有权限编辑DCOM组件的属性,所以这里需要给管理组提权:
- 按 win+x -> 事件查看器
- 依次展开“Windows日志”-“系统”
- 定位或者应用过滤器找到到异常关机前的DCOM的异常事件。事件ID为10016
- 从下方事件详情窗口的常规选项卡中观察提示信息是否匹配本文之前给的模板,如果匹配则记录下容器名,CLSID, APPID备用。(注意:我有个事件对应的容器名为“Unavailable”,显然这不是正常的容器名,我称之为容器别名。真正的容器名是在后面的步骤中从注册表中获取的名。)
提权
- 按 win+r 输入“regedit”打开注册表。
- 依次展开:“HKEY_CLASSES_ROOT” – “AppID”,再该路径下找到与刚才记录的APPID相同的注册表项名,点击该项,并记录下右侧窗体中“默认”项名对应的值名,这个是容器名,一会用的上。
- 在左侧窗口右击该项,弹出菜单中点击“权限”-“高级”
- 点击最上方所有者名字后面的“更改”文字按钮,在弹出窗体中“输入要选择的对象名称”中输入“Administrators”,点击“检查名称”,若框中文字自动变成了下划线样式,则点击“确定”,这样就可以更改所有者为“Administrators”。点击“应用”并关闭窗口。
- 再在当前权限设置窗口中上方框中组名分别选择“SYSTEM”(系统)和 “Administrators”(管理员)项并分别在下方的框中将他们的权限设置成“完全控制”。
- 依次展开:“HKEY_CLASSES_ROOT” – “CLSID”,再该路径下找到与刚才记录的CLSID相同的注册表项名。
- 重复同样的步骤更改所有者并给SYSTEM和Administrators授权。
容器授权
注:如果你打算为多个DCOM容器授权,需在上面的步骤完成后:
- 重新打开“组件服务”
- 或者右击刷新“组件服务”-“计算机”-“我的电脑”下“DCOM配置”,点击“刷新”
下面开始授权:
- 任务栏点击右键选择”搜索”,并设置为“显示搜索图标”。
- 再任务栏中点击放大镜打开搜索窗口,在输入框中输入“组件服务”右击搜索结果中的“组件服务”应用并以管理员身份启动。
- 启动后依次展开“计算机”-“我的电脑”-“DCOM配置”。
- 在中间框中找到刚才我们在注册表中记录的容器名对应的图标。
- 右击该图标依次点击属性-“安全”选项卡。在“启动和激活权限”框中选择“自定义”并点击“编辑”按钮。点击“添加”按钮。
- 在弹出窗体中“输入要选择的对象名称”中输入“LOCAL SERVICE”,点击检查名称,若框中文字自动变成了下划线样式,则点击确定。
- 在组和用户名的框中选择LOCAL SEVICE,在下面的框中勾选“本地启动”和“本地激活”后面的“允许”复选框。
至此配置完成。
网上有人提到这个解决方案可能在每次windows更新后要重新设置一遍,可能可以用脚本一键实现。以后可以研究下(每日挖坑 1/1)
那你的问题解决了吗