Herausfinden, ob User Schreibrecht hat

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
Zvoni
Beiträge: 655
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Herausfinden, ob User Schreibrecht hat

Beitrag von Zvoni »

Hallo zusammen,

Frage: Gibt es eine elegante (vorgefertigte?) Methode herauszufinden, ob ein User in einem bestimmten Ordner Schreibrechte hat?

Szenario: Programm liegt auf dem Fileserver in einem Ordner, für welchen es festgelegte Zugriffsrechte gibt. User bekommen einen Desktop-Link zu besagtem Programm.
Programm hat eine SQLite-Datenbank, welche im gleichen Ordner liegt.
Basierend auf dem Usernamen (wird bei Programmstart ausgelesen), müsste ich jetzt wissen, ob die DB ReadOnly oder eben Read/Write geöffnet werden kann.

Mir ist natürlich klar, dass ich stumpf ein AssignFile mit einem Rewrite machen kann, und dann ggfs. die Exception abfangen, wollte aber vorher sicher gehen, ob es nicht doch etwas bereits fertiges gibt. Mal davon abgesehen, dass ich die EInOutError dann abschalten müsste
Target ist Windows 64 only
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
theo
Beiträge: 11303
Registriert: Mo 11. Sep 2006, 19:01

Re: Herausfinden, ob User Schreibrecht hat

Beitrag von theo »

Es gibt in LazFileUtils "DirectoryIsWritable".
Kannst ja mal damit probieren. Das versucht aber auch, eine Datei zu schreiben.

Es gibt anscheinend auch noch Möglichkeiten mit ACLs, aber da ich nicht auf Windows bin, habe ich davon keine Ahnung.
https://en.wikipedia.org/wiki/Access-control_list
https://forum.lazarus.freepascal.org/in ... ic=25118.0

Socke
Lazarusforum e. V.
Beiträge: 3188
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Herausfinden, ob User Schreibrecht hat

Beitrag von Socke »

Zvoni hat geschrieben: Mo 4. Mai 2026, 09:16 Basierend auf dem Usernamen (wird bei Programmstart ausgelesen), müsste ich jetzt wissen, ob die DB ReadOnly oder eben Read/Write geöffnet werden kann.
Warum öffnest du nicht einfach die Datenbank? Wenn den Read-/Write- bzw. ReadOnly-Modus dabei mitgeben kannst, hast du sofort dein Ergebnis und die Datenbank schon geöffnet.
Eine Vorprüfung gilt nur für den Zeitpunkt der Prüfung und nicht zum Zeitpunkt der Datenbank-Öffnung.

Exceptions sind schließlich dazu da, damit man mit ihnen arbeitet.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Zvoni
Beiträge: 655
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Herausfinden, ob User Schreibrecht hat

Beitrag von Zvoni »

theo hat geschrieben: Mo 4. Mai 2026, 10:19 Es gibt in LazFileUtils "DirectoryIsWritable".
Kannst ja mal damit probieren. Das versucht aber auch, eine Datei zu schreiben.

Es gibt anscheinend auch noch Möglichkeiten mit ACLs, aber da ich nicht auf Windows bin, habe ich davon keine Ahnung.
https://en.wikipedia.org/wiki/Access-control_list
https://forum.lazarus.freepascal.org/in ... ic=25118.0
Arrgghh. Bleib mir mit ACL's vom Hals. Hab ich mal vor Jahren auf FreeBSD nen Kampf gehabt.
Unter Windows müsste das der SecurityDescriptor sein.
Socke hat geschrieben: Mo 4. Mai 2026, 11:59
Zvoni hat geschrieben: Mo 4. Mai 2026, 09:16 Basierend auf dem Usernamen (wird bei Programmstart ausgelesen), müsste ich jetzt wissen, ob die DB ReadOnly oder eben Read/Write geöffnet werden kann.
Warum öffnest du nicht einfach die Datenbank? Wenn den Read-/Write- bzw. ReadOnly-Modus dabei mitgeben kannst, hast du sofort dein Ergebnis und die Datenbank schon geöffnet.
Eine Vorprüfung gilt nur für den Zeitpunkt der Prüfung und nicht zum Zeitpunkt der Datenbank-Öffnung.

Exceptions sind schließlich dazu da, damit man mit ihnen arbeitet.
Hatte ich auch schon überlegt, da ich ja im WAL-Modus öffne, und das eben übers Backend eine wal-Datei anlegt.

Ist momentan eh nur ne reine Theorie-Überlegung, da die Anfrage aus der Abteilung kam, für welche ich eigentlich das Programm geschrieben habe, ob eben auch andere User darauf zugreifen können (Welche eben in dem Ordner nur Leserecht haben).

Und mein Gedanke war eben, im Vorfeld zu prüfen, falls kein Schreibrecht, als ReadOnly öffnen, die ganze DB dann in eine InMemory-DB zu werfen, und für diese Session halt dann mit InMemory-DB zu arbeiten, wobei geänderte Daten halt nicht persistent wären (natürlich mit Hinweis an den User).
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 655
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Herausfinden, ob User Schreibrecht hat

Beitrag von Zvoni »

OK, kurz zur Erklärung:
Ich habe für unseren Einkauf eine DB-Anwendung (SQLite) geschrieben, mit welcher sie Luftfrachten kurz und schmerzlos kalkulieren können.
Hierbei gibt es einen wöchentlich wechselnden Zuschlag (Treibstoffzuschlag).
Mein Programm prüft ab, ob der/die Zuschläge noch gültig sind (Hat Gültigkeitsdatum/Zeitraum).
Falls nein, kann der User sofort in die Anbieter-Verwaltung (DHL, UPS usw.) abbiegen, und die Zuschläge auf den neuesten Stand bringen.
Und dieses Update erfordert eben Schreibrecht, welches im besagten Ordner auf dem Fileserver eben nur der Einkauf hat.

Und jetzt kam eben die Anfrage vom Einkauf, ob unser Verkauf eben auch das Programm nutzen kann (Bsp. Kalkulation Luftracht im Rahmen eines Angebotes an einen Kunden).
Der Verkauf bei uns hat aber eben nur Leserecht in besagtem Ordner.

Eine Änderung der Zugriffsrechte ist definitiv ausgeschlossen.

Klar, eine Option ist, das Programm in einen Ordner zu legen, wo beide Abteilungen Schreibrecht haben, aber da sehe ich die Gefahr, dass zuviel Unfug passieren kann.

Deshalb mein Gedanke mit o.g. InMemory-DB

Nachtrag/Edit: Bevor es jemand sagt: Nein, eine echte Multi-User-DB (Bsp. MySQL) ist keine Option (Firmennetzwerk).
Ich muss mit dem arbeiten, was mir zur Verfügung steht
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten