web-dev-qa-db-de.com

Ausführungsberechtigung für xp_cmdshell abrufen

Beim Versuch, xp_cmdshell aus einer gespeicherten Prozedur auszuführen, wird eine Fehlermeldung angezeigt.

xp_cmdshell ist aktiviert in der Instanz. Und die Ausführungsberechtigung wurde erteilt an meinen Benutzer, aber ich sehe immer noch die Ausnahme.

Die EXECUTE-Berechtigung wurde für das Objekt 'xp_cmdshell', die Datenbank 'mssqlsystemresource', das Schema 'sys' verweigert.

Ein Teil des Problems besteht darin, dass es sich um einen gemeinsam genutzten Cluster handelt und wir über eine einzige Datenbank in der Instanz verfügen, sodass wir nicht über vollständige Administratorberechtigungen verfügen. Also kann ich nicht reingehen und Berechtigungen erteilen, und was nicht.

31
David Griffiths

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. Aktivieren Sie die xp_cmdshell-Prozedur.

    Meldung 15281, Ebene 16, Status 1, Prozedur xp_cmdshell, Zeile 1 SQL Server hat den Zugriff auf die Prozedur 'sys.xp_cmdshell' der Komponente 'xp_cmdshell' blockiert, da diese Komponente im Rahmen der Sicherheitskonfiguration für diesen Server deaktiviert ist. Ein Systemadministrator kann die Verwendung von 'xp_cmdshell' mithilfe von sp_configure aktivieren. Weitere Informationen zum Aktivieren von 'xp_cmdshell' finden Sie unter "Oberflächenkonfiguration" in der SQL Server-Onlinedokumentation. *

  2. Erstelle ein Login für den Nicht-Sysadmin-Benutzer, der öffentlichen Zugriff auf die Master-Datenbank hat

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

  3. EXEC-Berechtigung für die gespeicherte Prozedur xp_cmdshell erteilen

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

  4. Erstellen Sie ein Proxy-Konto, unter dem xp_cmdshell mit sp_xp_cmdshell_proxy_account ausgeführt wird  

    Meldung 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 der Berechtigungsnachweis "## xp_cmdshell_proxy_account ##" vorhanden ist und gültige Informationen enthält. *

Es scheint aus Ihrem Fehler, dass entweder Schritt 2 oder 3 verfehlt wurde. Ich bin nicht mit Clustern vertraut, um zu wissen, ob diese Konfiguration etwas Besonderes ist.

54
user121489

Ich möchte die Antwort von tchester vervollständigen.

(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 ein Login "Domain\TestUser" (Windows-Benutzer) für den Nicht-Sysadmin-Benutzer, der öffentlichen Zugriff auf die Master-Datenbank hat

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

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]

(4) Erstellen Sie ein Proxy-Konto, unter dem xp_cmdshell mit sp_xp_cmdshell_proxy_account ausgeführt wird

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) Erteilen Sie dem Benutzer die Berechtigung des Steuerungsservers

USE master;
GRANT CONTROL SERVER TO [Domain\TestUser]
GO
42
nZeus

tchester sagte:

(2) Erstellen Sie ein Login für den Nicht-Sysadmin-Benutzer, der öffentlichen Zugriff auf die Master-Datenbank hat

Ich ging zur Datenbankliste meines Benutzers (Server/Sicherheit/Verbindungen/Benutzername/Eigenschaften/Benutzerzuordnung) und wollte das Kontrollkästchen für die Masterdatenbank aktivieren. Es wurde eine Fehlermeldung angezeigt, dass der Benutzer bereits in der Masterdatenbank vorhanden ist Um die Master-Datenbank zu erstellen, wurde der Benutzer gelöscht, der Benutzer kehrte zu "Benutzerzuordnung" zurück und markierte das Kontrollkästchen "Master". Aktivieren Sie das Kontrollkästchen "public".

Danach müssen Sie die Grant-Ausführung auf xp_cmdshell erneut auf "my user name" ausstellen.

Yves

1
Yves Forget

Um zu erweitern, was für das automatische Exportieren von Daten als CSV in eine Netzwerkfreigabe über den SQL Server-Agent bereitgestellt wurde.

(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 ein Login "Domain\TestUser" (Windows-Benutzer) für den Nicht-Sysadmin-Benutzer, der öffentlichen Zugriff auf die Master-Datenbank hat. Fertig durch User Mapping

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

(4) Erteilen Sie dem Netzwerkordner Lese-/Schreibberechtigungen für Domäne\Benutzer

(5) Erteilen Sie die EXEC-Berechtigung für die gespeicherte Prozedur xp_cmdshell:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]

(6) Erstellen Sie ein Proxy-Konto, unter dem xp_cmdshell mit sp_xp_cmdshell_proxy_account ausgeführt wird

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user'

(7) Wenn der Befehl sp_xp_cmdshell_proxy_account nicht funktioniert, erstellen Sie ihn manuell

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

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

(9) Automatisierten Job erstellen. Öffnen Sie SSMS, wählen Sie SQL Server Agent aus, klicken Sie mit der rechten Maustaste auf Jobs und klicken Sie auf "Neuer Job". 

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

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

(11) Zeitpläne entsprechend ausfüllen.

0
Schylar

Zeit, jetzt einen Beitrag zu leisten. Ich bin Sysadmin und habe daran gearbeitet, dass zwei Benutzer mit öffentlichem Zugriff xp_cmdshell ausführen. Ich kann xp_cmdshell ausführen, aber nicht die beiden Benutzer.

Ich habe die folgenden Schritte ausgeführt:

  1. neue Rolle erstellen:

    benutze master
    CREATE ROLE [CmdShell_Executor] AUTHORIZATION [dbo]
    GRANT EXEC ON xp_cmdshell TO [CmdShell_Executor]

  2. fügen Sie Benutzer zur master-Datenbank hinzu: Sicherheit -> Benutzer. Die Mitgliedschaft überprüft nur [CmdShell_Executor], das gerade erstellt wurde

  3. proxy-Account einrichten:

    EXEC sp_xp_cmdshell_proxy_account 'domain\user1', 'users1 Windows password'
    EXEC sp_xp_cmdshell_proxy_account 'domain\user2', 'users2 Windows password'

Anschließend können beide Benutzer die gespeicherte Prozedur ausführen, die xp_cmdshell enthält und einen R-Skriptlauf aufruft. Ich lasse die Benutzer zu meinem PC kommen, um das Kennwort einzugeben, den Code für eine Zeile auszuführen und dann das Kennwort zu löschen.

0
Laura Y