3 Stimmen

Ausnahme beim Speichern der Konfiguration im Netzwerkfreigabe in .NET 4.0

Ich erstelle eine Anwendung in .NET 4, die die Konfiguration der Anwendung während der Laufzeit der Anwendung aktualisieren muss. Der Code, der dies tut, lautet wie folgt:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["MySetting"].Value = "mein Wert";
config.Save();

Meine App.Config sieht so aus...

Wenn ich diese Anwendung auf einem lokalen Laufwerk ausführe (und daher die Konfigurationsdatei auch auf dem lokalen Laufwerk liegt, wenn das Programm ausgeführt wird), funktioniert dieser Code. Wenn die Anwendung jedoch mit der Konfigurationsdatei auf einem Netzwerklaufwerk (tatsächlich Z:) ausgeführt wird, schlägt der Code mit der folgenden Ausnahme in der Zeile config.Save(); fehl...

System.InvalidOperationException wurde nicht behandelt
  Nachricht=Die Methode wurde mit dem unerwarteten Fehlercode 1 beendet.
  Quelle=mscorlib
  StackTrace:
       at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
       at System.Security.AccessControl.FileSystemSecurity..ctor(Boolean isContainer, String name, AccessControlSections includeSections, Boolean isDirectory)
       at System.Security.AccessControl.FileSecurity..ctor(String fileName, AccessControlSections includeSections)
       at System.Configuration.Internal.WriteFileContext.DuplicateTemplateAttributes(String source, String destination)
       at System.Configuration.Internal.WriteFileContext.DuplicateFileAttributes(String source, String destination)
       at System.Configuration.Internal.WriteFileContext.Complete(String filename, Boolean success)
       at System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
       at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
       at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
       at System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
       at System.Configuration.UpdateConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
       at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
       at System.Configuration.Configuration.SaveAsImpl(String filename, ConfigurationSaveMode saveMode, Boolean forceSaveAll)
       at System.Configuration.Configuration.Save()
       at MyProj.Program.Main() in Z:\\repos\\project\\MyProj\\Program.cs:line 61
       at System.AppDomain.\_nExecuteAssembly(RuntimeAssembly assembly, String\[\] args)
       at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String\[\] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String\[\] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart\_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Ich denke, dass dies ein Sicherheitsproblem mit .NET ist, bin mir aber nicht sicher, wie ich diese Sicherheit deaktivieren könnte.

Das Netzwerklaufwerk, auf dem die Konfigurationsdatei gespeichert ist, ist tatsächlich ein VirtualBox-Freigabelaufwerk. Das Host-System ist Linux und das freigegebene Laufwerk ist auf ein Ext4-Dateisystem gemappt.

Ich glaube nicht, dass es sich hierbei einfach um ein Dateisystem-Schreibproblem handelt, da ich erfolgreich in eine Textdatei im selben Verzeichnis wie meine App.config-Datei schreiben kann (zumindest glaube ich, dass es das gleiche Verzeichnis ist, es sei denn, .NET macht etwas hinter den Kulissen wie die Verwendung eines temporären Verzeichnisses).

File.WriteAllText("Text.txt", "Testen");

0voto

Jamil Geor Punkte 337

Dies scheint ein Problem mit der Codezugriffssicherheit zu sein, es gibt hier einen guten Beitrag: http://www.sellsbrothers.com/Posts/Details/1519

Im Grunde, wenn Sie eine Anwendung von einem Netzlaufwerk ausführen, wird standardmäßig ein Vertrauensniveau von "Intranet" zugewiesen, das meines Erachtens nicht zulassen wird, dass Sie die Konfigurationsdatei ändern.

Also müssten Sie im Grunde das Vertrauensniveau für dieses Laufwerk erhöhen, indem Sie etwas Ähnliches tun wie dies:

caspol -q -machine -addgroup 1 -url file://z:/* FullTrust -name "Z Drive"

Ich hoffe, das hilft, ich habe keinen Zugriff auf ein Netzlaufwerk, also kann ich es nicht bestätigen.

0voto

Daniel Bonetti Punkte 2128

Ich habe versucht, caspol und .Net 4 zu verwenden, aber ohne Erfolg. Es mag albern sein, aber ich habe es nur geschafft, indem ich Folgendes gemacht habe:

  • Den APP_CONFIG_FILE erhalten und in einer lokalen Variable speichern
  • Den tatsächlichen APP_CONFIG_FILE durch eine Datei im lokalen Dateisystem ersetzen
  • Die Einstellungen wie gewünscht ändern
  • Die APP_CONFIG_FILE auf dem Netzlaufwerk mit der lokalen Datei kopieren und überschreiben
  • Den APP_CONFIG_FILE auf die ursprüngliche Datei im Netzlaufwerk setzen
  • Die lokale Datei löschen

Zum Beispiel:

string APP_CONFIG_FILE = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
string TEMP_FILE = System.IO.Path.GetTempPath() + Guid.NewGuid();
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", TEMP_FILE);

Configuration config = 
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["MySetting"].Value = "my value";
config.Save();

File.Copy(TEMP_FILE, APP_CONFIG_FILE, true);
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", APP_CONFIG_FILE);
File.Delete(TEMP_FILE);

Das Lustige ist, dass das Programm auf einem Rechner mit installiertem Visual Studio (ohne caspol) gut funktioniert hat, ohne die obigen Schritte durchführen zu müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X