none
一个隐蔽的silverlight提升权限故障 RRS feed

  • 常规讨论

  • 从silverlight5开始,可以在项目设置中勾选“在浏览器内运行时需要提升的信任”来达到在浏览器内运行提权silverlight客户端的目的,在个特性很有用处。可我使用这个功能时遇到了一个奇怪的故障:我使用visual studio 2010开发一个silverlight5项目,发现上面那个设置项不起作用,无论是否勾选它,代码中的App.Current.HasElevatedPermissions总会返回false,那些需要提权运行的操作自然也都会失败。累死好几千脑细胞后才发现故障原因。

    当你勾选“在浏览器内运行时需要提升的信任”时,visual studio会做下面几件事情:

    1、在silverlight的项目文件(.csproj)中增加内容:<RequireInBrowserElevation>true</RequireInBrowserElevation>

    2、在项目的Properties文件夹中增加一个文件:InBrowserSettings.xml。

    3、在silverlight的项目文件(.csproj)中增加内容:<InBrowserSettingsFile>Properties\InBrowserSettings.xml</InBrowserSettingsFile>

    如果上面步骤都顺利完成就没什么问题。但如果项目的Properties文件夹正好有一个名为InBrowserSettings.xml的文件,就可能会有下面种故障发生:

    1、这个文件只是在文件夹里,没包含在项目中,那么visual studio增加InBrowserSettings.xml会失败,但不会给你任何提示。结果是看似“在浏览器内运行时需要提升的信任”这一项已经被勾选,但实际上并没有成功的提升silverlight运行权限,需要提权运行的代码都会失败,这个莫名其妙的故障搞的我焦头烂额。要解决这个故障,可以在解决方案资源管理器中查看所有文件,把InBrowserSettings.xml手动包含在项目中,并使用记事本打开项目文件手动添加上<InBrowserSettingsFile>Properties\InBrowserSettings.xml</InBrowserSettingsFile>。如果勾选“在浏览器内运行时需要提升的信任”后发现visual studio并没在Properties文件夹中增加InBrowserSettings.xml文件,可以判断这个故障已被触发。

    2、这个文件已经在这个文件夹里,而且已包含在项目中。visual studio会试图根据你的勾选来改变InBrowserSettings.xml中的内容,如果InBrowserSettings.xml文件正好处于只读状态(比如它被签入了),那么visual studio改变文件内容时会出错,结果是visual studio干脆的崩溃退出,退出前也不会给你任何提示。所以改变“在浏览器内运行时需要提升的信任”的勾选前,如果InBrowserSettings.xml文件已被签入或由于其它原因设了只读,请提前把它签出或去掉只读属性。

    上述两个故障中,第1个故障原因非常隐蔽。我曾经奇怪,为什么这么巧,偏偏在Properties文件夹偏偏有一个名为InBrowserSettings.xml的文件。后来经过询问同事才知道了原因,这不是一个巧合。我的同事曾经试验性的勾选“在浏览器内运行时需要提升的信任”,visual studio在他的项目中增加了InBrowserSettings.xml,他试验完后通过撤销签出项目取消了自己的操作。他认为这样就彻底回滚了自己的动作,但实际上不是,撤销签出只是撤销在项目中包含InBrowserSettings.xml文件,并不在项目文件夹中删除这个文件,所以他再次签入项目时,InBrowserSettings.xml就会被签入到TFS里,另外的同事获取新版本时会就会把这个未包括在项目中的InBrowserSettings.xml文件隐蔽的获取到Properties文件夹中,从面引发这个故障。

    希望能帮到大家,别再有人踩到这个地雷。


    Wantal

    2012年9月20日 9:56

全部回复