代码之家  ›  专栏  ›  技术社区  ›  moogs

“UnauthorizedAccessException”-“全局\.NET CLR网络”

  •  9
  • moogs  · 技术社区  · 15 年前

    我正在用户来宾下测试我的应用程序。它因以下错误崩溃。

    “UnauthorizedAccessException”-“全局.NET CLR网络”

    现在,我知道我可以编辑机器上的安全策略,让在来宾模式下运行的clr代码可信,但是在商业应用程序上应该怎么做呢?

    (签名并添加CAS属性?) 我目前正在阅读整个安全部分,但我正处于时间紧迫的情况下,所以任何指向正确方向的指针都会受到赞赏。

    编辑:我已经追踪到问题是使用了Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase类。如果包含此项,则会出现错误。 我正在寻找一些添加到清单中的内容或其他方式,以便在安装/运行应用程序时,它将请求适当的权限。我不想让用户亲自给caspol或其他工具打电话。

    环境详情: -应用程序正在使用.NET 3.0 - OS是Vista

    下面是这些内容的相关堆栈跟踪:

    Unhandled Exception: System.UnauthorizedAccessException: Access to the path 'Glo
    bal\.net clr networking' is denied.
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.Threading.Mutex.<>c__DisplayClass3.<.ctor>b__0(Object userData)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCl
    eanup(TryCode code, CleanupCode backoutCode, Object userData)
       at System.Threading.Mutex..ctor(Boolean initiallyOwned, String name, Boolean&
     createdNew, MutexSecurity mutexSecurity)
       at System.Diagnostics.SharedUtils.EnterMutexWithoutGlobal(String mutexName, M
    utex& mutex)
       at System.Diagnostics.SharedPerformanceCounter.Verify(CategoryEntry* currentC
    ategoryPointer)
       at System.Diagnostics.SharedPerformanceCounter.FindCategory(CategoryEntry** r
    eturnCategoryPointerReference)
       at System.Diagnostics.SharedPerformanceCounter.GetCounter(String counterName,
     String instanceName, Boolean enableReuse, PerformanceCounterInstanceLifetime li
    fetime)
       at System.Diagnostics.SharedPerformanceCounter..ctor(String catName, String c
    ounterName, String instanceName, PerformanceCounterInstanceLifetime lifetime)
       at System.Diagnostics.PerformanceCounter.Initialize()
       at System.Diagnostics.PerformanceCounter.set_RawValue(Int64 value)
       at System.Net.NetworkingPerfCounters.Initialize()
       at System.Net.Configuration.SettingsSectionInternal..ctor(SettingsSection sec
    tion)
       at System.Net.Configuration.SettingsSectionInternal.get_Section()
       at System.Net.Sockets.Socket.InitializeSockets()
       at System.Net.Sockets.Socket.get_SupportsIPv4()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.get_
    HostName()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Regi
    sterChannel(Boolean SecureChannel)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(
    String[] commandLine)
    
    5 回复  |  直到 15 年前
        1
  •  5
  •   Matt Ellis    15 年前

    是否可以将此添加到app.config文件中?

    <configuration>
       <system.net>
          <settings>
             <performanceCounters enabled="false" />
          </settings>
       </system.net>
    </configuration>
    

    这将指导网络类不要尝试创建在来宾帐户下不起作用的性能计数器。

    上述设置在.NET Framework 4及更高版本中有效,但由于早期版本中的错误而失败。

        2
  •  2
  •   Simon Mourier    10 年前

    对于像我这样需要在framework 2.x程序上支持来宾帐户的穷人(即使安装了clr 4,一些旧的clr2编译程序仍将在clr2下运行),这里有一个hacky函数,它将禁用此性能计数器初始化问题(请参阅matt ellis answer)。他回答的问题是——正如其他人所说——并不总是有效的):

        public static bool DisablePerfCountersIfNeeded()
        {
            try
            {
                NetworkInterface.GetIsNetworkAvailable();
                return false;
            }
            catch(UnauthorizedAccessException)
            {
            }
    
            Type type = typeof(Uri).Assembly.GetType("System.Net.NetworkingPerfCounters");
            FieldInfo fi = type.GetField("initialized", BindingFlags.Static | BindingFlags.NonPublic);
            bool initialized = (bool)fi.GetValue(null);
            fi.SetValue(null, true);
            return true;
        }
    
        3
  •  1
  •   Sander    15 年前

    据我所知,发生这种情况是因为客户帐户有一些非常奇怪的权限分配给它。这是 一个错误表明您不能使用网络-基本网络在部分信任下仍然可用。

    发生此错误的原因是clr无法访问自己的性能计数器之一,该计数器在网络操作期间使用。这个问题不应该出现在其他用户帐户上-您是否特别需要使用guest?一个普通的有限用户帐户应该可以正常工作。众所周知,guest帐户在与.net相关的访问权限方面存在许多问题-该帐户在实践中很少使用,并且很少在其上进行测试。

    关于代码访问安全性,默认情况下,您在-cas权限下运行代码的用户对所有用户都是相同的。信任级别由可执行文件的位置决定-运行本地计算机上安装的某个程序授予它完全信任,从其他位置运行授予部分信任(请参见.NET框架配置中的代码组)。

        4
  •  0
  •   blowdart    15 年前

    您可以尝试对程序集进行强命名,然后通过 CASPOL 使用

    caspol -fulltrust assemblyName
    

    但正如桑德所说,来宾帐户不是一个真正的帐户,它不是一个正常登录,并对其设置了非常严格的限制。

        5
  •  0
  •   moogs    15 年前

    尤瓦扎在Microsoft Connect中找到它。这是一个在.NET 4.0中修复的错误

    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=387419

    谢谢大家的帮助!