2015-08-04 2 views
0

J'ai créé un programme pour nos utilisations à utiliser sur leurs ordinateurs de bureau. Quand ils essaient d'utiliser le programme, ils lèvent une exception du constructeur SqlConnection qui dit que 'l'accès au registre n'est pas autorisé'.SqlConnection échoue en raison d'autorisations du journal des événements

Notre administrateur réseau a restreint l'accès des utilisateurs au registre pour empêcher les gens d'installer des logiciels personnels. De plus, je n'ai pas besoin d'écrire dans le journal des événements. Y a-t-il une raison pour dire à SqlConnection de ne pas essayer d'accéder au journal des événements?

Code Source:

string _ConnectionString = "server=our_server_name; initial catalog=our_db_name; integrated security=true;" 
... 
using (var connection = new SqlConnection(_ConnectionString)) <-- exception thrown here 
{ 
    connection.Open(); 
    ... 
} 

Exception

System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception. 
---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlConnectionFactory' threw an exception. 
---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SqlPerformanceCounters' threw an exception. 
---> System.Security.SecurityException: Requested registry access is not allowed. 
at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) 
at System.Diagnostics.PerformanceCounterLib.FindCustomCategory(String category, PerformanceCounterCategoryType& categoryType) 
at System.Diagnostics.PerformanceCounterLib.IsCustomCategory(String machine, String category) 
at System.Diagnostics.PerformanceCounter.InitializeImpl() 
at System.Diagnostics.PerformanceCounter.set_RawValue(Int64 value) 
at System.Data.ProviderBase.DbConnectionPoolCounters.Counter..ctor(String categoryName, String instanceName, String counterName, PerformanceCounterType counterType) 
at System.Data.ProviderBase.DbConnectionPoolCounters..ctor(String categoryName, String categoryHelp) 
at System.Data.SqlClient.SqlPerformanceCounters..ctor() 
at System.Data.SqlClient.SqlPerformanceCounters..cctor() 
--- End of inner exception stack trace --- 
at System.Data.SqlClient.SqlConnectionFactory..cctor() 
--- End of inner exception stack trace --- 
at System.Data.SqlClient.SqlConnection..cctor() 
--- End of inner exception stack trace --- 
at System.Data.SqlClient.SqlConnection..ctor() 
at System.Data.SqlClient.SqlConnection..ctor(String connectionString, SqlCredential credential) 
at OurProgram.Form1.UpdateStuff() in C:\path_to_project\Form1.cs:line 111 

Merci

+0

Veuillez fournir plus d'informations sur l'exception réelle. De quel type d'exception s'agit-il (c'est-à-dire l'exception interne de 'System.TypeInitializationException')? Quel est le message d'erreur complet? –

+0

Il ressemble en fait à .net 4.6 il y a du code pour supporter votre bug particulier http://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/PerformanceCounterLib.cs,dceb05845090520b, l'exception que vous avez là EST être attrapé. Au moins dans .net 4.6. – Aron

+0

@roryap, d'après ce que j'ai posté, vous pouvez voir l'exception est une exception SecurityException et il existe des exceptions internes de type TypeInitializationException. J'ai copié tout ce qui se trouvait dans la boîte de dialogue. Donc je n'ai plus de détails sur l'exception à inclure. –

Répondre

0

Vous devriez essayer de mettre à niveau vers .NET 4.6 car il semble que chemin de code particulier a eu une prise d'essai ajouté à depuis que vous avez mis à jour le dernier framework .net.

http://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/PerformanceCounterLib.cs,dceb05845090520b

    if (baseKey != null) { 
         try { 
          key = baseKey.OpenSubKey(keyPath); 
         } catch (SecurityException) { 
          // we may not have permission to read the registry key on the remote machine. The security exception 
          // is thrown when RegOpenKeyEx returns ERROR_ACCESS_DENIED or ERROR_BAD_IMPERSONATION_LEVEL 
          // 
          // In this case we return an 'Unknown' category type and 'false' to indicate the category is *not* custom. 
          // 
          categoryType = PerformanceCounterCategoryType.Unknown; 
          this.customCategoryTable[category] = categoryType; 
          return false; 
         } 
        } 

De plus, si votre administrateur réseau vous donne une clé de ne pas soutenir la mise à niveau. Ensuite, dites-lui que Microsoft décrochent un soutien pour .net 4.0 début 2016. Ainsi, sa seule une question de temps: D

.NET Framework 4: .NET Framework 4 ne sont pas livrés dans tout système d'exploitation . .NET Framework 4 est pris en charge sur Windows Server 2003 SP2 jusqu'à ce que Juillet 14, 2015 et Windows Vista SP2, Windows 7 SP1, Windows Server 2008 SP2, Windows Server 2008 R2 SP1, mise à jour Windows 8.1, Windows Server 2012 et Windows Serveur 2012 R2 jusqu'au 12 janvier 2016.

+0

Je ne suis pas sûr que cela puisse vous aider. En regardant la source, elle renvoie false du bloc catch à IsCustomCategory. IsCustomCategory renvoie alors false à InitializeImpl. InitializeImpl lancerait alors InvalidOperationException. http://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/PerformanceCounter.cs,3a0253acf2670c70. Je vais voir si je peux obtenir .NET 4.6 installé sur l'ordinateur de quelqu'un pour le tester. –

+0

Cependant, dans l'ensemble, SQL ne devrait probablement pas fonctionner directement à partir d'un ordinateur client. Peut-être que vous pourriez concevoir une configuration de client de serveur ... – Aron

+0

Je fais habituellement une approche de serveur/client. Cependant, c'est quelque chose que j'ai jeté ensemble pour saisir les données d'une base de données existante pour une nouvelle exigence de rapport fédéral. Ils veulent des données des 8 dernières années. À l'avenir, nous ne publierons que l'année précédente dans la base de données de production. Donc nous n'aurons même pas besoin de ce programme après ce mois. Quoi qu'il en soit, j'ai essayé .NET 4.6 mais cela n'a pas fonctionné. Je vais juste utiliser l'option 'run as' pour l'exécuter sous mes identifiants jusqu'à ce qu'ils aient fini de l'utiliser. –