2009-05-25 14 views
9

Testuję swoją aplikację pod Guest Guest. To zawiesza się z następującym błędem."UnauthorizedAccessException" - "Global .net clr networking"

„UnauthorizedAccessException” - „Global.net clr networking”

Teraz wiem, że mogę edytować zasady zabezpieczeń na urządzeniu, aby umożliwić kod CLR działa pod gościa można ufać, ale co należy zrobić na zasadzie aplikacja komercyjna?

(Zarejestruj i dodaj atrybuty CAS?) Obecnie czytam całą sekcję bezpieczeństwa, ale jestem w szczypie czasowym, więc wszelkie wskazówki we właściwym kierunku zostaną docenione.

EDYCJA: Zidentyfikowaliśmy problem z wykorzystaniem klasy Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase. Jeśli zostanie uwzględniony, pojawi się błąd. Szukam czegoś do dodania do manifestu lub w inny sposób, aby po zainstalowaniu/uruchomieniu aplikacji, poprosił o odpowiednie uprawnienia. Nie chcę prosić użytkownika o osobiste wywołanie caspol lub innego narzędzia.

Środowisko Szczegóły: - App używa .NET 3.0 - OS jest Vista

Oto właściwy ślad stosu dla tych w tych rzeczach:

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

Skąd się on zawiesza? Na starcie? Podczas normalnej pracy? – blowdart

+0

podczas uruchamiania, zanim jakakolwiek część mojego kodu zostanie wykonana. – moogs

Odpowiedz

5

Czy można to dodać do pliku app.config?

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

Spowoduje to, że klasy sieciowe nie będą próbowały tworzyć liczników wydajności, które nie działają na koncie Gość.

Powyższe ustawienie powinno działać w .NET Framework 4 i nowszych wersjach, ale z powodu błędu nie powiodło się we wcześniejszych wersjach.

+0

Cześć, dzięki! Próbowałem, ale niestety System.Net nadal stara się używać liczników perf. Czy możesz wskazać mi odniesienie do tego fragmentu? – moogs

+0

http://msdn.microsoft.com/en-us/library/ms229151.aspx jest dokumentacją, ale nie jest super oświecająca. Pozwól mi śledzić niektóre osoby z System.Net i zobacz, jakie jest właściwe rozwiązanie. –

+2

Wygląda na to, że w .NET 2.0/3.0/3.5 powyższe ustawienie zapobiega tylko zapisywaniu danych w licznikach wydajności, w rzeczywistości nie uniemożliwia ich utworzenia (w tym miejscu występuje ten błąd). Problem został rozwiązany dla .NET Framework 4 jednak: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=387419 –

1

Z tego co rozumiem, to się dzieje, ponieważ konto Gość ma przypisane kilka bardzo nieparzystych uprawnień. To jest , a nie błąd, który mówi, że nie można używać sieci - podstawowa sieć jest nadal dostępna w ramach częściowego zaufania.

Ten błąd występuje, ponieważ CLR nie może uzyskać dostępu do jednego z jego własnych liczników wydajności, który jest używany podczas operacji sieciowych. Ten problem nie powinien występować w przypadku innych kont użytkowników - czy musisz używać gościa? Normalne konto użytkownika z ograniczeniami powinno działać poprawnie. Wiadomo, że konto Gość ma wiele problemów z prawami dostępu w odniesieniu do .NET - konto jest rzadko używane w praktyce i kilka rzeczy jest kiedykolwiek testowanych na nim.

Jeśli chodzi o bezpieczeństwo dostępu do kodu, nie ma znaczenia, który użytkownik uruchamia kod pod - Uprawnienia CAS są takie same dla wszystkich użytkowników, domyślnie. Poziom zaufania jest określony przez lokalizację pliku wykonywalnego - uruchomienie czegoś zainstalowanego na komputerze lokalnym zapewnia pełne zaufanie, uruchamianie z innych lokalizacji zapewnia częściowe zaufanie (zobacz Grupy kodów w konfiguracji programu .NET Framework).

+0

Dzięki za odpowiedź. Potrzebuję, aby moja aplikacja działała bez problemów na koncie Gość. – moogs

0

Można spróbować silny nazywania zespoły następnie przyznanie im pełnego zaufania poprzez CASPOL, używając

caspol -fulltrust assemblyName 

Ale jak mówi Sander konto Gość nie jest prawdziwe konto, to nie jest ten, który normalnie loguje się i nałożono na nią bardzo surowe ograniczenia.

2

Dla tych biednych ludzi jak ja, którzy potrzebują obsługiwać konto gościa w programach ramowych 2.x (nawet jeśli CLR 4 jest zainstalowany, niektóre stare skompilowane przez CLR programy będą nadal działały pod CLR2), oto jest hackowana funkcja to wyłącza ten problem z inicjalizacją licznika wydajności (patrz odpowiedź Matta Ellisa Problem z jego odpowiedzią jest - jak stwierdzili niektórzy - nie zawsze działa):

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