9 Stimmen

MS SQL Server: Überprüfen Sie, ob ein Benutzer eine gespeicherte Prozedur ausführen kann

Wie können Sie überprüfen, ob ein Benutzer in MS SQL-Server eine gespeicherte Prozedur ausführen kann?

Ich kann überprüfen, ob der Benutzer explizite Ausführungsberechtigungen hat, indem ich mich mit der Master-Datenbank verbinde und Folgendes ausführe:

databasename..sp_helpprotect 'storedProcedureName', 'Benutzername'

Wenn der Benutzer jedoch Mitglied einer Rolle ist, die Ausführungsberechtigungen hat, wird mir sp_helprotect nicht weiterhelfen.

Idealerweise möchte ich in der Lage sein, etwas ähnliches aufzurufen wie

databasename..sp_canexecute 'storedProcedureName', 'Benutzername'

das einen bool-Wert zurückgeben würde.

0 Stimmen

Auch, wenn Sie SQL Server 2005 oder neuer verwenden und die Berechtigung dem Schema oder der Datenbank zugewiesen ist (EXECUTE kann jetzt sein), wird sp_helprotect dies nicht melden. Das gespeicherte Verfahren dient nur der Abwärtskompatibilität und meldet Berechtigungen basierend darauf, was in SQL Server 2000 vorhanden war.

14voto

Cade Roux Punkte 85601

4voto

Dane Punkte 9421

Versuchen Sie etwas Ähnliches:

CREATE PROCEDURE [dbo].[sp_canexecute]
@procedure_name varchar(255),
@username varchar(255),
@has_execute_permissions bit OUTPUT
AS

IF EXISTS (
        /* Explizite Berechtigung */
        SELECT 1
        FROM sys.database_permissions p
        INNER JOIN sys.all_objects o ON p.major_id = o.[object_id] AND o.[name] = @procedure_name
        INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND dp.[name] = @username
    )
    OR EXISTS (
        /* Rollenbasierte Berechtigung */
        SELECT 1
        FROM sys.database_permissions p
        INNER JOIN sys.all_objects o ON p.major_id = o.[object_id]
        INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND o.[name] = @procedure_name
        INNER JOIN sys.database_role_members drm ON dp.principal_id = drm.role_principal_id
        INNER JOIN sys.database_principals dp2 ON drm.member_principal_id = dp2.principal_id AND dp2.[name] = @username
    )
BEGIN
    SET @has_execute_permissions = 1
END
ELSE
BEGIN
    SET @has_execute_permissions = 0
END
GO

2voto

Pulsehead Punkte 4840

Unter der Annahme, dass der SP nur eine SELECT-Anweisung ausführt:

EXECUTE AS USER = [Benutzer-ID/Login]
EXEC sp_foobar(sna, fu)
REVERT

Es ist wichtig zu beachten, dass Sie den REVERT-Befehl nach der Aufforderung ausführen müssen, da SQL Server Sie als den Benutzer betrachtet, den Sie als AUSFÜHREN AS verwenden, bis Sie entweder die Verbindung trennen oder die Impersonation zurücksetzen. Mit anderen Worten, Sie sollten genau sehen, was ein Benutzer erhalten würde (erhalten Sie einige Zeilen, aber nicht alle? Dies sollte Ihnen helfen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X