Laden...

Schreiben einer app.config File auf einem Netzlaufwerk mit eingeschränkten Rechten

Erstellt von Ummy vor 4 Jahren Letzter Beitrag vor 4 Jahren 4.637 Views
U
Ummy Themenstarter:in
1 Beiträge seit 2019
vor 4 Jahren
Schreiben einer app.config File auf einem Netzlaufwerk mit eingeschränkten Rechten

Hallo Zusammen,

Ich habe folgendes Problem.
In meiner Anwendung (C# Windows Forms) verwende ich die app.config um eine COM-Schnittstelle zu speichern (nur der string "COM3" wird gespeichert).

Lokal mit Adminrechten funktioniert alles einwandfrei und man kann die COM ändern so das beim nächsten Start wieder mit dieser COM gearbeitet wird.

Nun habe ich das Problem das die Anwendung auf einem Netzlaufwerk ausgeführt werden soll, wobei hier die Rechte eingeschränkt sind. Die Idee dahinter ist, das die Anwendung von mehreren PC genutzt werden kann, ohne das etwas installiert werden muss. (Die Anwendung wird immer nur einmal gestartet)
Das "Lesen" der app.config funktioniert auch auf dem Netzlaufwerk, allerdings nicht das schreiben. Hier bekommt man immer eine Fehlermeldung:

Fehlermeldung:
System.UnauthorizedAccessException: Es wurde versucht, einen nicht autorisierten Vorgang auszuführen.
bei System.Security.AccessControl.Win32.SetSecurityInfo(ResourceType type, String name, SafeHandle handle, SecurityInfos securityInformation, SecurityIdentifier owner, SecurityIdentifier group, GenericAcl sacl, GenericAcl dacl)
bei System.Security.AccessControl.NativeObjectSecurity.Persist(String name, SafeHandle handle, AccessControlSections includeSections, Object exceptionContext)
bei System.Security.AccessControl.NativeObjectSecurity.Persist(String name, AccessControlSections includeSections, Object exceptionContext)
bei System.Security.AccessControl.FileSystemSecurity.Persist(String fullPath)
bei System.Configuration.Internal.WriteFileContext.Complete(String filename, Boolean success)
bei System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
bei System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
bei System.Configuration.UpdateConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
bei System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
bei Testsoftware_Blum_SmartMotor.ChargeForm.AddUpdateAppSettings(String key, String value) in E:\PROJECTS\Blum_Pruefaufbau\SmartMotor_TestAdapter\Software\Testsoftware_Blum_SmartMotor\Testsoftware_Blum_SmartMotor\ChargeForm.cs:Zeile 42.
bei Testsoftware_Blum_SmartMotor.ChargeForm.buttonOkay_Click(Object sender, EventArgs e) in E:\PROJECTS\Blum_Pruefaufbau\SmartMotor_TestAdapter\Software\Testsoftware_Blum_SmartMotor\Testsoftware_Blum_SmartMotor\ChargeForm.cs:Zeile 24.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Ich hab auch schon versucht das app.manifest zu ändern, aber leider kein Erfolg. ( <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />)

Gibt es sonst noch eine Möglichkeit hier etwas zu machen?
Die Anwendung bekommt kurzfristig Adminrechte für die Operation, z.B.?

Vielen Dank für eure Tipps

Gruß
Michael

16.806 Beiträge seit 2008
vor 4 Jahren

Deine Idee im gesamten entspricht nicht dem Konzept, das hier .NET verfolgt.
Desktop-Applikationen über das Netzwerk gleichzeitig mehreren Usern verfügbar zu machen war noch nie eine gute Idee - nie; aus Bequemlichkeit aber oft genutzt.

Ein Netzwerklaufwerk gilt in Windows per default immer als unsichere Quelle - Appliktionen und Configs haben dort erstmal nichts zu suchen.
Wer Adminrechte hat, kann Deine Anwendung problemlos komprimittieren, die Exe ersetzen und so Trojaner im Unternehmensnetzwerk verteilen.
Man kann jedoch Laufwerke als sicher definieren; zB via Code Access Security - alles andere als zu empfehlen.

Für die Zukunft: Du wirst die Config oft nicht überschreiben können, weil sie auch von anderen Usern verwendet wird - weil eben die Applikation geshared wird.
Eines der Nebeneffekte, wenn man Applikationen über diese Art "verteilen" will.

Aber hier kann auch einfach das Permission Konzept eurer Netzwerklaufwerke dazwischen funken.

Das alles hat man aber nicht, wenn man Applikationen sauber und paketetiert verteilt.

T
2.219 Beiträge seit 2008
vor 4 Jahren

Was wäre den das genaue Ziel der Schreibvprgänge?
Nur das speichern des selbst gewählten COM Ports in der Config?
Hier könntest du auch im einfachsten Fall einfach eine Textdatei anlegen und dort den Namen drin speichern.
Gibt es die Datei nicht oder ist diese leer/ungültiger Port Name, dann kannst du auch einfach auf den Default Port auf der Config zurückgreifen.

Wenn dein Programm mehrere solcher Einstellungen nutzt, kannst du auch per Sqlite dir eine lokale Config.db anlegen und die Einstellungen entsprechend in einer lokalen Sqlite Datenbank speichern.
Dann hast du es auch gleich sauber gelöst.

Hier sei aber Abts Ansage klar zu beachten.
Das Programm samt Config sollte dann auch auf jeden Rechner verteilt werden.
Sowas lässt sich auch mit entsprechenden Mitteln ohne Probleme umsetzen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.931 Beiträge seit 2008
vor 4 Jahren

Es macht ja auch keinen Sinn, daß die COM-Einstellung auf dem Netzlaufwerk gespeichert wird, denn es ist ja schließlich eine lokale Einstellung jedes Rechners!
Ummy, hast du denn diese Eigenschaft als Scope "User" angelegt? Dann sollte diese jeweils lokal auf jedem Rechner als "user.config" unter "AppData\Local&lt;ProgramName>" automatisch abgespeichert werden.