2010-01-06 9 views
25

Ich sehe eine Fehlermeldung beim Versuch, xp_cmdshell aus einer gespeicherten Prozedur auszuführen.Erhalte Berechtigung auf xp_cmdshell

xp_cmdshell ist für die Instanz aktiviert. Und die Ausführungsberechtigung wurde meinem Benutzer gewährt, aber ich sehe immer noch die Ausnahme.

Die EXECUTE-Berechtigung für das Objekt wurde verweigert ‚xp_cmdshell‘ Datenbank ‚Mssqlsystemresource‘, Schema ‚sys‘

Teil des Problems ist, dass dies eine gemeinsame Cluster ist, und wir haben eine einzige Datenbank für die Instanz Daher verfügen wir nicht über eine vollständige Palette von Administratorberechtigungen. Also kann ich nicht hineingehen und Genehmigungen erteilen, und was nicht.

+4

Warum verwenden Sie die gefährlichste gespeicherte Prozedur, die je gebaut wurde? ('xp_cmdshell') – SLaks

+0

Es ist älterer Code und keine Zeit, um neu zu schreiben. Wir verwenden es, um BCP aufzurufen, um eine Datei zur Verarbeitung in eine temporäre Tabelle zu importieren. Die temporäre Tabelle ist dynamisch sql und wir generieren die .fmt-Datei basierend auf der gleichen Logik, die die dynamische SQL verwendet. Es wäre mehr als ein Tag, um dies umzusetzen. –

+0

Können Sie die genaue SQL Server-Versionsnummer, einschließlich Build-Nummer? –

Antwort

51

Für Benutzer, die keine Mitglieder der sysadmin-Rolle in der SQL Server-Instanz sind, müssen Sie die folgenden Aktionen ausführen, um Zugriff auf die erweiterte gespeicherte Prozedur xp_cmdshell zu gewähren. Außerdem, wenn Sie einen der Schritte vergessen haben, habe ich den Fehler aufgelistet, der ausgelöst wird.

  1. die Prozedur xp_cmdshell aktivieren

    Msg 15281, Ebene 16, Status 1, Prozedur xp_cmdshell, Zeile 1 SQL Server Zugriff auf Prozedur blockiert 'sys.xp_cmdshell' der Komponente 'xp_cmdshell' weil diese Komponente als Teil der Sicherheitskonfiguration für diesen Server deaktiviert ist. Ein Systemadministrator kann die Verwendung von 'xp_cmdshell' mithilfe von sp_configure aktivieren. Weitere Informationen zu ‚xp_cmdshell‘ ermöglicht, „Oberflächenkonfiguration“ in SQL Server-Online-Dokumentation. *

  2. ein Login erstellen für die nicht-Sysadmin Benutzer, die Öffentlichkeit Zugang zu der Master-Datenbank hat

    Msg 229, Ebene 14, Status 5, Prozedur xp_cmdshell, Zeile 1 die EXECUTE-Berechtigung für das Objekt wurde verweigert 'xp_cmdshell' Datenbank 'Mssqlsystemresource', Schema 'sys'. *

  3. Grant-EXEC-Berechtigung für die Xp_cmdshell gespeicherte Prozedur

    Msg 229, Ebene 14, Status 5, Prozedur xp_cmdshell, Zeile 1 Die EXECUTE-Berechtigung für das Objekt wurde verweigert 'xp_cmdshell' Datenbank 'Mssqlsystemresource', Schema 'sys'. *

  4. erstellen eines Proxy-Konto, das unter Verwendung von sp_xp_cmdshell_proxy_account werden laufen xp_cmdshell

    Msg 15153, Ebene 16, Status 1, Prozedur xp_cmdshell, Zeile 1 Die xp_cmdshell Proxy-Kontoinformationen können nicht abgerufen werden oder sind ungültig. Stellen Sie sicher, dass die Berechtigung "## xp_cmdshell_proxy_account ##" vorhanden ist und gültige Informationen enthält.*

Es wäre von Ihrem Fehler scheint, dass entweder Schritt 2 oder 3 verpasst wurde. Ich bin nicht vertraut mit Clustern, um zu wissen, ob es etwas Bestimmtes für dieses Setup gibt.

+0

Ab heute bist du mein Held. Das hat mir wirklich geholfen! – Jens

+0

Danke, haben Sie Handbücher mit Code Follow-up? –

+0

@chester, von was hast du diese info genommen? So hilfreich. Vielen Dank. – Rachael

1

tchester sagte:

(2) Erstellen Sie ein Login für die nicht-Sysadmin Benutzer, die Öffentlichkeit Zugang zu der Master-Datenbank

ich Datenbank Liste meines Benutzers ging hat (Server/Sicherheit/Verbindungen/my user name/properties/user mapping, und wollte das Feld für die master-Datenbank überprüfen Ich bekam eine Fehlermeldung, die besagt, dass der Benutzer bereits in der master-Datenbank vorhanden ist, ging zur master-Datenbank, löschte den Benutzer, ging zurück zum "user mapping" und das Kontrollkästchen für den Master aktiviert haben. Aktivieren Sie das Kontrollkästchen "public".

Danach müssen Sie die Grant-Exe erneut ausstellen nett auf xp_cmdshell zu „meinen Benutzernamen“

Yves

36

Ich möchte die Antwort von tchester abzuschließen. Aktivieren

(1) die xp_cmdshell Prozedur:

-- To allow advanced options to be changed. 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 

-- Enable the xp_cmdshell procedure 
EXEC sp_configure 'xp_cmdshell', 1 
RECONFIGURE 
GO 

(2) Erstellen Sie einen Login-Namen 'Domain \ Testuser' (Windows-Benutzer) für die nicht-Sysadmin Benutzer, die Öffentlichkeit Zugang zu der Master-Datenbank hat

(3) Zuschuss EXEC-Berechtigung für die xp_cmdshell gespeicherte Prozedur:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser] 

(4) erstellen Sie ein Proxy-Konto, das unter Verwendung von sp_xp_cmdshell_proxy_account wird laufen xp_cmdshell

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'pwd' 
-- Note: pwd means windows password for [Domain\TestUser] account id on the box. 
--  Don't include square brackets around Domain\TestUser. 

(5) Grant-Steuerungsserver Erlaubnis Benutzer

USE master; 
GRANT CONTROL SERVER TO [Domain\TestUser] 
GO 
+0

Gewährt GRANT CONTROL SERVER NICHT [Domain \ TestUser] effektiv Sysadmin-Rechte für diesen Benutzer? Ich dachte, die ganze Idee wäre, die Berechtigungen für diesen Benutzer zu minimieren? – Colin

+2

Als ich das gelesen habe, dachte ich, dass der nicht-sys Admin-Benutzer ein Windows-Konto sein musste und auch das Proxy-Konto war. Nicht wahr. Das Proxy-Konto muss Windows sein. Dann benötigt jeder nicht-sys-Admin-Benutzer öffentlichen Zugriff, um die Berechtigung für xp_cmdshell zu verwalten und auszuführen. – Colin

+1

In meinem Fall war Schritt 4 völlig unnötig! – Johan

0

auf zu erweitern, was zum automatischen Export von Daten als CSV zu einer Netzwerkfreigabe über SQL Server-Agenten zur Verfügung gestellt worden.

(1) Aktivieren Sie die xp_cmdshell Prozedur:

-- To allow advanced options to be changed. 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 

-- Enable the xp_cmdshell procedure 
EXEC sp_configure 'xp_cmdshell', 1 
RECONFIGURE 
GO 

(2) Erstellen Sie einen Login-Namen 'Domain \ Testuser' (Windows-Benutzer) für die nicht-Sysadmin Benutzer, der Öffentlichkeit Zugang zu den Master-Datenbank hat. Fertig durch Benutzerzuordnung

(3) Melden Sie sich als Stapeljob an: Navigieren Sie zu Lokale Sicherheitsrichtlinie -> Lokale Richtlinien -> Zuweisen von Benutzerrechten.Fügen Sie Benutzer auf "Anmelden als Batch-Job"

(4) Geben Sie Lese-/Schreibberechtigungen Ordner für Domäne \ Benutzer zu vernetzen

(5) Grant-EXEC-Berechtigung für die Xp_cmdshell gespeicherte Prozedur:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser] 

(6) erstellen Sie ein Proxy-Konto, das

unter Verwendung sp_xp_cmdshell_proxy_account wird laufen xp_cmdshell
EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user' 

(7) Wenn der sp_xp_cmdshell_proxy_account Befehl nicht funktioniert, m erstellen Sie es von Jahr zu Jahr

create credential ##xp_cmdshell_proxy_account## with identity = 'Domain\DomainUser', secret = 'password' 

(8) Aktivieren Sie SQL Server Agent. Öffnen Sie den SQL Server-Konfigurations-Manager, navigieren Sie zu SQL Server-Dienste, aktivieren Sie den SQL Server-Agenten.

(9) Erstellen Sie einen automatisierten Job. Öffnen Sie SSMS, wählen Sie SQL Server Agent, klicken Sie dann mit der rechten Maustaste auf Jobs und klicken Sie auf "Neuer Job".

(10) Wählen Sie "Besitzer" als Ihren erstellten Benutzer. Wählen Sie "Steps", machen Sie "type" = T-SQL. Füllen Sie das Befehlsfeld ähnlich wie unten aus. Trennzeichen als ',' setzen

EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s "," 

(11) Füllen Sie die Zeitpläne entsprechend aus.

Verwandte Themen