2009-05-25 14 views
9

Ich teste meine Anwendung unter dem Benutzer Gast. Es stürzt mit dem folgenden Fehler ab.'UnauthorizedAccessException' - 'Global .net clr networking'

‚UnauthorizedAccessException‘ - ‚Global.net clr Networking‘

Jetzt weiß ich, dass ich die Sicherheitsrichtlinie auf der Maschine bearbeiten kann, um CLR-Code zu erlauben unter Gastsystem ausgeführt zu trauen, aber was sollte man auf einem tun kommerzielle App?

(Signieren und CAS-Attribute hinzufügen?) Ich lese derzeit die gesamte Sicherheitsabteilung, aber ich bin in einer Zeit Prise, so dass alle Hinweise in die richtige Richtung geschätzt werden.

EDIT: Ich habe das Problem auf die Verwendung der Klasse Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase verfolgt. Wenn dies enthalten ist, wird der Fehler angezeigt. Ich bin auf der Suche nach etwas, das dem Manifest oder einer anderen Methode hinzugefügt werden kann, damit beim Installieren/Ausführen der Anwendung nach den entsprechenden Berechtigungen gefragt wird. Ich möchte nicht den Benutzer bitten, caspol oder irgendein anderes Werkzeug persönlich anzurufen.

Umwelt Details: - App ist .NET 3.0 mit - OS ist Vista

Hier ist der relevante Stack-Trace für die in diesen Dingen:

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

Wo stürzt es ab? Beim Start? Während des normalen Betriebs? – blowdart

+0

während des Starts, bevor irgendein Teil meines Codes ausgeführt wird. – moogs

Antwort

5

Ist es möglich, dies zu Ihrer app.config-Datei hinzuzufügen?

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

Dadurch werden die Netzwerkklassen angewiesen, keine Leistungsindikatoren zu erstellen, die nicht unter dem Gastkonto funktionieren.

Die obige Einstellung sollte in .NET Framework 4 und höher funktionieren, aber aufgrund eines Fehlers in früheren Versionen fehlgeschlagen.

+0

Hallo, danke! Versuchte es, aber System.Net versucht leider immer noch, Leistungsindikatoren zu verwenden. Könnten Sie mich auf eine Referenz für dieses Bit hinweisen? – moogs

+0

http://msdn.microsoft.com/en-us/library/ms229151.aspx ist die Dokumentation, aber es ist nicht super aufschlussreich. Lassen Sie mich mit einigen der System.Net-Mitarbeiter weitermachen und sehen, was die richtige Lösung ist. –

+2

So sieht es aus wie in .NET 2.0/3.0/3.5 die obige Einstellung verhindert nur, dass Daten in die Leistungsindikatoren geschrieben werden, es verhindert nicht tatsächlich, dass sie erstellt werden (wo Sie diesen Fehler sehen). Das Problem für .NET Framework wurde 4 jedoch behoben: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=387419 –

1

Von dem, was ich verstehe, dies geschieht, weil Dem Gastkonto sind einige sehr merkwürdige Berechtigungen zugewiesen. Das ist nicht ein Fehler, der besagt, dass Sie Netzwerk nicht verwenden können - grundlegende Vernetzung ist noch verfügbar unter teilweise Vertrauen.

Dieser Fehler tritt auf, weil die CLR nicht auf einen eigenen Leistungsindikator zugreifen kann, der während Netzwerkoperationen verwendet wird. Dieses Problem sollte bei anderen Benutzerkonten nicht auftreten. Müssen Sie speziell Gast verwenden? Ein normales Benutzerkonto sollte gut funktionieren. Es ist bekannt, dass das Gastkonto viele Probleme mit Zugriffsrechten in Bezug auf .NET hat - das Konto wird in der Praxis selten verwendet und nur wenige Dinge wurden jemals darauf getestet.

In Bezug auf die Codezugriffssicherheit spielt es keine Rolle, unter welchem ​​Benutzer Sie den Code ausführen - die CAS-Berechtigungen sind für alle Benutzer standardmäßig gleich. Die Vertrauensstufe wird durch den Speicherort der ausführbaren Datei bestimmt. Wenn Sie eine auf dem lokalen Computer installierte Datei ausführen, erhält diese volle Vertrauenswürdigkeit. Wenn Sie von anderen Standorten aus starten, wird teilweise Vertrauenswürdigkeit gewährt (siehe Codegruppen in der .NET Framework-Konfiguration).

+0

Danke für die Antwort. Ich brauche meine Bewerbung auch ohne Probleme unter dem Gastkonto laufen zu lassen. – moogs

0

Sie könnten versuchen, stark Ihre Baugruppen zu benennen sie dann voll Vertrauen über CASPOL gewähren,

caspol -fulltrust assemblyName 

mit Aber wie Sander das Gastkonto ist kein echtes Konto sagt, es ist nicht eine, die normalerweise anmeldet, und hat sehr strenge Restriktionen.

2

Für die armen Kerle wie mich, die den Gast-Account auf Framework 2.x-Programmen unterstützen müssen (auch wenn CLR 4 installiert ist, laufen einige alte CLR2-Programme noch unter CLR2), hier ist eine Hacky-Funktion das wird die Initialisierung dieses Leistungszählers deaktivieren (siehe Matt Ellis Antwort. Das Problem mit seiner Antwort ist - wie von einigen anderen angegeben - funktioniert nicht immer):