none
Abfrage, auf welche DBs der aktuelle User zugreifen darf RRS feed

  • Frage

  • Hallo Zusammen,

    Folgende Situation:

    Ich habe ein ASP Web-Frontend und ca. 50 gleichartige (strukturgleiche) Datenbanken. Einige Benutzer dürfen auf mehrere dieser Datenbanken zugreifen, manche nur auf eine. Die Berechtigungen sind komplette über AD Gruppen zugewiesen.

    Jetzt soll für die Benutzer, die auf unterschiedliche Datenbanken zugreifen dürfen, ein Kombifeld eingeblendet werden, welches die berechtigten Datenbanken (und nur die) auflistet um so einen Wechsel der Datengrundlage auswählen zu können.

    Ist dies ohne eine Mapping Tabelle in einer zusätzlichen „Verwaltungs – DB“ möglich? Bzw. Kann ich auslesen, auf welche Datenbank eines Servers der aktuelle Benutzer über AD Gruppen berechtigt ist?

    Grüße Volker

    Dienstag, 3. Juli 2018 13:38

Antworten

  • Hallo Volker,

    das wird einfacher mit HAS_DBACCESS() funktionieren, z. B. über die Abfrage:

    SELECT name
    FROM sys.sysdatabases
    WHERE HAS_DBACCESS(name) = 1

    Falls du es genauer brauchst, könnte auch IS_MEMBER() hilfreich sein.

    Gruß Elmar

    Dienstag, 3. Juli 2018 14:52
    Beantworter

Alle Antworten

  • Hallo Zusammen,

    Folgende Situation:

    Ich habe ein ASP Web-Frontend und ca. 50 gleichartige (strukturgleiche) Datenbanken. Einige Benutzer dürfen auf mehrere dieser Datenbanken zugreifen, manche nur auf eine. Die Berechtigungen sind komplette über AD Gruppen zugewiesen.

    Jetzt soll für die Benutzer, die auf unterschiedliche Datenbanken zugreifen dürfen, ein Kombifeld eingeblendet werden, welches die berechtigten Datenbanken (und nur die) auflistet um so einen Wechsel der Datengrundlage auswählen zu können.

    Ist dies ohne eine Mapping Tabelle in einer zusätzlichen „Verwaltungs – DB“ möglich? Bzw. Kann ich auslesen, auf welche Datenbank eines Servers der aktuelle Benutzer über AD Gruppen berechtigt ist?

    Grüße Volker

    Es müssten somit nur die AD Gruppen angezeigt werden!?

    Powershell:

    Get-ADGroup -Filter * | Get-ADGroupMember | ? {$_.name -like "$env:username"} | Get-ADUser -Properties * | select -ExpandProperty Memberof | ? {$_ -match "Datenbankgruppenschnittmenge"}
    Mit Schnittmenge ist eine Schnittmenge im Namen gemeint, zB "Gruppe" für Gruppe1, Gruppe2, Gruppe3...

    Gibt das nen Anhaltspunkt?

    Ansonsten können auch beliebige SQL Queries in der Art und Weise verknüpft werden.



    • Bearbeitet BeatYa Dienstag, 3. Juli 2018 14:07
    Dienstag, 3. Juli 2018 14:04
  • Hallo BeatYa,

    vielen Dank für deine Antwort! Vor der AD Seite zu kommen funktioniert leider nicht, da viele User in hunderten von Gruppen haben und es vermutlich schwierig wird die richtig zu filtern!

    Ich habe das jetzt mal wie folgt versucht - kann man (darf man) das so machen???

    DECLARE @command NVARCHAR(MAX);
    
    EXEC sp_MSforeachdb 
    	@precommand = 'Create Table ##Results (db_name nvarchar(128))',
        @command1 = 'IF ''?'' NOT IN(''master'', ''model'', ''tempdb'', ''msdb'') BEGIN USE ? Insert into ##Results (db_name) Select TOP 1 DB_Name() from sys.sysusers End',
        @postcommand = 'SELECT * FROM ##Results; DROP TABLE ##Results';
    Grüße Volker

    Dienstag, 3. Juli 2018 14:43
  • Hallo Volker,

    das wird einfacher mit HAS_DBACCESS() funktionieren, z. B. über die Abfrage:

    SELECT name
    FROM sys.sysdatabases
    WHERE HAS_DBACCESS(name) = 1

    Falls du es genauer brauchst, könnte auch IS_MEMBER() hilfreich sein.

    Gruß Elmar

    Dienstag, 3. Juli 2018 14:52
    Beantworter
  • Hallo Elmar,

    genau das habe ich gebraucht!!!! Danke!

    Meine "Liste" hole ich mir jetzt so:

    SELECT name 
    FROM sys.sysdatabases 
    WHERE 
    	dbid > 4 AND 
    	has_DbAccess(name) = 1 
    	AND databasePropertyEx(name, 'Status') = 'ONLINE';
    Grüße Volker

    Dienstag, 3. Juli 2018 15:11