为啥我的 .NET 应用程序从网络驱动器运行时会崩溃?
Posted
技术标签:
【中文标题】为啥我的 .NET 应用程序从网络驱动器运行时会崩溃?【英文标题】:Why does my .NET application crash when run from a network drive?为什么我的 .NET 应用程序从网络驱动器运行时会崩溃? 【发布时间】:2010-09-14 00:21:31 【问题描述】:我的 .NET 应用程序在从网络驱动器运行时失败,即使相同的可执行文件从本地硬盘驱动器运行得非常好?
我尝试像这样检查“完全信任”:
try
// Demand full trust permissions
PermissionSet fullTrust = new PermissionSet( PermissionState.Unrestricted );
fullTrust.Demand();
// Perform normal application logic
catch( SecurityException )
// Report that permissions were not full trust
MessageBox.Show( "This application requires full-trust security permissions to execute." );
但是,这没有帮助,我的意思是应用程序启动并且永远不会进入 catch 块。但是,调试版本显示抛出的异常是由 InheritanceDemand 引起的 SecurityException。有什么想法吗?
【问题讨论】:
当你说它“失败”时,它究竟是如何失败的?有错误吗? 你写的代码会放在 Catch 里吗? 今天刚遇到同样的问题,还没有找到解决办法,会关注这个问题... 【参考方案1】:这确实与网络位置上的应用程序不如本地硬盘上的应用程序可信度有关(由于 .NET 框架的默认策略)。
如果我没记错的话,微软终于在 .NET 3.5 SP1 中纠正了这个烦恼(在许多开发人员抱怨之后)。
我用谷歌搜索了它:.NET Framework 3.5 SP1 Allows managed code to be launched from a network share!
【讨论】:
通过让受影响的用户下载服务包来验证这一点,一切都很好。谢谢! 太棒了!之前我不得不将 CasPol 与我们为一些客户创建的实用程序一起使用。在调用实用程序之前创建脚本并运行它是一件很痛苦的事情,因为它是从网络位置运行的。 更新:在 .NET 3.5 SP1 中修复的问题似乎在安装 .NET 4.0 运行时时再次出现。 我第二个 0xA3。无法弄清楚为什么我有 .NET 3.5 SP1,但我仍然看到这个问题 - 每个人都说 SP1 修复了它。但我也安装了第 4 版,所以你可能会在那里做些什么。【参考方案2】:您是否尝试过使用CasPol to Fully Trust a Share?
【讨论】:
几乎值得一票,但它提供了解决方案而没有解释问题。【参考方案3】:您可能已经这样做了,但您可以使用 CasPol.exe 为指定的网络共享启用 FullTrust。
例如
cd c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
CasPol.exe -m -ag 1.2 -url file:///N:/your/network/path/* FullTrust
更多信息here。
【讨论】:
懒开发版:C:\Windows\Microsoft.NET\Framework\v4.0.30319>CasPol.exe -m -ag 1.2 -zone Intranet FullTrust
访问被拒绝(来自管理外壳)。典型的窗户。我实际上是在尝试从共享到主机的 VM 运行某些东西,需要运行 office 版本。【参考方案4】:
如果这是 .NET 2.0 或更高版本,则创建 ClickOnce 是为了真正帮助解决此部署问题。我只使用它部署到网络共享。
【讨论】:
【参考方案5】:这是微软在 .net 框架中内置的安全性。这是一种阻止恶意软件以完全权限在本地运行的方法,因此您无法在代码中以编程方式更改此设置。
您需要做的是增加对特定程序集的信任。您可以在 .NET Framework 配置(控制面板->管理工具)中执行此操作,并且必须在每台计算机上完成。
与任何安全措施一样,这很麻烦,但可以帮助世界减少感染等等...
【讨论】:
...阻止恶意软件...您发现有多少恶意软件是用 .NET 编写的?任何非 .NET 可执行文件都可以使用完全权限(默认情况下)从网络运行。唯一的区别是 .NET 默认情况下不允许它,而 windows 允许。 好吧,在允许执行 Win32 二进制文件的同时阻止托管代码并不是一种安全措施...【参考方案6】:我所要做的就是将文件标记为只读(可能不相关)并将除完全控制之外的所有权限授予经过身份验证的用户。我在这样做之前遇到了这个问题,当时我只为域用户设置了网络共享。
我发现了这个解决方法,因为管理员共享 (\server\C$) 和我自己的 PC 共享都没有这个问题。
编辑:应用面向 .NET 3.5,此处没有 SP1(版本 3.5.7283)
【讨论】:
以上是关于为啥我的 .NET 应用程序从网络驱动器运行时会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我使用 JSON.NET 反序列化时会忽略我的默认值?
为啥我的自托管 NancyFX 应用程序在通过 HTTPS 运行时会挂起?