<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[gOxiA=苏繁=SuFan Blog]]></title> 
<link>https://maytide.net/index.php</link> 
<description><![CDATA[gOxiA,苏繁,sufan,Microsoft MVP]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[gOxiA=苏繁=SuFan Blog]]></copyright>
<item>
<link>https://maytide.net/read.php/1948.htm</link>
<title><![CDATA[Windows 应用程序的用户默认值和计算机默认值]]></title> 
<author>gOxiA &lt;sufan_cn@msn.com&gt;</author>
<category><![CDATA[Windows Client]]></category>
<pubDate>Fri, 14 Jun 2019 09:16:21 +0000</pubDate> 
<guid>https://maytide.net/read.php/1948.htm</guid> 
<description>
<![CDATA[ 
	<p><img src="http://goxia.maytide.net/attachment.php?fid=49"></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是时候写一篇日志进行这个问题的总结了，毕竟拖得时间太久，久到连 gOxiA 自己都要遗忘掉!背景是这样的，在某个案例中需要使用“start apps”调用某个应用，也就是说某个程序内部会通过 Windows 的 Start 命令调用一个应用程序，这个应用程序可能是 chrome 也可能是 msedge，这里以msedge 早期版本为例进行说明。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当我们在 cmd 命令提示符下使用“start msedge”后，正常情况应该会默认启动基于 Chromium 开发的 Edge 浏览器，但是却遇到了错误提示，内容为“Windows 找不到文件 'msedge'，请确定文件名是否正确，再试一次”。当然现在的版本已经解决了这个问题，但是在某些极端环境下，不论是 msedge 还是 chrome ，甚至其他应用，也都可能会遭遇到该问题。</p><p><a href="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/start_msedge_err.png"><img width="630" height="306" title="start_msedge_err" style="display: inline; background-image: none;" alt="start_msedge_err" src="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/start_msedge_err_thumb.png" border="0"></a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 起初发现这个问题时，首先想到的分析方法就是抓取轨迹进行分析。确实有所收获，gOxiA 发现在执行“Start msedge”时会遍历注册表，并最终读取“HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\msedige.exe”路径下定义的值，而结果是未能找到该值。</p><p><a href="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/hklm_no_msedge.png"><img width="634" height="9" title="hklm_no_msedge" style="display: inline; background-image: none;" alt="hklm_no_msedge" src="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/hklm_no_msedge_thumb.png" border="0"></a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此时，问题已经很明朗了，修复该路径定制的值，问题即可解决！但其实该问题却引出了更底层的一些知识，而且非常有价值。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在早先的排错过程中，gOxiA 尝试了重装应用程序，排除了安装问题。由于最早遇到的类似案例就是基于 Chrome 的，所以是先对 Chrome 进行了分析。下图是当时对 Chrome 分析时的截图，会发现执行“Start chrome”后，会遍历注册表但最终会以“HKCU\Software\MicrosoftWindows\CurrentVersion\App Paths\chrome.exe”定义的值为准。</p><p><a href="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/HKCU_Process.png"><img width="634" height="273" title="HKCU_Process" style="display: inline; background-image: none;" alt="HKCU_Process" src="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/HKCU_Process_thumb.png" border="0"></a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此时，不论 HKLM 下如何定义都不会生效，但是 msedge 的情况却正好相反，HKCU 下有定义的数据，也无法被正常调用。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 难道是因为安装应用程序的模式导致的？！我们知道，常见的 msi 安装包默认都会以计算机配置模式进行安装，所以需要以管理员权限执行 msi 安装包，默认应用程序会被安装在 ProgramFiles 目录下，如果你下载了 chrome 的脱机安装包，那么你会发现其安装格式为 msi。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而如果安装包是 exe 格式，以 chrome 和 msedge 为例，通过云下载数据到本地后，会启动一个真正的安装过程，而这个安装过程是面向用户配置的，也就是说当前用户即使不是管理员，也能够正常安装它们，因为应用程序数据写入到了当前用户配置文件下，而涉及注册表的部分会写入到 HKCU 下。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么两者的区别是什么呢？其实显然易见，排除目录不谈，重点说说注册表，面向用户配置的在 HKCU 下，面向计算机配置的在 HKLM 下。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看起来执行"start msedge"时发生错误是因为它要去读 HKLM 下的定义数据，而 HKLM 下无数据，也就说明当先 msedge 应用实例是安装在计算机配置下，那么也论证了这是 msedge 的一个 bug。（PS：该问题仅发生在 msedge 早期的开发版本中，gOxiA 已经向产品组提交了 bug，目前已经修复！）</p><p><a href="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/hkcu_msedge_error.png"><img width="634" height="248" title="hkcu_msedge_error" style="display: inline; background-image: none;" alt="hkcu_msedge_error" src="http://goxia.maytide.net/ftpup/2018/845196066d9a_E46E/hkcu_msedge_error_thumb.png" border="0"></a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而对于之前在 Chrome 上遭遇的此类问题，可论证不是产品 bug，因为该应用程序实例是安装在用户配置下的，所以会依据 HKCU 下的定义数据执行，而发生故障是因为 HKCU 下的定义数据被“流氓”软件破坏导致的，所以必须修复 HKCU 下的定义数据。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 综上，貌似这些执行机制是一个规范设计，那么就需要找出微软官方的依据进行论证。功夫不负有心人，在 Windows Shell 的官方文档中确实有相关的说明。</p><p>"<em><font style="background-color: rgb(255, 255, 0);">Per-user default settings are specific to an individual user account on the system. If per-user default settings are present, they take precedence over corresponding per-computer defaults for that account.</font></em>"</p><p>具体可参考：<a href="https://docs.microsoft.com/en-us/windows/desktop/shell/vista-managing-defaults">https://docs.microsoft.com/en-us/windows/desktop/shell/vista-managing-defaults</a></p>
]]>
</description>
</item><item>
<link>https://maytide.net/read.php/1948.htm#blogcomment5219</link>
<title><![CDATA[[评论] Windows 应用程序的用户默认值和计算机默认值]]></title> 
<author>游客 &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 14 Jun 2019 14:26:27 +0000</pubDate> 
<guid>https://maytide.net/read.php/1948.htm#blogcomment5219</guid> 
<description>
<![CDATA[ 
	估计business版的msi安装包msedg可能得消费者版本出了正式版之后吧。。。
]]>
</description>
</item>
</channel>
</rss>