Impersonation

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Impersonation

Beitrag von Tom »

Alaska hat es im letzten Newsletter noch einmal hervorgehoben - wer mit physischen Tabellen hantiert und deshalb seinen Nutzern Vollzugriff auf ganze Ordnerstrukturen gewähren muss, und sei es im ADS-Kontext, der sollte sich Gedanken über Datenzugriffe machen. Wir wenden alle Lösungen an, die im Newsletter diskutiert werden, aber für einen DBF-Bestand ist Impersonation die simpelste - und überaus elegant. Das Konzept ist wirklich einfach. Der Windows-Benutzer, der die Anwendung nutzt, hat auf die Datenbank (ein Ordner oder mehrere) überhaupt keinen Blick. Die Anwendung allerdings meldet sich direkt beim Start mit anderen Anmeldedaten an, die auf die Ordner zugreifen können, und agiert mit diesen Rechten. Der Nutzer mit den geringeren Rechten kann alle Elemente nutzen, die ihm in der Anwendung zur Verfügung stehen, aber er kommt von außerhalb der Anwendung nicht an die Ordner oder Daten. Es findet bei der Anmeldung ein Identitätswechsel statt (das ist die Übersetzung von "Impersonation"), der aber nur innerhalb der Anwendung gilt.

Wir haben das so gelöst, dass ein Admin unserer Anwendung diesen Prozess innerhalb der Anwendung auslösen kann - diese Person muss also Vollzugriff haben. Die Auslösung bewirkt, dass in der Registry (HKLM -> Software -> Unsere Software -> Identity) eine Schlüsselgruppe hinterlegt wird, die - stark und propreitär verschlüsselt - die Windows-Anmeldedaten eines Nutzers enthält, der vollen Zugriff auf die Datenbank hat. Wenn die Anwendung gestartet wird und diese Schlüssel werden gefunden und man ist nicht zufällig sowieso dieser Nutzer, wird ein Objekt der Impersonation-Klasse mit diesen Anmeldedaten erzeugt. Wenn das gelingt, kann vor dem ersten Zugriff mit ImpersonationObjekt:SetThread() der Impersonalisierungs-Token für den aktiven Thread der Anwendung gesetzt werden. Das muss außerdem am Anfang jedes gestarteten Threads geschehen, und am Ende jeweils mit ImpersonationObjekt:RevertThread() widerrufen werden. Beim AppQuit sollte dann das Objekt zerstört werden, damit die Ressourcen wieder freigegeben werden.

Ich habe mal ein kleines Flussdiagramm gezeichnet, um das zu verdeutlichen:
impersonation.png
impersonation.png (64.09 KiB) 2879 mal betrachtet
Was soll ich sagen? Das läuft super! Wir haben noch ein paar kleine Schwierigkeiten mit Dateien, die in dieser Identititätswechsel-Situation erzeugt werden, und beim Bestücken von AX-Komponenten mit physischen Dateien, aber ansonsten läuft das wirklich lässig. Und es ist tatsächlich wasserdicht.

Das Impersonation-Asset, das aus ein paar API-Calls und der Klassendefinition besteht, ist in Xbase++ 2.0 enthalten. Es funktioniert ab Windows 7, und man könnte es sicher auch auf 1.9SL1 übertragen.
Herzlich,
Tom
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Impersonation

Beitrag von Rolf Ramacher »

Hallo Tom

da hast du ja auch noch mit PAP gearbeitet. Ich habe das Teil auch noch irgendwo aber seit Jahrzenten fast nicht mehr angefasst.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Impersonation

Beitrag von Tom »

Hallo, Rolf.

Falls Du das Flussdiagramm meinst - das ist mit ClickCharts gemacht.
Herzlich,
Tom
Antworten