2009-07-21 19 views
4

Ich brauche folgendes fo:Objektberechtigungen -TSQL

  1. Überprüfen Sie, ob Public oder guest gewährt jede Berechtigung für ein Objekt (Datenbankrolle und Serverfunktion)
  2. Überprüfen Sie, ob jeder Benutzer-Berechtigungen für gewährt wird ein Objekt statt Rollen.
  3. Überprüfen Sie, ob ein Benutzer with grant Privilegien auf einem Objekt
  4. Prüfen Sie, wer Zugriff auf erweiterte gespeicherte Prozeduren hat

ich (was ich von select name from sysobjects where xtype='X' bekommen) denken, dass sie alle miteinander verbunden (aber don sind‘ Ich weiß wie).

Kann irgendjemand dazu einen Rat geben?
Oder leiten Sie mich mit nützlichen Tabellen?

Jede Hilfe würde sehr geschätzt werden.

+1

Welche Version: es ist ** wirklich ** wichtig. – RBarryYoung

+0

Einverstanden. Aber ich denke, das ist SQL 2000. Weil Manjot sagt über sysobjects, nicht sys.objects :) –

+0

Microsoft SQL Server 2005 (SP2) – Manjot

Antwort

1

Hier ist ein guter proc für # 3 von SQL Server Central.com

http://www.sqlservercentral.com/scripts/Permissions/64309/

Ich glaube, Sie es für # 4

+0

Es ist für SQL 2000, aber Artikel ist sehr hilfreich, danke! –

+0

Danke. Ich versuchte es auf SQL2005 ausgeführt als: RetrievePermissions ('public', '', 1) Beschwerden: Falsche Syntax in der Nähe von 'öffentlichen'. Ich las die Header-Kommentare darin und die Syntax scheint mir richtig. Irgendein Rat? – Manjot

+0

@Manjot, entfernen Sie die Klammern. Verwenden Sie es so - exec RetrievePermissions 'public', '', 1 –

1

IN MSSQL 2005/2008 ändern können - mit SELECT CURRENT_USER Sie können den aktuellen Benutzernamen abrufen - mit sp_helpuser können Sie aktuelle Benutzerrollen abrufen - mit sys.obecjts, sys.database_principals und sys.database_permissions, die Sie die Benutzer Privilegien erhalten.

1

Angenommen, Sie sind zumindest auf SQL 2005 ...

Die relevanten Metadaten in sys.database_permissions für Datenbank sicherungsfähigen Elemente und in sys.server_permissions für Serverebene sicherungsfähigen Elemente gespeichert wird. Sie erhalten die Liste der Datenbankprinzipale (Benutzer und Rollen) von sys.database_principals, die Serverprinzipale (Logins und Serverrollen) von sys.server_principals.

Dadurch erhalten Sie die Liste der expliziten Berechtigungen, aber Sie müssen auch die impliziten Berechtigungen berücksichtigen, die nicht deklariert sind. Bestimmte Gruppen haben eine implizite Berechtigung. Um die Dinge noch weiter zu verkomplizieren, müssen Sie sich auch mit Windows-Gruppenmitgliedschaften befassen, die nicht in einer SQL-Ansicht deklariert sind, aber bei Zugriffsprüfungen berücksichtigt werden. Schließlich sind die Zugriffsregeln ziemlich kompliziert: Ein Prinzipal kann ein Privileg durch eine explizite GRANT haben, durch Mitgliedschaft in einer Gruppe, der das Privileg erteilt wurde, aber jede DENY übertrumpft alle GRANTs und das muss berücksichtigt werden, außer sicherbar Eigentum, das jeden DENY übertrumpft. Das Sahnehäubchen ist die Sysadmin-Mitgliedschaft, die alle Privilegienregeln übertrumpft: Sysadmin hat per Definition alle Privilegien.

Sie können für die meisten Principals alle Privilegien überprüfen, indem Sie den Principal über EXECUTE AS imitieren und die Ausgabe von fn_my_permissions auf dem gewünschten sicherungsfähigen System überprüfen.

+0

Danke für diese Beschreibung – Manjot

5

So:

Create View vwObjectPermissions AS 
select schema_name(o.schema_id) as [Schema_Name] 
, o.name as [object_name] 
, u.name as [principal_name] 
, u.type_desc as [principal_type] 
, r.minor_id, r.permission_name, r.state_desc 
, o.schema_id, o.principal_id as [alt_owner], o.type_desc 
from sys.database_permissions r 
    Left Join sys.database_Principals u 
    ON r.grantee_principal_id = u.principal_id 
    Left Join sys.all_objects o 
    ON o.object_id = r.major_id 
Where class_desc NOT IN ('database') 
GO 

--1. Check if Public or guest is granted any permission on an object (database role and server role) 
Select * from vwObjectPermissions 
Where principal_name IN ('Public','Guest') 

--2. Check if any user is granted permissions on an object rather than roles. 
Select * from vwObjectPermissions 
Where principal_type NOT LIKE '%ROLE%' 

--3. Check if a user has "with grant" previliges on an object 
Select * from vwObjectPermissions 
Where state_desc = 'WITH GRANT'  --check the spelling on this one 

--4. Check who has access to extended stored procedures (which I get from select name from sysobjects where xtype='X') 
Select * from vwObjectPermissions 
Where type_desc LIKE '%X%Proc%' 

GO 
drop view vwObjectPermissions; 
+0

Danke dafür. Also, ich muss es in allen Datenbanken richtig ausführen? Was passiert, wenn ich es auf einem 2000 Server anwenden muss? – Manjot

+0

Verwenden Sie dann die 2000-Lösung, die jemand gepostet hat. 2005 und 2000 sind in diesem einen Bereich zu verschieden, als dass es praktisch wäre, eine Lösung zu finden, die auf beiden korrekt funktioniert. – RBarryYoung