{"id":55001185,"date":"2019-04-01T00:00:00","date_gmt":"2020-05-13T21:06:56","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1185"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/","title":{"rendered":"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/21d0712e3ba947b2ba6c8ee203c54ba0\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Berechtigungen f&uuml;r Access-Objekte per SQL Server I: Tabellen&#8220; haben wir ein Datenmodell entwickelt f&uuml;r die Verwaltung der Berechtigungen verschiedener Benutzergruppen auf die Formulare, Berichte und Steuer-elemente einer Access-Anwendung &#8211; gesteuert &uuml;ber die jeweilige Anmeldung an der SQL Server-Datenbank. Im zweiten Teil dieser Beitragsreihe haben wir das Formular zum Einstellen der Berechtigungen erstellt. Im dritten Teil zeigen wir nun, wie wir die gespeicherten Berechtigungen nutzen, um Formulare und Steuer-elemente vor dem unbefugten Zugriff zu sch&uuml;tzen.<\/b><\/p>\n<h2>Berechtigungen anwenden<\/h2>\n<p>Damit ist der erste Teil abgeschlossen &#8211; wir haben eine M&ouml;glichkeit geschaffen, mit der wir die Formulare einer Anwendung und die enthaltenen Steuer-elemente einlesen k&ouml;nnen. Au&szlig;erdem k&ouml;nnen wir die Benutzergruppen, die am SQL Server in Form von Anmeldungen vorliegen, ermitteln und f&uuml;r die Kombination aus Elementen und Benutzergruppen eine der drei Berechtigungsstufen <b>Keine<\/b>, <b>Lesen <\/b>oder <b>Alle <\/b>einstellen. Nun &auml;ndert dies allein noch nichts im Umgang mit den Elementen der Benutzeroberfl&auml;che, denn noch wissen diese ja nichts davon, dass der Zugriff auf die jeweiligen Formulare oder Steuer-elemente gegebenenfalls eingeschr&auml;nkt ist. Die Interpretation der drei Berechtigungsstufen sieht f&uuml;r Formulare wie folgt aus:<\/p>\n<ul>\n<li><b>Keine<\/b>: Das Formular darf nicht ge&ouml;ffnet werden.<\/li>\n<li><b>Lesen<\/b>: Das Formular darf ge&ouml;ffnet werden, aber nur zum Lesen von Daten.<\/li>\n<li><b>Alle<\/b>: Das Formular darf ge&ouml;ffnet und auch zum &auml;ndern, Anlegen oder L&ouml;schen von Daten verwendet werden.<\/li>\n<\/ul>\n<p>F&uuml;r die Steuer-elemente sollen die drei so auswirken:<\/p>\n<ul>\n<li><b>Keine<\/b>: Das Steuer-element ist deaktiviert.<\/li>\n<li><b>Lesen<\/b>, <b>Alle<\/b>: Das Steuer-element ist aktiviert.<\/li>\n<\/ul>\n<p>Um ein Formular und seine Steuer-elemente mit den entsprechenden Werten f&uuml;r die betroffenen Eigenschaften zu versehen, ben&ouml;tigen wir noch ein wenig Code. Die Hauptfunktion dabei hei&szlig;t <b>BerechtigungenAnwenden <\/b>und erwartet einen Verweis auf das zu &ouml;ffnende Formular als Parameter. Diese Prozedur erl&auml;utern wir weiter unten. Bevor Sie diese Prozedur nutzen k&ouml;nnen, sind n&auml;mlich noch einige Vorbereitungen n&ouml;tig &#8211; siehe weiter unten.<\/p>\n<h2>Berechtigungen ermitteln per gespeicherter Prozedur<\/h2>\n<p>Die Prozedur verwendet die Funktion <b>SPRecordsetMitParameter<\/b> (siehe weiter unten), um eine gespeicherte Prozedur in der SQL Server-Datenbank auszuf&uuml;hren und ein darauf basierendes Recordset zu erstellen. Diese gespeicherte Prozedur m&uuml;ssen wir zun&auml;chst anlegen, und zwar wahlweise im SQL Server Management Studio oder im Formular <b>frm-SQL-Befehle<\/b>, das wir im Beitrag <b>SQL Server Tools <\/b>vorgestellt haben (<b>www.access-im-unternehmen.de\/1061<\/b>).<\/p>\n<p>Anschlie&szlig;end steht diese gespeicherte Prozedur f&uuml;r die Verwendung in der Datenbank <b>Suedsturm_SQL <\/b>zur Verf&uuml;gung. Sie k&ouml;nnen diese ausprobieren, werden aber gegebenenfalls keinen Datensatz als Ergebnis erhalten. Wenn Sie die im zweiten Teil dieser Beitragsreihe erstellten Beispielberechtigungen f&uuml;r das Formular <b>frmIntro<\/b> f&uuml;r die beiden Gruppen <b>Bestellannahme <\/b>und <b>Management <\/b>testen wollen, sollten Sie sich bewusst sein, unter welchem Benutzerkonto Sie gerade am Windows-Rechner angemeldet sind und ob dieses Benutzerkonto einer dieser beiden Gruppen zugeh&ouml;rt. Falls ja, werden Sie einen entsprechenden Datensatz erhalten, den wir uns gleich ansehen werden. Falls nicht, m&uuml;ssen wir zun&auml;chst die Voraussetzungen schaffen, damit Sie sich unter einer der beiden Benutzergruppen an der SQL Server-Datenbank anmelden. Dazu gibt es wiederum zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Sie melden sich unter einem geeigneten Benutzerkonto am System an oder<\/li>\n<li>Sie starten die Access-Anwendung im Kontext des gew&uuml;nschten Benutzerkontos.<\/li>\n<\/ul>\n<p>Wir wollen testweise, sofern noch nicht vorhanden, die Benutzergruppe <b>Management <\/b>mit dem Benutzer <b>Peter Gross <\/b>und die Benutzergruppe <b>Bestellannahme <\/b>mit dem Benutzer <b>Harry Klein <\/b>anlegen. Das erledigen Sie &uuml;ber die Eingabeaufforderung ganz schnell mit den folgenden Anweisungen. Die Benutzerkonten f&uuml;gen Sie so hinzu:<\/p>\n<pre>net user \/add \"Peter Gross\"\r\nnet user \/add \"Harry Klein\"<\/pre>\n<p>Die Gruppen legen Sie so an:<\/p>\n<pre>net localgroup \/add Bestellannahme\r\nnet localgroup \/add Management<\/pre>\n<p>Schlie&szlig;lich f&uuml;gen Sie die Benutzer noch den Gruppen hinzu:<\/p>\n<pre>net localgroup Management \/add \"Peter Gross\"\r\nnet localgroup Bestellannahme \/add \"Harry Klein\"<\/pre>\n<p>Dass die Gruppen und Benutzer angelegt wurden, k&ouml;nnen Sie auch pr&uuml;fen. Geben Sie den folgenden Befehl ein, um alle Benutzer auszugeben:<\/p>\n<pre>net user<\/pre>\n<p>Mit dem n&auml;chsten Befehl geben Sie alle Benutzergruppen aus:<\/p>\n<pre>net localgroup<\/pre>\n<p>Wenn Sie die Details einer Gruppe inklusive Benutzer ermitteln wollen, gelingt dies durch Angabe des Gruppennamens:<\/p>\n<pre>net localgroup Management<\/pre>\n<p>Und auch &uuml;ber die Benutzerdetails k&ouml;nnen Sie die Gruppenzugeh&ouml;rigkeit ermitteln:<\/p>\n<pre>net user \"Peter Gross\"<\/pre>\n<p>Damit haben Sie die passenden Benutzerkonten und Benutzergruppen f&uuml;r die folgenden Experimente erstellt.<\/p>\n<p>Au&szlig;erdem m&uuml;ssen wir die Benutzergruppen noch als neue Anmeldung zum SQL Server hinzuf&uuml;gen. Das erledigen wir im SQL Server Management Studio, indem wir mit der rechten Maustaste auf das Element <b>&gt;Servername&lt;|Si-cher-heit|An-meldungen <\/b>klicken und den Kontextmen&uuml;-Eintrag <b>Neue Anmeldung <\/b>bet&auml;tigen.<\/p>\n<p>Es erscheint der Dialog <b>Anmeldung &#8211; Neu<\/b>. Hier klicken Sie neben dem Feld <b>Anmeldename <\/b>auf die Schaltfl&auml;che <b>Suchen<\/b>. Im n&auml;chsten Dialog <b>Benutzer oder Gruppe ausw&auml;hlen <\/b>klicken Sie zun&auml;chst auf <b>Objekttypen<\/b>. Im Dialog <b>Objekttypen aktivieren <\/b>Sie, sofern noch nicht geschehen, den Eintrag <b>Gruppen <\/b>und schlie&szlig;en den Dialog wieder.<\/p>\n<p>Dann klicken Sie im Dialog <b>Benutzer oder Gruppe ausw&auml;hlen <\/b>auf die Schaltfl&auml;che <b>Erweitert<\/b>. Im neuen Dialog gleichen Namens klicken Sie rechts auf die Schaltfl&auml;che <b>Jetzt suchen <\/b>und w&auml;hlen dann unten aus den Suchergebnissen die Gruppe <b>Bestellannahme <\/b>aus. Schlie&szlig;en Sie den Dialog mit <b>OK <\/b>und den aufrufenden Dialog ebenfalls, nachdem Sie sich vergewissert haben, dass unter <b>Geben Sie die zu verwendenden Objektnamen ein <\/b>die gew&uuml;nschte Gruppe aufgef&uuml;hrt wird.<\/p>\n<p>Zur&uuml;ck im Dialog <b>Anmeldung &#8211; Neu <\/b>wechseln Sie noch zum Bereich Benutzerzuordnung und aktivieren dort die Datenbank <b>Sued-sturm_SQL<\/b>. Dann erstellen Sie Anmeldung mit einem Klick auf <b>OK<\/b>.<\/p>\n<p>Auf die gleiche Weise verfahren Sie anschlie&szlig;end mit der Benutzergruppe <b>Management<\/b>. Sie k&ouml;nnen auch direkt im ersten Dialog <b>Anmeldung &#8211; Neu <\/b>die Benutzergruppe in der Form <b>&gt;Servername&lt;\\&lt;Gruppenname&gt; <\/b>eingeben.<\/p>\n<p>Danach sollten Sie im Bereich <b>Sicherheit|Anmeldungen <\/b>die beiden neuen Anmeldungen mit den Benutzergruppen vorfinden (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_1185_001.png\" alt=\"Einrichten der Benutzergruppen als SQL Server-Anmeldungen\" width=\"424,7115\" height=\"356,4014\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einrichten der Benutzergruppen als SQL Server-Anmeldungen<\/span><\/b><\/p>\n<h2>Ge-spei-cher-te Pro-ze-dur sp-Objekt-be-rech-ti-gungen erstellen<\/h2>\n<p>Bevor wir uns gleich im Kontext eines der beiden Benutzer Peter Gross oder Harry Klein am SQL Server anmelden, erstellen wir noch die gespeicherte Prozedur, die wir dort ausprobieren wollen. Den dazu notwendigen Code finden Sie in Listing 1 (die Erl&auml;uterung folgt weiter unten).<\/p>\n<pre>CREATE PROCEDURE [dbo].[spObjektberechtigungen]\r\n     @Objekt varchar(255)\r\nAS\r\nSELECT\r\n(\r\n     SELECT COUNT(*)\r\n     FROM dbo.tblObjekteBenutzergruppenBerechtigungen t1 INNER JOIN dbo.tblBenutzergruppen t2\r\n     ON t1.BenutzergruppeID = t2.BenutzergruppeID\r\n     WHERE t1.ObjektID = t4.ObjektID AND IS_MEMBER(t2.Bezeichnung) = 1\r\n) AS AnzahlFestgelegterBerechtigungen,\r\n(\r\n     SELECT COUNT(*) \r\n     FROM dbo.tblBenutzergruppen t3 \r\n     WHERE IS_MEMBER(t3.Bezeichnung) = 1\r\n) AS AnzahlGruppenDesBenutzers, \r\nt4.ObjektID, t6.Bezeichnung, MAX(t4.BerechtigungsstufeID) AS MaxBerechtigungID \r\nFROM \r\n(\r\n     (\r\n          dbo.tblObjekteBenutzergruppenBerechtigungen t4 INNER JOIN dbo.tblBerechtigungsstufen t5 \r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON t4.BerechtigungsstufeID = t5.BerechtigungsstufeID\r\n&nbsp;&nbsp;&nbsp;&nbsp;)\r\n&nbsp;&nbsp;&nbsp;&nbsp;INNER JOIN dbo.tblObjekte t6 ON t4.ObjektID = t6.ObjektID\r\n)\r\nINNER JOIN dbo.tblBenutzergruppen t7 ON t4.BenutzergruppeID = t7.BenutzergruppeID\r\nWHERE t6.Uebergeordnet = @Objekt\r\nAND IS_MEMBER(t7.Bezeichnung) = 1\r\nGROUP BY t6.Bezeichnung, t4.ObjektID;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Gespeicherte Prozedur, welche die Berechtigungen f&uuml;r den aktuellen Benutzer f&uuml;r das &uuml;bergebene Formular ermittelt.<\/span><\/b><\/p>\n<p>Um die gespeicherte Prozedur anzulegen, f&uuml;hren Sie den <b>CREATE PROCEDURE<\/b>-Code in einem Abfragefenster der Datenbank <b>Suedsturm_SQL <\/b>aus. Nach der Aktualisierung des Elements <b>&lt;Servername&gt;|Da-ten-ban-ken|Sued-sturm_SQL|Pro-gram-mier-bar-keit|Ge-spei-cher-te Prozeduren <\/b>sollte darunter ein neuer Eintrag namens <b>spObjektberechtigungen <\/b>auftauchen. <\/p>\n<p>Damit die neuen Benutzergruppen nun auch noch die gespeicherte Prozedur <b>spObjektberechtigungen <\/b>nutzen k&ouml;nnen, m&uuml;ssen wir diesen noch die passenden Berechtigungen geben. Dazu klicken Sie mit der rechten Maustaste auf den Eintrag f&uuml;r diese gespeicherte Prozedur im Objekt-Explorer und w&auml;hlen aus dem Kontextmen&uuml; den Eintrag <b>Eigenschaften <\/b>aus. Wechseln Sie hier zum Bereich <b>Berechtigungen<\/b>, markieren Sie nacheinander die beiden betroffenen Gruppen <b>Management <\/b>und <b>Bestellannahme <\/b>und aktivieren Sie die Option <b>Erteilen <\/b>f&uuml;r die Berechtigung <b>Ausf&uuml;hren <\/b>(siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_1185_002.png\" alt=\"Erteilen der Berechtigungen f&uuml;r die gespeicherte Prozedur\" width=\"649,559\" height=\"588,3685\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Erteilen der Berechtigungen f&uuml;r die gespeicherte Prozedur<\/span><\/b><\/p>\n<h2>Aufbau der gespeicherten Prozedur spObjektberechtigungen<\/h2>\n<p>Diese Prozedur sieht etwas kompliziert aus, aber wir l&ouml;sen das jetzt auf. Der gr&ouml;&szlig;te Teil der <b>SELECT<\/b>-Anweisung ist das Konstrukt zum Herstellen der Verkn&uuml;pfungen der vier beteiligten Tabellen <b>tblObjekteBenutzergruppenBerechtigungen<\/b>, <b>tblBerechtigungsstufen<\/b>, <b>tblObjekte <\/b>und <b>tblBenutzergruppen <\/b>per <b>INNER JOIN<\/b> &#8211; das ist der Teil von <b>FROM <\/b>bis <b>WHERE<\/b> im unteren Bereich. Dies w&uuml;rde grunds&auml;tzlich alle Datens&auml;tze liefern, die in den vier Tabellen angelegt wurden. Da wir nur bestimmte Berechtigungen ben&ouml;tigen, in diesem Fall f&uuml;r ein spezielles Objekt, dass wir mit dem Parameter <b>@Objekt <\/b>&uuml;bergeben, haben wir daf&uuml;r eine Bedingung in der <b>WHERE<\/b>-Klausel festgelegt und noch ein weiteres. Die folgende Bedingung sorgt also daf&uuml;r, dass wir nur die Berechtigungen f&uuml;r die Elemente erhalten, deren &uuml;bergeordnetes Objekt das mit <b>@Objekt <\/b>&uuml;bergebene Formular ist (<b>t6 <\/b>ist ein Alias f&uuml;r die Tabelle <b>tblObjekte<\/b>):<\/p>\n<pre>t6.Uebergeordnet = ''''frmIntro''''<\/pre>\n<p>Au&szlig;erdem m&ouml;chten wir nur solche Datens&auml;tze f&uuml;r die aktuelle Benutzergruppe zur&uuml;ckliefern. Dabei unterst&uuml;tzt uns die T-SQL-Funktion <b>IS_MEMBER<\/b>. Sie erwartet den Namen einer Anmeldung, in diesem Fall etwa die Gruppe <b>&lt;Servername&gt;\\Management<\/b>, und pr&uuml;ft, ob der Benutzer, der gerade am Windows-Rechner angemeldet ist, zu dieser Gruppe geh&ouml;rt. <b>t7 <\/b>ist dabei ein Alias f&uuml;r die Tabelle <b>tblBenutzergruppen <\/b>und Bezeichnung der Name der Benutzergruppe:<\/p>\n<pre>IS_MEMBER(t7.Bezeichnung) = 1<\/pre>\n<p>Welche Werte soll die gespeicherte Prozedur nun zur&uuml;ckliefern Die ersten beiden Werte sind keine einfachen Werte, die aus der per <b>INNER JOIN <\/b>verkn&uuml;pften Kombination der vier Tabellen stammen, sondern die Ergebnisse von Unterabfragen. Hier ist die erste Unterabfrage:<\/p>\n<pre>(\r\n     SELECT COUNT(*)\r\n     FROM dbo.tblObjekteBenutzergruppenBerechtigungen t1 \r\n     INNER JOIN dbo.tblBenutzergruppen t2\r\n     ON t1.BenutzergruppeID = t2.BenutzergruppeID\r\n     WHERE t1.ObjektID = t4.ObjektID \r\n     AND IS_MEMBER(t2.Bezeichnung) = 1\r\n) AS AnzahlFestgelegterBerechtigungen<\/pre>\n<p>Diese Abfrage bestimmt die Anzahl der Datens&auml;tze der beiden per <b>INNER JOIN <\/b>verkn&uuml;pften Tabellen <b>tblObjekteBenutzergruppenBerechtigungen <\/b>und <b>tblBenutzergruppen<\/b>, wobei hier nur die Datens&auml;tze ber&uuml;cksichtigt werden sollen, deren <b>ObjektID <\/b>der Tabelle <b>tblObjekteBenutzergruppenBerechtigungen <\/b>auch in der gleichnamigen Tabelle der Hauptabfrage vorkommen. Da wir zweimal die gleiche Tabelle referenzieren, haben wir diesen jeweils einen Alias (hier <b>t1 <\/b>und <b>t4<\/b>) vergeben und dies auch direkt f&uuml;r alle referenzierten Tabellen der Haupt- und der beiden Unterabfragen erledigt. Das Ergebnis dieser Unterabfrage, das in Form des Feldes <b>AnzahlFestgelegterBerechtigungen <\/b>in der Hauptabfrage landet, entspricht der Anzahl der expliziten Berechtigungen an diesem Objekt f&uuml;r den aktuellen Benutzer. Wenn der Benutzer etwa in einer Benutzergruppe ist, die eine Lesen-Berechtigung f&uuml;r ein Formular hat, liefert <b>AnzahlFestgelegterBedingungen <\/b>den Wert <b>1 <\/b>zur&uuml;ck. Ist der Benutzer in zwei Gruppen, von denen die eine Lesen-Rechte und die andere das Recht <b>Keine <\/b>hat, liefert <b>AnzahlFestgelegterBedingungen <\/b>den Wert <b>2<\/b>. Ist der Benutzer aber in einer Gruppe, die Lesen-Rechte hat und in einer anderen Gruppe, f&uuml;r die keine expliziten Rechte f&uuml;r das Formular festgelegt sind, dann liefert <b>AnzahlFestgelegterBedingungen <\/b>den Wert <b>1<\/b>. Wozu das dient, wird gleich deutlich.<\/p>\n<p><!--30percent--><\/p>\n<p>Zun&auml;chst schauen wir uns noch die zweite Unterabfrage an. Diese lautet wie folgt:<\/p>\n<pre>(\r\n     SELECT COUNT(*) \r\n     FROM dbo.tblBenutzergruppen t3 \r\n     WHERE IS_MEMBER(t3.Bezeichnung) = 1\r\n) AS AnzahlGruppenDesBenutzers<\/pre>\n<p>Diese Unterabfrage gibt einfach nur die Anzahl der Gruppen des Benutzers zur&uuml;ck. Sie z&auml;hlt alle Eintr&auml;ge der Tabelle <b>tblBenutzergruppen<\/b>, f&uuml;r welche die Funktion <b>IS_MEMBER <\/b>den Wert <b>1 <\/b>zur&uuml;ckgibt.<\/p>\n<p>Der Sinn der beiden Unterfunktionen ist folgender: Wenn die Anzahl von <b>AnzahlFestgelegterBerechtigungen <\/b>und <b>AnzahlGruppenDesBenutzers <\/b>gleich gro&szlig; sind, k&ouml;nnen wir schlussfolgern, dass f&uuml;r jede der Benutzergruppen des Benutzers eine explizite Berechtigung an dem jeweiligen Element festgelegt wurde. Wenn <b>AnzahlFestgelegterBerechtigungen <\/b>kleiner ist als <b>AnzahlGruppenDesBenutzers<\/b>, dann gibt es Benutzergruppen f&uuml;r den Benutzer, f&uuml;r die keine explizite Berechtigung an dem mit <b>@Objekt <\/b>&uuml;bergebenen Objekt festgelegt ist. Und da wir definiert haben, dass keine explizite Berechtigung bedeutet, dass der Benutzer das Schreiben-Recht an dem Objekt erh&auml;lt, wird in diesem Fall auch das Schreiben-Recht festgelegt, egal welche Rechte die anderen Benutzergruppen f&uuml;r den Zugriff auf dieses Objekt besitzen.<\/p>\n<p>Neben diesen beiden Feldern, die aus Unterabfragen generiert werden, soll die gespeicherte Prozedur noch die Felder <b>ObjektID <\/b>der Tabelle <b>tblObjekteBenutzergruppenBerechtigungen<\/b>, <b>Bezeichnung <\/b>der Tabelle <b>tblObjekte <\/b>und den gr&ouml;&szlig;ten Wert des Feldes <b>BerechtigungsstufeID <\/b>der Tabelle <b>tblObjekteBenutzergruppenBerechtigungen <\/b>liefern.<\/p>\n<h2>Im Kontext eines anderen Benutzers am SQL Server anmelden<\/h2>\n<p>Jetzt wird es interessant &#8211; wir wollen die gespeicherte Prozedur zun&auml;chst testweise im SQL Server Management Studio ausprobieren, und zwar im Kontext verschiedener Benutzer. Uns interessiert vor allem, ob es funktioniert, die nicht expliziten Berechtigungen f&uuml;r Gruppen zu ermitteln.<\/p>\n<p>Um das SQL Server Management Studio im Kontext eines anderen Benutzers zu &ouml;ffnen, klicken Sie mit der rechten Maustaste auf das Programm <b>SQL Server Management Studio<\/b>. Dort finden Sie dann wiederum den Eintrag <b>Microsoft SQL Server Management Studio<\/b>, auf den Sie nochmals mit der rechten Maustaste klicken &#8211; diesmal allerdings bei gedr&uuml;ckter Umschalttaste. Dies liefert einige Kontextmen&uuml;-Eintr&auml;ge mehr als &uuml;blich, unter anderem <b>Als anderer Benutzer ausf&uuml;hren<\/b>. Es erscheint dann ein Dialog, in dem Sie den Benutzernamen und das Kennwort des gew&uuml;nschten Benutzers eingeben (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_1185_003.png\" alt=\"Anwendung als anderer Benutzer &ouml;ffnen\" width=\"424,7115\" height=\"335,2986\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anwendung als anderer Benutzer &ouml;ffnen<\/span><\/b><\/p>\n<p>Zuerst melden wir uns als <b>Peter Gross <\/b>an, der nur der Gruppe <b>Manager <\/b>angeh&ouml;rt. F&uuml;r diese haben wir im Formular <b>frmBerechtigungen <\/b>das Recht <b>Alle<\/b> f&uuml;r das Formular <b>frmIntro <\/b>und das Steuer-element <b>cmdGo <\/b>festgelegt.<\/p>\n<p>Wir suchen nun den Eintrag <b>&lt;Servername&gt;|Da-ten-ban-ken|Sued-sturm_SQL|Pro-gram-mier-bar-keit|Ge-speicher-te Prozeduren <\/b>heraus und finden darunter auch unsere Prozedur <b>spObjektberechtigungen <\/b>vor. Klicken Sie mit der rechten Maustaste darauf und w&auml;hlen Sie den Eintrag <b>Gespeicherte Prozedur ausf&uuml;hren&#8230; <\/b>aus. Im nun erscheinenden Dialog (siehe Bild 4) geben wir als Parameter <b>frmIntro <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_1185_004.png\" alt=\"Gespeicherte Prozedur ausf&uuml;hren\" width=\"649,559\" height=\"256,8242\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Gespeicherte Prozedur ausf&uuml;hren<\/span><\/b><\/p>\n<p>Das Ergebnis sieht wie in Bild 5 aus. Es gibt je einen Datensatz f&uuml;r das Formular-Element des Formulars (Bezeichnung: <b>Form<\/b>) und einen f&uuml;r das einzige Steuer-element <b>cmdGo<\/b>, f&uuml;r das wir Rechte vergeben haben. Der Benutzer geh&ouml;rt zu einer Gruppe und es gibt eine festgelegte Berechtigung f&uuml;r jedes Element. Das ist ein klarer Fall &#8211; es gibt keine Gruppe, f&uuml;r die keine explizite Berechtigung definiert wurde, also gilt der Wert aus <b>MaxBerechtigungID <\/b>als ma&szlig;geblicher Wert f&uuml;r das Durchsetzen der Berechtigungen. In diesem Fall bedeutet dies, dass der Benutzer der Gruppe <b>Management <\/b>mit dem Wert <b>3 <\/b>das Recht <b>Alle <\/b>f&uuml;r das Formular und die Schaltfl&auml;che hat.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_1185_005.png\" alt=\"Ergebnis der gespeicherten Prozedur f&uuml;r einen Benutzer mit einer Gruppe\" width=\"649,559\" height=\"101,7742\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ergebnis der gespeicherten Prozedur f&uuml;r einen Benutzer mit einer Gruppe<\/span><\/b><\/p>\n<p>Danach melden wir uns mit dem Benutzer <b>Harry Klein <\/b>aus der Bestellannahme an, f&uuml;r den wir f&uuml;r das Formular lesende Rechte angelegt haben und f&uuml;r die Schaltfl&auml;che <b>cmdGo <\/b>kein explizites Recht. Nun erhalten wir das Ergebnis aus Bild 6. Dort finden wir nun nur einen Datensatz vor, und zwar f&uuml;r das Formular selbst &#8211; nicht f&uuml;r die Schaltfl&auml;che. Was bedeutet das f&uuml;r uns Erstmal nicht viel &#8211; die Interpretation dieser Daten erfolgt ja weiter unten in einer VBA-Prozedur, die beim &ouml;ffnen des Formulars aufgerufen wird. Um vorwegzugreifen: Formulare und Steuer-elemente sind standardm&auml;&szlig;ig mit vollen Zugriffsrechten ausgestattet, also kann der Benutzer, wenn er einer Gruppe angeh&ouml;rt, die gar keine expliziten Berechtigungen aufweist, alle Formulare &ouml;ffnen und f&uuml;r den schreibenden Zugriff nutzen und auch alle Steuer-elemente verwenden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_1185_006.png\" alt=\"Ergebnis der gespeicherten Prozedur f&uuml;r einen Benutzer mit einer Gruppe und nur einer expliziten Berechtigung\" width=\"649,559\" height=\"80,82526\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ergebnis der gespeicherten Prozedur f&uuml;r einen Benutzer mit einer Gruppe und nur einer expliziten Berechtigung<\/span><\/b><\/p>\n<p>Wir haben noch einen dritten Benutzer namens <b>Horst M&uuml;ller <\/b>angelegt, der den beiden Gruppen <b>Management <\/b>und <b>Bestellannahme <\/b>angeh&ouml;rt. Wenn wir das SQL Server Management Studio im Kontext dieses Benutzers &ouml;ffnen und die gespeicherte Prozedur <b>spObjektberechtigungen <\/b>f&uuml;r das Formular <b>frmIntro <\/b>ausf&uuml;hren, erhalten wir das Ergebnis aus Bild 7. Hier erkennen wir in der ersten Zeile f&uuml;r die Schaltfl&auml;che <b>cmdGo<\/b>, dass unter <b>AnzahlFestgelegterBerechtigungen <\/b>der Wert <b>1 <\/b>steht, aber unter <b>AnzahlGruppenDesBenutzers <\/b>der Wert <b>2<\/b>. Dies wird sp&auml;ter in der Auswertung in der VBA-Prozedur dazu f&uuml;hren, dass wir erkennen, dass f&uuml;r eine Gruppenzugeh&ouml;rigkeit keine explizite Berechtigung f&uuml;r das Objekt festgelegt wurde &#8211; was bedeutet, dass wir hierf&uuml;r das Recht <b>Alle <\/b>festlegen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_02\/pic_1185_007.png\" alt=\"Ergebnis der gespeicherten Prozedur f&uuml;r einen Benutzer mit zwei Gruppen, wo nur bei einer Gruppe ein explizites Recht f&uuml;r den Zugriff auf die Schaltfl&auml;che cmdGo festgelegt ist\" width=\"649,559\" height=\"103,848\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ergebnis der gespeicherten Prozedur f&uuml;r einen Benutzer mit zwei Gruppen, wo nur bei einer Gruppe ein explizites Recht f&uuml;r den Zugriff auf die Schaltfl&auml;che cmdGo festgelegt ist<\/span><\/b><\/p>\n<h2>VBA-Funktion zur Ermittlung der Zugriffsrechte<\/h2>\n<p>Damit kommen wir endlich zur VBA-Funktion <b>BerechtigungenAnwenden<\/b>. Sie erwartet einen Verweis auf das zu untersuchende Formular als Parameter und liefert einen Boolean-Wert zur&uuml;ck (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BerechtigungenAnwenden(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>bolForm<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMaxBerechtigungID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> rst = SPRecordsetMitParameter(\"spObjektberechtigungen\", _\r\n         Standardverbindungszeichenfolge, frm.Name)\r\n     bolForm = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">If <\/span>rst!AnzahlGruppenDesBenutzers &gt; rst!AnzahlFestgelegterBerechtigungen<span style=\"color:blue;\"> Then<\/span>\r\n             lngMaxBerechtigungID = 3\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             lngMaxBerechtigungID = rst!MaxberechtigungID\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Select Case rst!Element\r\n             <span style=\"color:blue;\">Case <\/span>\"Form\"\r\n                 bolForm = lngMaxBerechtigungID &gt; 1\r\n                 frm.AllowDeletions = lngMaxBerechtigungID &gt; 2\r\n                 frm.AllowAdditions = lngMaxBerechtigungID &gt; 2\r\n                 frm.AllowEdits = lngMaxBerechtigungID &gt; 2\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 frm.Controls(rst!Element).Enabled = lngMaxBerechtigungID &gt; 1\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     BerechtigungenAnwenden = bolForm\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion zum Ermitteln der Berechtigungen f&uuml;r ein Formular<\/span><\/b><\/p>\n<p>Die Prozedur nutzt die bereits weiter oben erw&auml;hnte Funktion <b>SPRecordsetMitParameter<\/b>, um ein Recordset auf Basis der gespeicherten Prozedur <b>spObjektberechtigungen <\/b>zu erstellen unter Verwendung der Verbindungszeichenfolge, welche die Funktion <b>Standardverbindungszeichenfolge <\/b>liefert (diese bezieht ihre Daten aus der Tabelle <b>tblVerbindungszeichenfolgen<\/b>, die Sie wiederum &uuml;ber das Formular <b>frmVerbindungszeichenfolgen <\/b>mit den Daten Ihres SQL Servers f&uuml;llen k&ouml;nnen). Als dritten Parameter &uuml;bergeben wir den Namen des Formulars. Dies ist der Parameter, den auch die gespeicherte Prozedur nutze.<\/p>\n<p>Bevor wir in eine <b>Do While<\/b>-Schleife einsteigen, mit der wir die Datens&auml;tze des Recordsets durchlaufen, stellen wir noch den Wert der Variablen <b>bolForm <\/b>auf <b>True <\/b>ein. Diese Variable wird gleich gegebenenfalls ver&auml;ndert und dann als Funktionswert an die aufrufende Prozedur zur&uuml;ckgegeben werden. Sie legt fest, ob das Formular ge&ouml;ffnet werden darf oder nicht. Da wir die Variable zu Beginn auf <b>True <\/b>einstellen, gehen wir vor Einsicht der einzelnen Berechtigungen davon aus, dass jedes Formular zun&auml;chst einmal ge&ouml;ffnet werden darf.<\/p>\n<p>Danach startet die Schleife, in der wir alle Datens&auml;tze des Ergebnisses der gespeicherten Prozedur <b>spObjektberechtigungen <\/b>durchlaufen. Hier pr&uuml;fen wir nun die Werte der beiden Felder <b>AnzahlGruppenDesBenutzers <\/b>und <b>AnzahlFestgelegterBerechtigungen<\/b>. Es kann ja geschehen, dass der Benutzer mehr Gruppen angeh&ouml;rt als Berechtigungen f&uuml;r seine Gruppen festgelegt sind. In diesem Fall haben wir eine Gruppe ohne explizit festgelegte Berechtigung f&uuml;r das aktuelle Element, was bedeutet, dass wir davon ausgehen, dass die Gruppe die vollen Berechtigungen erh&auml;lt. Dann stellen wir den Wert der Variablen <b>lngMaxBerechtigungID <\/b>auf <b>3 <\/b>ein. Anderenfalls, also wenn die Anzahl der Gruppen und der festgelegten Berechtigungen gleich ist, erh&auml;lt diese Variable den Wert aus dem Feld <b>MaxberechtigungID<\/b>.<\/p>\n<p>Danach pr&uuml;fen wir in einer <b>Select Case<\/b>-Bedingung, f&uuml;r welche Art von Element wir die Berechtigungen untersuchen. Es gibt nur zwei M&ouml;glichkeiten &#8211; f&uuml;r das Formular selbst (<b>Form<\/b>) oder f&uuml;r eines der enthaltenen Steuer-elemente. Im Falle des Formulars stellen wir den Wert von <b>bolForm<\/b>, also des sp&auml;teren R&uuml;ckgabewertes, auf <b>True <\/b>ein, wenn <b>lngMaxBerechtigungen <\/b>einen Wert gr&ouml;&szlig;er als <b>1 <\/b>enth&auml;lt (also <b>Lesen <\/b>oder <b>Alle<\/b>). Dieser R&uuml;ckgabewert entscheidet &uuml;brigens nur dar&uuml;ber, ob das Formular &uuml;berhaupt ge&ouml;ffnet werden darf und nicht, ob der Benutzer dann lesende oder alle Rechte f&uuml;r die gebundenen Daten des Formulars hat. Letzteres legen wir direkt fest. Wenn <b>lngMaxBerechtigungID <\/b>einen Wert gr&ouml;&szlig;er als <b>2 <\/b>hat (also die Berechtigung <b>Alle<\/b>), stellen wir die Eigenschaften <b>AllowDeletions<\/b>, <b>AllowAdditions <\/b>und <b>AllowEdits <\/b>auf den Wert <b>True <\/b>ein, anderenfalls auf den Wert <b>False<\/b>. Damit w&auml;re also sichergestellt, dass der Benutzer nur lesende Rechte erh&auml;lt, wenn er nicht die Berechtigung <b>Alle <\/b>hat.<\/p>\n<p>Neben den Berechtigungen f&uuml;r das Formular liefert <b>spObjektberechtigungen <\/b>ja noch die Berechtigungen f&uuml;r die einzelnen Steuer-elemente, sofern diese explizit festgelegt sind. In diesem Fall entscheiden wir nur, ob das Steuer-element aktiviert ist oder nicht. Hat <b>lngMaxBerechtigungID <\/b>einen Wert gr&ouml;&szlig;er <b>1<\/b>, also die Berechtigung <b>Lesen <\/b>oder <b>Alle<\/b>, wird das Steuer-element aktiviert. Anderenfalls erh&auml;lt die Eigenschaft <b>Enabled <\/b>den Wert <b>False<\/b>. Schlie&szlig;lich weisen wir <b>bolForm <\/b>dem R&uuml;ckgabewert der Funktion <b>BerechtigungAnwenden <\/b>zu.<\/p>\n<h2>Formular mit Aufruf von &#8222;Be-rech-tigung-An-wen-den&#8220; ausstatten<\/h2>\n<p>Nun brauchen wir nur noch daf&uuml;r zu sorgen, dass das Formular die Funktion <b>BerechtigungAnwenden <\/b>auch nutzt. Dazu nutzen wir die Ereigniseigenschaft <b>Beim &ouml;ffnen<\/b>.<\/p>\n<p>F&uuml;r diese legen wir die folgende Ereignisprozedur an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>BerechtigungenAnwenden(Me) = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur ruft die Funktion <b>BerechtigungenAnwenden <\/b>mit einem Verweis auf das Formular selbst auf und pr&uuml;ft, ob das Ergebnis den Wert <b>False <\/b>enth&auml;lt. In diesem Fall stellt die Prozedur den Wert des Parameters <b>Cancel <\/b>auf <b>True <\/b>ein, was dazu f&uuml;hrt, dass das &ouml;ffnen des Formulars abgebrochen wird.<\/p>\n<h2>Testen unter verschiedenen Benutzern<\/h2>\n<p>Sie k&ouml;nnen die Funktion in Access nun genau wie beim SQL Server Management Studio im Kontext verschiedener Benutzer testen. Dazu klicken Sie wieder bei gedr&uuml;ckter Umschalttaste mit der rechten Maustaste auf die Anwendung (hier <b>MSAccess.exe<\/b>) und w&auml;hlen den Eintrag <b>Als anderer Benutzer ausf&uuml;hren <\/b>aus. Bevor Sie das tun, ist allerdings noch ein weiterer Schritt n&ouml;tig: Die Datenbank, die Sie testen wollen, liegt ja vermutlich in einem Verzeichnis, dass dem aktuell auf dem Windows-Rechner angemeldeten Benutzer geh&ouml;rt. Auf dieses haben Sie keinen Zugriff, wenn Sie sich im Kontext eines anderen Benutzers anmelden. Also kopieren Sie die Datenbank zun&auml;chst in den &ouml;ffentlichen Ordner des aktuellen Windows-Rechners. Danach k&ouml;nnen Sie die Datenbank von dort &ouml;ffnen.<\/p>\n<h2>Sonderfall: Keine SQL Server-Gruppenzugeh&ouml;rigkeit<\/h2>\n<p>Es gibt einen Sonderfall, den wir beachten m&uuml;ssen: Wir haben hier die Gruppen <b>Berechtigungsadministrator<\/b>, <b>Management <\/b>und <b>Bestellannahme <\/b>angelegt, die wir auch als Anmeldung dem SQL Server und der Datenbank <b>Suedsturm_SQL <\/b>zugewiesen haben. Allerdings kann es ja auch sein, dass sich der Benutzer unter einem Benutzerkonto anmeldet, dass keiner dieser Gruppen angeh&ouml;rt. Dann liefert auch die gespeicherte Prozedur <b>spObjektberechtigungen <\/b>keine Datens&auml;tze. Sprich: Nach aktueller Programmierung gehen wir in diesem Fall davon aus, dass der Benutzer alle Rechte an allen Formularen und Steuerelementen der Datenbank hat. Diese Sicherheitsloch wollen wir noch stopfen.<\/p>\n<p>Die Frage ist nur, wo wir das erledigen &#8211; in der gespeicherten Prozedur <b>spObjektberechtigungen <\/b>oder in der Funktion <b>BerechtigungenAnwenden<\/b> Am einfachsten gelingt dies in der VBA-Funktion <b>BerechtigungenAnwenden<\/b>. Hier k&ouml;nnen wir zus&auml;tzlich pr&uuml;fen, ob das Recordset keine Werte enth&auml;lt. Die Erweiterung f&auml;llt recht knapp aus, denn wir pr&uuml;fen nach dem &ouml;ffnen des Recordsets schlicht, ob dieses keine Datens&auml;tze enth&auml;lt (<b>rst.EOF = True<\/b>). In diesem Fall stellen wir <b>bolForm <\/b>auf <b>False <\/b>ein, anderenfalls durchlaufen wir wie gewohnt die Datens&auml;tze des Recordsets:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BerechtigungenAnwenden(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     ...7\r\n     <span style=\"color:blue;\">Set<\/span> rst = ...\r\n     bolForm = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">If <\/span>rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         bolForm = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         ... Schleife durchlaufen\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     BerechtigungenAnwenden = bolForm\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Wenn Sie sich nun mit einem Benutzerkonto anmelden, dass nicht zu einer Benutzergruppe geh&ouml;rt, die der Datenbank als Anmeldung zugewiesen ist, werden Formulare, die BerechtigungenAnwenden aufrufen, nicht mehr ge&ouml;ffnet.<\/p>\n<h2>Das Problem mit Fehler 2501<\/h2>\n<p>In der Beispieldatenbank haben wir der Schaltfl&auml;che <b>cmdGO <\/b>des Formulars <b>frmIntro <\/b>eine Prozedur zugewiesen, welche das Formular <b>frmBerechtigungen <\/b>&ouml;ffnet und das Formular <b>frmIntro <\/b>schlie&szlig;t:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdGo_Click()\r\n     DoCmd.OpenForm \"frmBerechtigungen\"\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir die Anwendung nun im Kontext eines Benutzers &ouml;ffnen, der zwar die Berechtigung zum &ouml;ffnen des Formulars <b>cmdIntro <\/b>und zum Bet&auml;tigen der Taste <b>cmdGo <\/b>hat, aber f&uuml;r den f&uuml;r das Formular <b>frmBerechtigungen <\/b>die Berechtigung <b>Keine <\/b>festgelegt ist, bricht die im Formular <b>frmBerechtigungen <\/b>definierte Ereignisprozedur f&uuml;r das Ereignis <b>Beim &ouml;ffnen <\/b>das &ouml;ffnen des Formulars durch Setzen von <b>Cancel <\/b>auf den Wert <b>True <\/b>ab. Wenn dies bei einem mit <b>DoCmd.OpenForm <\/b>ge&ouml;ffneten Formular passiert, l&ouml;st dies allerdings f&uuml;r diese Anweisung den Fehler <b>2501<\/b>, <b>Die Aktion OpenForm wurde abgebrochen<\/b>, aus.<\/p>\n<p>Dies k&ouml;nnen Sie durch Deaktivieren der eingebauten Fehlerbehandlung und anschlie&szlig;endes Pr&uuml;fen der Fehlernummer unterbinden und durch eine entsprechende Meldung erl&auml;utern:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdGo_Click()\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     DoCmd.OpenForm \"frmBerechtigungen\"\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 2501<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Das Formular konnte nicht ge&ouml;ffnet werden.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Code sichern<\/h2>\n<p>Wenn Sie eine solche Anwendung weitergeben und sicherstellen wollen, dass die Berechtigungen auch tats&auml;chlich durchgesetzt werden, sollten Sie die Access-Datenbank in eine <b>.accde<\/b>-Datei umwandeln. Anderenfalls kann der Benutzer den VBA-Code nach seinen W&uuml;nschen &auml;ndern und beispielsweise einfach die <b>Form_Open<\/b>-Prozeduren so &auml;ndern, dass die Abfrage der Berechtigungen gar nicht mehr erfolgt.<\/p>\n<h2>Schritt f&uuml;r Schritt<\/h2>\n<p>Da wir eine Menge beteiligte Komponenten bei der Verwaltung und Durchsetzung der Berechtigungen verwenden, schauen wir uns nochmal im &uuml;berblick an, welche Schritte n&ouml;tig sind. Zun&auml;chst die Voraussetzungen:<\/p>\n<ul>\n<li>Legen Sie die Tabellen <b>tblBenutzergruppen<\/b>, <b>tblBerechtigungsstufen<\/b>, <b>tblObjekte <\/b>und <b>tblObjekteBenutzergruppenBerechtigungen<\/b> in der SQL Server-Datenbank an und verkn&uuml;pfen Sie die Access-Datenbank mit diesen Tabellen.<\/li>\n<li>F&uuml;gen Sie der Access-Anwendung das Formular <b>frmBerechtigungen <\/b>hinzu.<\/li>\n<li>Legen Sie in der SQL Server-Datenbank die gespeicherte Prozedur <b>spObjektberechtigungen<\/b> an.<\/li>\n<li>Legen Sie au&szlig;erdem die gespeicherte Prozedur <b>spBenutzergruppenAktualisieren <\/b>an.<\/li>\n<li>Au&szlig;erdem ben&ouml;tigen Sie die Tools f&uuml;r den Zugriff auf den SQL Server, also die Tabelle <b>tblFehler<\/b>, <b>tblSQLBefehle<\/b>, <b>tblTreiber <\/b>und <b>tblVerbindungszeichenfolgen <\/b>(siehe Beispieltabelle, vorher Anzeige der Systemobjekte und versteckten Objekte aktivieren). Als Formulare ben&ouml;tigen Sie noch <b>frmSQLBefehle<\/b>, <b>frmTabellenVerknuepfen<\/b>, <b>frmVerbindungszeichenfolgen <\/b>und <b>sfmSQLBefehle<\/b>.<\/li>\n<li>Das Modul <b>mdlToolsSQLServer <\/b>enth&auml;lt wichtige VBA-Funktionen, die wir auch teilweise verwenden.<\/li>\n<li>Das Modul <b>mdlBerechtigungen <\/b>enth&auml;lt speziell f&uuml;r die Verwaltung der Berechtigungen notwendige Prozeduren und Funktionen.<\/li>\n<li>Legen Sie, sofern noch nicht vorhanden, die gew&uuml;nschten Windows-Benutzergruppen an und f&uuml;gen Sie diese als Anmeldungen zum SQL Server und zur Zieldatenbank hinzu.<\/li>\n<\/ul>\n<p>Dann die notwendigen Schritte:<\/p>\n<ul>\n<li>Lesen Sie mit der Prozedur <b>ObjekteSchreiben <\/b>alle Formulare und die enthaltenen Steuer-elemente in die Tabelle <b>tblObjekte <\/b>ein.<\/li>\n<li>Rufen Sie die gespeicherte Prozedur <b>spBenutzergruppenAktualisieren <\/b>auf, um die Benutzergruppen der Zieldatenbank in die Tabelle <b>tblBenutzergruppen <\/b>zu schreiben.<\/li>\n<li>&ouml;ffnen Sie das Formular <b>frmBerechtigungen<\/b>, um die Berechtigungen f&uuml;r die Elemente und Benutzergruppen zu definieren.<\/li>\n<li>F&uuml;gen Sie den Formularen, die &uuml;ber Berechtigungen gesteuert werden sollen, die Ereignisprozedur <b>Form_Open <\/b>hinzu und erg&auml;nzen Sie diese wie oben beschrieben um den Aufruf der Funktion <b>BerechtigungenAnwenden<\/b>.<\/li>\n<li>Sorgen Sie daf&uuml;r, dass nirgends beim Aufrufen von Formularen Fehler angezeigt werden, weil das aufzurufende Formular mangels Rechten nicht ge&ouml;ffnet werden kann.<\/li>\n<\/ul>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Auf &auml;hnliche Weise k&ouml;nnen Sie auch die Berechtigungen zum &ouml;ffnen von Berichten realisieren. F&uuml;r die Steuer-elemente im Ribbon sieht es etwas anders aus, denn diese k&ouml;nnen wir nicht einfach &uuml;ber das Objektmodell einlesen.<\/p>\n<p>Hier ist es notwendig, eine spezielle Prozedur zu programmieren, welche die in der Tabelle <b>USysRibbons <\/b>gespeicherten Elemente einliest und speichert. <\/p>\n<p>Wir schauen uns einem sp&auml;teren Beitrag an, wie wir Berichte und Ribbons um das Verhalten in Abh&auml;ngigkeit der festgelegten Berechtigungen erweitern k&ouml;nnen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Suedsturm_SQL.bak<\/p>\n<p>Berechtigungen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/BB11D331-0070-4308-AFDF-D40D8CB6B6E1\/aiu_1185.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Berechtigungen f&uuml;r Access-Objekte per SQL Server I: Tabellen&#8220; haben wir ein Datenmodell entwickelt f&uuml;r die Verwaltung der Berechtigungen verschiedener Benutzergruppen auf die Formulare, Berichte und Steuer-elemente einer Access-Anwendung &#8211; gesteuert &uuml;ber die jeweilige Anmeldung an der SQL Server-Datenbank. Im zweiten Teil dieser Beitragsreihe haben wir das Formular zum Einstellen der Berechtigungen erstellt. Im dritten Teil zeigen wir nun, wie wir die gespeicherten Berechtigungen nutzen, um Formulare und Steuer-elemente vor dem unbefugten Zugriff zu sch&uuml;tzen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022019,662019,44000022],"tags":[],"class_list":["post-55001185","post","type-post","status-publish","format-standard","hentry","category-66022019","category-662019","category-SQL_Server_und_Co"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Berechtigungen f&uuml;r Access-Objekte per SQL Server I: Tabellen&quot; haben wir ein Datenmodell entwickelt f&uuml;r die Verwaltung der Berechtigungen verschiedener Benutzergruppen auf die Formulare, Berichte und Steuer-elemente einer Access-Anwendung - gesteuert &uuml;ber die jeweilige Anmeldung an der SQL Server-Datenbank. Im zweiten Teil dieser Beitragsreihe haben wir das Formular zum Einstellen der Berechtigungen erstellt. Im dritten Teil zeigen wir nun, wie wir die gespeicherten Berechtigungen nutzen, um Formulare und Steuer-elemente vor dem unbefugten Zugriff zu sch&uuml;tzen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:06:56+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/21d0712e3ba947b2ba6c8ee203c54ba0\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden\",\"datePublished\":\"2020-05-13T21:06:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/\"},\"wordCount\":4320,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/21d0712e3ba947b2ba6c8ee203c54ba0\",\"articleSection\":[\"2\\\/2019\",\"2019\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/\",\"name\":\"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/21d0712e3ba947b2ba6c8ee203c54ba0\",\"datePublished\":\"2020-05-13T21:06:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/21d0712e3ba947b2ba6c8ee203c54ba0\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/21d0712e3ba947b2ba6c8ee203c54ba0\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/","og_locale":"de_DE","og_type":"article","og_title":"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden","og_description":"Im Beitrag \"Berechtigungen f&uuml;r Access-Objekte per SQL Server I: Tabellen\" haben wir ein Datenmodell entwickelt f&uuml;r die Verwaltung der Berechtigungen verschiedener Benutzergruppen auf die Formulare, Berichte und Steuer-elemente einer Access-Anwendung - gesteuert &uuml;ber die jeweilige Anmeldung an der SQL Server-Datenbank. Im zweiten Teil dieser Beitragsreihe haben wir das Formular zum Einstellen der Berechtigungen erstellt. Im dritten Teil zeigen wir nun, wie wir die gespeicherten Berechtigungen nutzen, um Formulare und Steuer-elemente vor dem unbefugten Zugriff zu sch&uuml;tzen.","og_url":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:06:56+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/21d0712e3ba947b2ba6c8ee203c54ba0","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden","datePublished":"2020-05-13T21:06:56+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/"},"wordCount":4320,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/21d0712e3ba947b2ba6c8ee203c54ba0","articleSection":["2\/2019","2019","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/","url":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/","name":"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/21d0712e3ba947b2ba6c8ee203c54ba0","datePublished":"2020-05-13T21:06:56+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/21d0712e3ba947b2ba6c8ee203c54ba0","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/21d0712e3ba947b2ba6c8ee203c54ba0"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Berechtigungen_fuer_AccessObjekte_per_SQL_Server_III_Anwenden\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Berechtigungen f&uuml;r Access-Objekte per SQL Server III: Anwenden"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001185","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001185"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001185\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}