Unsere Entwickler müssen in der Lage sein, einen SQL Server Agent-Job über ihren .NET-Code zu starten. Ich weiß, dass ich msdb..sp_start_job aufrufen kann , um genau das zu tun, aber ich möchte allgemeinen Benutzerkonten keinen direkten Zugriff zum Ausführen von Jobs gewähren.
Ich möchte eine gespeicherte Prozedur in der Datenbank der Anwendung erstellen, indem ich die WITH EXECUTE AS-Klausel verwende, um mich als Proxy-Konto auszugeben. Das Verfahren, wie wir es haben, ist:
CREATE PROCEDURE dbo.StartAgentJob
WITH EXECUTE AS 'agentProxy'
AS
BEGIN
EXEC msdb.dbo.sp_start_job N'RunThisJob';
END
Wenn wir dies ausführen, erhalten wir jedoch die folgende Meldung:
The EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.
Irgendwelche Ideen? Ist dies überhaupt der beste Weg, dies in SQL2005 zu tun?
sql-server-2005
sql
sql-server
Ed Leighton-Dick
quelle
quelle
Antworten:
Haben Sie das agentProxy-Login in die msdb-Datenbank gestellt und ihr die Berechtigung zum Ausführen von sp_start_job erteilt? Wenn nicht, müssen Sie die Verkettung von Datenbankberechtigungen für die msdb-Datenbank und Ihre Benutzerdatenbank aktivieren.
Sie sind wahrscheinlich besser dran, das Login in die msdb-Datenbank zu stellen und ihr die richtigen Rechte zu gewähren.
quelle
Ich bin froh, dass Sie dies gelöst haben, aber die Verkettung von Eigentumsrechten ist nicht die empfohlene Lösung. Da Sie anscheinend ernsthaft besorgt über die Sicherheit und die ordnungsgemäße Granularität der betreffenden Rechte sind, füge ich diese Antwort hinzu, obwohl sie zu spät ist, als Hinweis darauf, was passiert und wie diese Probleme gelöst werden können.
AUSFÜHREN ALS Identitätswechselbereich
Die EXECUTE AS-Klauseln gibt es in zwei Varianten: EXECUTE AS LOGIN und EXECUTE AS USER. Das EXECUTE AS LOGIN wird vom Server authentifiziert und ist ein Identitätswechselkontext, dem die gesamte SQL-Instanz vertraut (mit Serverbereich):
EXECUTE AS USER wird von der Datenbank authentifiziert und ist ein Identitätswechselkontext, dem nur diese Datenbank vertraut (datenbankbezogen):
Eine gespeicherte Prozedur mit einer EXECUTE AS-Klausel erstellt einen Identitätswechselkontext mit Datenbankbereich und kann daher keine Objekte außerhalb der Datenbank referenzieren. In diesem Fall können Sie nicht referenzieren,
msdb.dbo.sp_start_job
da sich in befindetmsdb
. Es stehen viele andere Beispiele zur Verfügung, z. B. der Versuch, auf eine DMV mit Serverbereich zuzugreifen, ein Verbindungsserver zu verwenden oder eine Service Broker-Nachricht in eine andere Datenbank zu übermitteln.Um einem Identitätswechsel mit Datenbankbereich den Zugriff auf eine Ressource zu ermöglichen, die normalerweise nicht zulässig ist, muss dem Authentifikator des Identitätswechselkontexts vertraut werden. Bei einem Identitätswechsel mit Datenbankbereich ist der Authentifikator die Datenbank dbo. Dies kann auf zwei Arten erreicht werden:
Diese Details werden in MSDN: Erweitern des Datenbankidentitätswechsels mithilfe von EXECUTE AS beschrieben .
Wenn Sie das Problem über eine datenbankübergreifende Verkettung behoben haben, haben Sie die datenbankübergreifende Verkettung auf der gesamten Serverebene aktiviert, was als Sicherheitsrisiko angesehen wird. Der am besten kontrollierte und feinkörnige Weg, um das gewünschte Ergebnis zu erzielen, ist die Verwendung der Codesignatur:
dbo.StartAgentJob
mit diesem Zertifikatmsdb
msdb
msdb
Diese Schritte stellen sicher, dass dem EXECUTE AS-Kontext der
dbo.StartAgentJob
Prozedur jetzt vertraut wirdmsdb
, da der Kontext von einem Principal signiert ist, der über die Berechtigung AUTHENTICATE verfügtmsdb
. Dies löst die Hälfte des Puzzles. Die andere Hälfte besteht darin, die EXECUTE-Berechtigungmsdb.dbo.sp_start_job
für den jetzt vertrauenswürdigen Identitätswechselkontext zu erteilen . Dies kann auf verschiedene Arten geschehen:agentProxy
Benutzer zumsdb
und erteilen Sie ihm die Ausführungsberechtigung fürmsdb.dbo.sp_start_job
msdb
Authentifizierungszertifikat abgeleiteten Benutzer die Ausführungsberechtigungmsdb
und erteilen Sie diesem abgeleiteten Benutzer die AusführungsberechtigungOption 1. ist einfach, hat aber einen großen Nachteil: Der
agentProxy
Benutzer kann das nun nachmsdb.dbo.sp_start_job
eigenem Ermessen ausführen , erhält wirklich Zugriff aufmsdb
und verfügt über die Ausführungsberechtigung.Option 3 ist durchaus richtig, aber ich halte es für unnötig übertrieben.
Daher wird Option 2 bevorzugt: Erteilen Sie
msdb.dbo.sp_start_job
dem in Zertifikaten abgeleiteten Benutzer, der in erstellt wurde , die EXECUTE-Berechtigungmsdb
.Hier ist das entsprechende SQL:
Mein Blog enthält einige Artikel zu diesem Thema, die im Zusammenhang mit von Service Broker aktivierten Prozeduren geschrieben wurden (da für sie eine EXECUTE AS-Klausel erforderlich ist):
Übrigens, wenn Sie versuchen, mein Skript zu testen und auf der östlichen Hemisphäre oder im Sommer in Großbritannien leben, lesen Sie auf jeden Fall den letzten Artikel, den ich vor dem Testen verlinkt habe.
quelle
Da Sie versuchen, SQL Server Agent über .NET-Code zu starten, ist dies möglicherweise eine bessere Frage für StackOverflow.
http://www.stackoverflow.com
quelle
Durch Überprüfen einer zufälligen SQL-Instanz im Netzwerk SQLAgentOperatorRole erhalten Sie keine direkten Berechtigungen für sp_start_job, sondern erben diese von SQLAgentUserRole.
Überprüfen Sie es mit:
Führen Sie dies in MSDB aus und überprüfen Sie, ob Sie keinen expliziten Verweigerungszugriff geerbt haben.
hth.
quelle
Eine Möglichkeit, dies zu erreichen, ohne zusätzliche Berechtigungen zu erteilen: Lassen Sie den gespeicherten Prozess den Job nicht direkt starten, sondern lassen Sie den gespeicherten Prozess nur ein wenig in einer Tabelle (in der Anwendungsdatenbank) umblättern. Lassen Sie den Job dann jede Minute oder so laufen, prüfen Sie, ob das Bit gespiegelt ist, und führen Sie in diesem Fall die Arbeit aus und drehen Sie das Bit erneut zurück. Wenn der Job sieht, dass das Bit nicht gespiegelt ist, wird der Job einfach beendet.
Funktioniert wie ein Zauber, wenn Ihnen die Verzögerung nichts ausmacht (und der Job sehr oft ausgeführt wird).
quelle