Probleme beim Speichern von Dateien ohne Administrator-Rechte

    • C#

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Probleme beim Speichern von Dateien ohne Administrator-Rechte

      Im Thread Effekt beim Speichern einer Datei mit Administrator-Rechten habe ich über das Problem gesprochen:
      Wenn eine Datei von einem anderen Programm mit Admin-Rechten nach "C:\Dokumente und Einstellungen\All Users\..." geschrieben wurde,
      kann sie nicht mehr von einem Programm ohne Admin-Rechte geöffnet bzw. überschrieben werden, da der "normale" Besitzer aus der Liste der Rechte-Inhaber entfernt wurde
      (siehe Bilder im verlinkten Thread).

      Von @EaranMaleasi kam die entscheidende Idee, über ein FileSecurity-Objekt den aus der Liste entfernten User wieder hinzuzufügen:

      C#-Quellcode

      1. private static void GetFullAccess(string path)
      2. {
      3. FileInfo fi = new FileInfo(path);
      4. FileSecurity fiSecurity = fi.GetAccessControl();
      5. WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
      6. SecurityIdentifier id = WindowsIdentity.GetCurrent().User;
      7. fiSecurity.AddAccessRule(new FileSystemAccessRule(id, FileSystemRights.FullControl, AccessControlType.Allow));
      8. fi.SetAccessControl(fiSecurity);
      9. }
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Externe Festplatte am neuen Rechner angedockt

      Anderes Problem, selbe Lösung:
      Der Umstieg auf meinen neuen Rechner war wunderbar (ich mach trotzdem keine Werbung ;) ).
      Auf einer externen Festplatte liegen gesicherte Daten. Auf diese hatte ich bisher immer mit Admin-Rechten zugegriffen, mein Sohn hatte mir das damals auf dem alten Rechner so eingerichtet, das wollte ich diesmal nicht mehr tun müssen.
      Jedenfalls kam beim Nicht-Admin-Zugriff eine Access-Denied-Exception.
      Die Lösung für eine Datei hatte ich vor Augen, nun musste noch eine Lösung für Verzeichnisse her.
      Hier mal der komplette Code, er muss als Administrator ausgeführt werden:
      Spoiler anzeigen

      C#-Quellcode

      1. using System;
      2. using System.IO;
      3. using System.Security.AccessControl;
      4. using System.Security.Principal;
      5. using System.Windows.Forms;
      6. namespace FestplattenScan
      7. {
      8. internal partial class Form1 : Form
      9. {
      10. /// <summary>
      11. /// Auswahl des Verzeichnisses
      12. /// </summary>
      13. private void btnGetFullAccess_Click(object sender, EventArgs e)
      14. {
      15. string path;
      16. using (FolderBrowserDialog dlg = new FolderBrowserDialog())
      17. {
      18. if (dlg.ShowDialog() != DialogResult.OK)
      19. {
      20. return;
      21. }
      22. path = dlg.SelectedPath;
      23. }
      24. // alle Directories freischalten
      25. DirectoryInfo[] dis = new DirectoryInfo(path).GetDirectories("*.*", SearchOption.AllDirectories);
      26. foreach (DirectoryInfo di in dis)
      27. {
      28. Form1.GetFullAccessPath(di);
      29. }
      30. // alle Dateien freischalten
      31. FileInfo[] fis = new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories);
      32. foreach (FileInfo fi in fis)
      33. {
      34. Form1.GetFullAccessFile(fi);
      35. }
      36. }
      37. /// <summary>
      38. /// Der Datei alle Zugriffsrechte des angemeldeten Users hinzufügen
      39. /// </summary>
      40. /// <param name="fi">Info der Datei</param>
      41. private static void GetFullAccessFile(FileInfo fi)
      42. {
      43. FileSecurity fiSecurity = fi.GetAccessControl();
      44. WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
      45. SecurityIdentifier id = WindowsIdentity.GetCurrent().User;
      46. fiSecurity.AddAccessRule(new FileSystemAccessRule(id, FileSystemRights.FullControl, AccessControlType.Allow));
      47. fi.SetAccessControl(fiSecurity);
      48. }
      49. /// <summary>
      50. /// Dem Verzeichnis alle Zugriffsrechte des angemeldeten Users hinzufügen
      51. /// </summary>
      52. /// <param name="di">Info des Verzeichnisses</param>
      53. private static void GetFullAccessPath(DirectoryInfo di)
      54. {
      55. DirectorySecurity fiSecurity = di.GetAccessControl();
      56. WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
      57. SecurityIdentifier id = WindowsIdentity.GetCurrent().User;
      58. fiSecurity.AddAccessRule(new FileSystemAccessRule(id, FileSystemRights.FullControl, AccessControlType.Allow));
      59. di.SetAccessControl(fiSecurity);
      60. }
      61. }
      62. }
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!