none
MSSQL User Rechte abfragen. RRS feed

  • Frage

  • Ist es möglich die rechte aller user auf Datenbanken ab zu fragen.

    Ich habe auch changedatabase überlegt ich finde aber kein boolean der mir sagt ob der aktuelle user nun zugriff hat oder nicht.

    das problem ist das mit dem entsprechenden user auch andere programm optionen möglich sein sollen und das ohne lokal daten zu speichern, wer was kann oder darf.

    vb.net

    danke im voraus...

    PS: am besten wäre ein sql befehl der mir sagt welcher user auf welche db zugriff hat.

    Freitag, 25. Juni 2010 08:14

Antworten

  • Hallo,

    Du mußt dort den Datenbank-Benutzernamen angeben, und
    nicht etwa das Anmeldekonto - denn das sind zwei unterschiedliche Dinge.

    Ein Skript für die Northwind - der Kürze wegen relativ sinnfrei, was die Berechtigungen angeht.
    Zunächst die Anlage der Rolle, hier ist der "dbo" Besitzer der Datenbankrolle.

    -- Anlage einer Rolle
    
    USE [Northwind]
    GO
    -- Vertriebsrolle Besitzer ist dbo
    CREATE ROLE [VertriebRolle] 
    	AUTHORIZATION [dbo];
    -- Was für die Anzeige
    EXEC sys.sp_addextendedproperty 
    	@name=N'MS_Description', 
    	@value=N'Eine Beispiel-Datenbankrolle' , 
    	@level0type=N'USER',
    	@level0name=N'VertriebRolle';
    GO
    -- Customers: Angucken und Ändern
    GRANT VIEW DEFINITION, SELECT, UPDATE
    	ON [dbo].[Customers] 
    	TO [VertriebRolle];
    -- Products: Angucken und Ändern
    GRANT SELECT
    	ON [dbo].[Products] 
    	TO [VertriebRolle];
    -- Orders: Angucken, Einfügen, Ändern, Löschen
    GRANT VIEW DEFINITION, SELECT, INSERT, UPDATE, DELETE
    	ON [dbo].[Orders] TO [VertriebRolle]
    GRANT VIEW DEFINITION, SELECT, INSERT, UPDATE, DELETE
    	ON [dbo].[Order Details] 
    	TO [VertriebRolle];
    GO
    

    Und nun für eine Anmeldekonto "BenutzerKonto", das den Datenbankbenutzer "Benutzer" verwendet:

    USE [master]
    GO
    -- Anmeldekonto mit Standard-Authentifizierung
    CREATE LOGIN [BenutzerKonto] 
    	WITH PASSWORD=N'Kennwort' MUST_CHANGE, 
    	DEFAULT_DATABASE = [Northwind], 
    	DEFAULT_LANGUAGE = [Deutsch], 
    	CHECK_EXPIRATION = ON, 
    	CHECK_POLICY = ON;
    GO
    
    -- Anlage des Datenbankbenutzers "Benutzer"
    USE [Northwind]
    GO
    -- Anlage des Datenbank-Benutzers 
    -- hier abweichend vom Konto zur Verdeutlichung
    CREATE USER [Benutzer] 
    	FOR LOGIN [BenutzerKonto]
    	WITH DEFAULT_SCHEMA = [dbo];
    GO
    -- Mitglied in der VertriebRolle
    EXEC sp_addrolemember N'VertriebRolle', N'Benutzer'
    GO
    
    Gruß Elmar

    • Als Antwort markiert aktony Donnerstag, 22. Juli 2010 05:36
    Sonntag, 27. Juni 2010 11:21

Alle Antworten

  • Hallo,

    für eine bestimmte Datenbank könnte Dir
    select * from sys.database_principals
    helfen.

    Für die Rechte des einzelnen Users wäre sys.database_permissions hilfreich
    http://msdn.microsoft.com/de-de/library/ms188367.aspx

    Gruß
    Christa

    Freitag, 25. Juni 2010 09:25
  • Ok danke aber so richtig komme ich nicht damit klar.

    irgend wie zeigt der server mir nur einige benutzer an also nicht alle so fehlt z.b. "SA" , und ein anderer benutzer den ich angelegt habe.

    select * 
    from sysusers 
    --where name = 'sa'

    wenn ich jetzt die Procedur nehme die verweiste benutzer anzeigt und ein wenig veränder.

    IF DB_ID('Fahrzeugeinsatz') > 4
    	SELECT 'Fahrzeugeinsatz' as DBName,
    	name AS UserName, 
    	sid AS UserSID 
    	FROM .sysusers 
    	WHERE issqluser = 1 AND
    	(
    	--sid IS NOT NULL AND
    	 sid >= 0x0
    	 )
    	--AND suser_sname(sid) IS NULL
    	ORDER BY name

    zeigt er auch nur einen echten benutzer an.

     

    Freitag, 25. Juni 2010 15:42
  • Hallo,

    auch um Meta-Daten wie Berechtigungen oder Konfigurationswerte auslesen zu können, benötigt man entsprechende Rechte.

    Hat man die nicht, kann man z.B. aus Sys.SysUsers auch nur einen User auslesen; nämlich den eigenen.


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Freitag, 25. Juni 2010 16:29
  • das ist das seltsame ich bin als SA drin.

    es ist ja schon so das nicht nur ein user angezeigt wird sondern ist es so das der dann auch noch auf datenbanken rechte hat wo er keine haben sollte.

    jetzt muss ich mal nin bsp. geben vieleicht verstehe ich da auch nur irgend was falsch.

    ich erstelle nin user xy der soll auf db xy voll zugriff haben wenn ich jetzt sage das der owner ist sollte dieser user nur DB xy sehen und auch drauf zugreifen können oder.

    jetzt erstelle ich noch einen user qw der ist owner auf qw so gleiches spiel.

    nun aber ist es so das wenn ich via programm vb.net mit user xy eine verbindung herstelle geht das nur mit DB xy soweit alles top. wenn ich nun mich direkt am server anmelde sehe ich aber mit user xy auch DB qw das ist doch schon nicht richtig oder ?

    wenn ich nun den SQL befehl wie oben ausführe sehe ich immer nur benutzer qw egal mit welchen account ich mich am server anmelde?

    vieleicht wäre eine sql abfrage bei welcher DB der entsprechende user owner ist eigentlich schon hilfreich.

    PS: wie lösche ich verweiste benutzer  ??

    Freitag, 25. Juni 2010 19:10
  • Hallo,

    aus Deiner Beschreibung ist die Quintessenz nur schwer zu ermitteln.

    Grundsätzlich unterscheider der SQL Server (ab 2005) sehr fein,
    wer was wann und wo sehen darf, siehe Berechtigungen und
    Konfigurieren der Sichtbarkeit von Metadaten und wem das zu fein ist:
    Behandlung von Problemen bei der Sichtbarkeit von Metadaten

    Willst Du explizite Berechtigungen einfügen kannst Du zum einen
    mit Funktionen wie HAS_PERMS_BY_NAME oder auch über die
    Funktion fn_my_permissions , die aktuellen Berechtigungen abfragen
    (auf sys.users und Co. sollte man in der Regel verzichten)

    Im einfachsten Falle reicht es für ein (VB.NET) Programm seine
    SELECT Anweisung abzusetzen. Gehts nicht, gibt es einen Fehler.
    Willst Du Deinem Programm ein Rollenkonzept verpassen,
    bietet sich das Einrichten von eigenen Datenbankrollen an,
    darauf kannst Du direkt z. B. via IS_MEMBER abfragen
    und  die Ansichten in Deinem Programm entsprechend konfigurieren.

    Gruß Elmar

     

    Samstag, 26. Juni 2010 08:10
  • ok ich habe jetzt alle rechte noch mal neu eingestellt jetzt können auch am server direkt jeder user nur auf seine DB zugreifen.

    woran es nun lag ich weiss es nicht.

    rollenkonzept das klingt gut den wenn ich eine select absetze kann ich zwar alles mit einer exeption abfangen aber die einstellungen übernimmt das prog. dann nicht so richtig.

    wie richte ich das dann ein ? 

    Samstag, 26. Juni 2010 15:48
  • Hallo,

    das kann Du über das SSMS machen, dort unter Sicherheit -> Datenbankrollen
    oder über gespeicherte Prozeduren wie sp_addrole , sp_addrolemember usw.

    Gruß Elmar

    • Bearbeitet Elmar Boye Sonntag, 27. Juni 2010 11:22 Datenbankrollen nicht Anwendungsrollen
    Samstag, 26. Juni 2010 17:22
  • Mh irgendwie mach er das nicht.

    fehler:

    Meldung 15151, Ebene 16, Status 1, Zeile 1
    Suchen des Benutzer-Objekts 'RKA_user' ist nicht möglich, weil das Objekt nicht vorhanden ist oder Sie nicht die erforderliche Berechtigung haben.

    ich bin als sa drin und den user 'RKA_user' gibt es.

    sp_addrole @rolename = 'RKA', @ownername = 'RKA_user'

    was geht ist..

    create role RKA

    dann zeigt mir der mamager die role aber nicht an.

    und wenn ich das ganze um

    CREATE ROLE role_name [ AUTHORIZATION owner_name ]

    mache gibt er mir die gleiche meldung.

    geht das mit express vieleicht garnicht.

    Sonntag, 27. Juni 2010 10:25
  • Hallo,

    Du mußt dort den Datenbank-Benutzernamen angeben, und
    nicht etwa das Anmeldekonto - denn das sind zwei unterschiedliche Dinge.

    Ein Skript für die Northwind - der Kürze wegen relativ sinnfrei, was die Berechtigungen angeht.
    Zunächst die Anlage der Rolle, hier ist der "dbo" Besitzer der Datenbankrolle.

    -- Anlage einer Rolle
    
    USE [Northwind]
    GO
    -- Vertriebsrolle Besitzer ist dbo
    CREATE ROLE [VertriebRolle] 
    	AUTHORIZATION [dbo];
    -- Was für die Anzeige
    EXEC sys.sp_addextendedproperty 
    	@name=N'MS_Description', 
    	@value=N'Eine Beispiel-Datenbankrolle' , 
    	@level0type=N'USER',
    	@level0name=N'VertriebRolle';
    GO
    -- Customers: Angucken und Ändern
    GRANT VIEW DEFINITION, SELECT, UPDATE
    	ON [dbo].[Customers] 
    	TO [VertriebRolle];
    -- Products: Angucken und Ändern
    GRANT SELECT
    	ON [dbo].[Products] 
    	TO [VertriebRolle];
    -- Orders: Angucken, Einfügen, Ändern, Löschen
    GRANT VIEW DEFINITION, SELECT, INSERT, UPDATE, DELETE
    	ON [dbo].[Orders] TO [VertriebRolle]
    GRANT VIEW DEFINITION, SELECT, INSERT, UPDATE, DELETE
    	ON [dbo].[Order Details] 
    	TO [VertriebRolle];
    GO
    

    Und nun für eine Anmeldekonto "BenutzerKonto", das den Datenbankbenutzer "Benutzer" verwendet:

    USE [master]
    GO
    -- Anmeldekonto mit Standard-Authentifizierung
    CREATE LOGIN [BenutzerKonto] 
    	WITH PASSWORD=N'Kennwort' MUST_CHANGE, 
    	DEFAULT_DATABASE = [Northwind], 
    	DEFAULT_LANGUAGE = [Deutsch], 
    	CHECK_EXPIRATION = ON, 
    	CHECK_POLICY = ON;
    GO
    
    -- Anlage des Datenbankbenutzers "Benutzer"
    USE [Northwind]
    GO
    -- Anlage des Datenbank-Benutzers 
    -- hier abweichend vom Konto zur Verdeutlichung
    CREATE USER [Benutzer] 
    	FOR LOGIN [BenutzerKonto]
    	WITH DEFAULT_SCHEMA = [dbo];
    GO
    -- Mitglied in der VertriebRolle
    EXEC sp_addrolemember N'VertriebRolle', N'Benutzer'
    GO
    
    Gruß Elmar

    • Als Antwort markiert aktony Donnerstag, 22. Juli 2010 05:36
    Sonntag, 27. Juni 2010 11:21
  • ok super ich habe den server noch mal neu gemacht war mir zu viel verstellt.

    so bis auf das hat alles auch gefunkt.

    -- Customers: Angucken und Ändern
    GRANT VIEW DEFINITION, SELECT, UPDATE
    	ON [dbo].[Customers] 
    	TO [VertriebRolle];
    -- Products: Angucken und Ändern
    GRANT SELECT
    	ON [dbo].[Products] 
    	TO [VertriebRolle];
    -- Orders: Angucken, Einfügen, Ändern, Löschen
    GRANT VIEW DEFINITION, SELECT, INSERT, UPDATE, DELETE
    	ON [dbo].[Orders] TO [VertriebRolle]
    GRANT VIEW DEFINITION, SELECT, INSERT, UPDATE, DELETE
    	ON [dbo].[Order Details] 
    	TO [VertriebRolle];
    GO
    

    was mir dann aufviel ist das jetzt in der DB ansich der ordner sicherheit auftauchte.

    war meiner meinung nach nicht. ich konnte die rechte dann ja manuel setzen.

    Wie kann ich die role nun abfragen?

    Dienstag, 29. Juni 2010 06:12
  • Hallo,

    wie Du die Rechte abfragen kannst, hatte ich oben schon beschrieben:

    Willst Du Deinem Programm ein Rollenkonzept verpassen,
    bietet sich das Einrichten von eigenen Datenbankrollen an,
    darauf kannst Du direkt z. B. via IS_MEMBER abfragen
    und  die Ansichten in Deinem Programm entsprechend konfigurieren.

    Gruß Elmar

    Dienstag, 29. Juni 2010 07:18
  • mh ich benutze diese

    use [TESTdb] 
    go
    
    IF IS_MEMBER ('testrole') = 1
     PRINT 'Current user is a member of the FErole role'
    ELSE IF IS_MEMBER ('testrole') = 0
     PRINT 'Current user is NOT a member of the FErole role'
    ELSE IF IS_MEMBER ('testrole') IS NULL
     PRINT 'ERROR: Invalid group / role FErole specified'
    GO

    Antwort:

    Current user is NOT a member of the testrole role

    Bei den eigenschaften steht der Role steht nur testuser und bei dem testanmeldung?

    was testet er da den benutzer oder die anmeldung.

     fehlt hier vieleicht nin schema?

    • Bearbeitet aktony Dienstag, 29. Juni 2010 08:14 vergessen
    Dienstag, 29. Juni 2010 08:13
  • Irgendwie ist bei

    SELECT CURRENT_USER;
    GO

    immer dbo die antwort.

    IF IS_MEMBER ('dbo') = 1

    und hier bestätigt er das ganze

    Current user is a member of the dbo role

    wie mach ich das er den user auf testuser setzt und nicht auf dbo..

    Dienstag, 29. Juni 2010 08:27
  • ok jetzt hat er´s.

    seltsam zwei neustarts "hard" waren nötig beim ersten waren alle user sogar SA testuser

    aber nun hat er´s

    danke für die hilfe hat mich auf jeden fall weiter gebracht.

    Dienstag, 29. Juni 2010 08:58
  • Hallo,

    Datenbank-Rollen arbeiten mit dem Datenbankbenutzer (und nicht dem Konto).

    Die Angabe AUTHORIZATION bei CREATE ROLE legt auf den Besitzer fest.
    Und das sollte nicht der Nutzer der Rolle selbst sein, sondern ein höherberechtigter
    Datenbankbenutzer, im Zweifelsfalle der Datenbankbesitzer (eben dbo).

    Neustarts sind nicht erforderlich, nur eine Ab- und erneute Anmeldung für das
    Konto, das man testet. Denn die Berechtigungen werden nach der Anmeldung
    zwischengespeichert.

    Gruß Elmar
    Dienstag, 29. Juni 2010 09:29
  • genau das hat er dann irgendwie nicht gemacht egal mit wenn ich mich anmeldete waren alle testuser.

    aber egal jetzt funkt´s.

    PS: ich habe glaube ne nochbessere lösung gefunden.

    sp_helplogins

    muss nur mal sehen wie das mit den user ist aber erste tests geben ne Tabelle mit Anmeldenamen + zugeordneten DB´s.

     link_zur_Quelle

    Dienstag, 29. Juni 2010 09:56
  • Hallo,

    für Informationen zu den Rollen, solltest Du eher verwenden
    sp_helprole
    sp_helprolemember

    Dabei handelt es sich aber (wie bei allen sp_help.... Prozeduren)
    um Informationsfunktionen. Für eine konkrete Abfrage im Code ist
    IS_MEMBER besser und schneller.

    Was den Link angeht: Beachte das sich vieles mit SQL Server 2005++
    beim Rechtekonzept geändert hat und nicht immer 1 : 1 übernommen
    werden kann. Wobei den Datenbankrollen eher wenig passiert ist.

    Sicherheitsprozeduren wie sp_addlogin und Co, die in dem Artikel noch
    verwendet werden, sollte man nicht mehr verwenden, da sie in einer der
    nächsten Versionen verschwinden werden.
    Und anstatt dessen die T-SQL Befehle wie CREATE LOGIN und Co verwenden.

    Gruß Elmar

     

    Dienstag, 29. Juni 2010 10:18