'UnauthorizedAccessException' - 'Global \ .net clr networking'

时间:2009-05-25 04:37:59

标签: .net security

我正在用户Guest下测试我的应用程序。它崩溃时出现以下错误。

'UnauthorizedAccessException' - 'Global.net clr networking'

现在,我知道我可以编辑计算机上的安全策略,以允许在guest虚拟机下运行的CLR代码受到信任,但是应该在商业应用程序上做什么?

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

编辑:我已经跟踪了使用Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase类的问题。如果包含此项,则会显示错误。 我正在寻找要添加到清单或其他方式的东西,以便在安装/运行应用程序时,它会要求相应的权限。我不想要求用户亲自调用caspol或其他工具。

环境详情:   - 应用程序正在使用.NET 3.0   - 操作系统是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 个答案:

答案 0 :(得分:5)

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

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

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

上面的设置可以在.NET Framework 4及更高版本中运行,但由于早期版本中的bug失败。

答案 1 :(得分:2)

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

    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;
    }

答案 2 :(得分:1)

根据我的理解,这是因为Guest帐户分配了一些非常奇怪的权限。这是错误,表示您无法使用网络 - 基本网络仍可在部分信任下使用。

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

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

答案 3 :(得分:0)

您可以尝试使用

强制命名您的程序集,然后通过CASPOL授予他们完全信任
caspol -fulltrust assemblyName

但是,由于桑德说Guest帐户不是真实帐户,所以通常不会登录,并且对帐户有严格的限制。

答案 4 :(得分:0)

Yowza。在Microsoft Connect中找到它。这是.NET 4.0中修复的错误

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

感谢大家的帮助!