2009-05-25 11 views
9

Estoy probando mi aplicación en el Guest del usuario. Se bloquea con el siguiente error.'UnauthorizedAccessException' - 'Global .net clr networking'

'UnauthorizedAccessException' - 'Global.net redes clr'

Ahora, sé que puedo editar la política de seguridad en la máquina para permitir que el código CLR se ejecuta bajo invitados de fiar, pero ¿qué se debería hacer en una aplicación comercial?

(¿Firma y agrega los atributos del CAS?) Actualmente estoy leyendo toda la sección de seguridad, pero estoy en un apuro de tiempo, por lo tanto, apreciaré cualquier apuntador en la dirección correcta.

EDITAR: He rastreado el problema hasta utilizar la clase Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase. Si esto está incluido, aparece el error. Estoy buscando algo para agregar al manifiesto o de alguna otra manera para que cuando la aplicación se instala/ejecuta, le pida los permisos apropiados. No quiero tener que pedirle al usuario que llame personalmente a caspol o alguna otra herramienta.

Detalles Entorno: - App está utilizando .NET 3.0 - OS es Vista

Aquí está el seguimiento de la pila relevante para los interesados ​​en estas cosas:

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) 
+0

¿Dónde se cuelga? ¿En el arranque? Durante el funcionamiento normal? – blowdart

+0

durante el inicio, antes de que se ejecute cualquier parte de mi código. – moogs

Respuesta

5

¿Es posible agregar esto a su archivo app.config?

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

Esto dirigirá las clases de red para no intentar crear contadores de rendimiento que no funcionen en la cuenta Invitado.

La configuración anterior debería funcionar en .NET Framework 4 y superior, pero debido a un fallo de error en versiones anteriores.

+0

Hola, gracias! Lo intenté, pero lamentablemente System.Net todavía intenta usar contadores de rendimiento. ¿Podría indicarme una referencia para este bit? – moogs

+0

http://msdn.microsoft.com/en-us/library/ms229151.aspx es la documentación, pero no es muy esclarecedora. Permítanme seguir con algunas de las personas de System.Net y ver cuál es la solución correcta aquí. –

+2

Parece que en .NET 2.0/3.0/3.5 la configuración anterior solo evita que los datos se escriban en los contadores de rendimiento, en realidad no impide que se creen (que es donde ve este error). El problema se ha corregido para .NET Framework 4 sin embargo: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=387419 –

1

Por lo que entiendo, esto sucede porque la cuenta Invitado tiene algunos permisos muy extraños asignados. Esto es no un error que dice que no puede usar la red: la red básica todavía está disponible bajo confianza parcial.

Este error ocurre porque el CLR no puede acceder a uno de sus propios contadores de rendimiento, que se utiliza durante las operaciones de red. Este problema no debería ocurrir con otras cuentas de usuario: ¿necesita usar Guest específicamente? Una cuenta de usuario limitada normal debería funcionar bien. Se sabe que la cuenta de invitado tiene muchos problemas con los derechos de acceso en relación con .NET: la cuenta rara vez se utiliza en la práctica y pocas cosas se prueban en ella.

En cuanto a la seguridad de acceso al código, no importa en qué usuario ejecute el código: los permisos de CAS son los mismos para todos los usuarios, de forma predeterminada. El nivel de confianza está determinado por la ubicación del archivo ejecutable: ejecutar algo instalado en la máquina local le otorga plena confianza, y ejecutarlo desde otras ubicaciones otorga confianza parcial (consulte Grupos de códigos en Configuración de .NET Framework).

+0

Gracias por la respuesta. Necesito que mi aplicación también se ejecute sin problemas en la cuenta de Invitado. – moogs

0

Usted podría intentar fuerte nombrar sus asambleas a continuación, otorgándoles la confianza total a través de CASPOL, utilizando

caspol -fulltrust assemblyName 

Pero como dice Sander la cuenta de invitado no es una cuenta real, que no es uno que normalmente inicia una sesión, y tiene restricciones muy estrictas sobre él.

2

Para aquellos tipos pobres como yo que necesitan soportar la cuenta de invitado en los programas de framework 2.x (incluso si el CLR 4 está instalado, algunos viejos programas CLR2-compilados aún se ejecutarán bajo CLR2), aquí hay una función hacky que va a desactivar este problema contador de rendimiento de inicialización (véase la respuesta de Matt Ellis El problema con su respuesta es - como se ha dicho por algunos otros - que no siempre funciona.):

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