Udostępnij za pośrednictwem


xp_cmdshell (Transact-SQL)

Dotyczy:programu SQL Server

Duplikuje powłokę poleceń systemu Windows i przekazuje ciąg do wykonania. Wszystkie dane wyjściowe są zwracane jako wiersze tekstu.

Transact-SQL konwencje składni

Składnia

xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]

Argumenty

Ważny

Argumenty dla rozszerzonych procedur składowanych należy wprowadzić w określonej kolejności zgodnie z opisem w sekcji składni. Jeśli parametry są wprowadzane poza kolejnością, wystąpi komunikat o błędzie.

'command_string'

Ciąg zawierający polecenie, które ma zostać przekazane do systemu operacyjnego. command_string jest varchar(8000) lub nvarchar(4000), bez wartości domyślnej. command_string nie może zawierać więcej niż jednego zestawu podwójnych cudzysłowów. Jedna para cudzysłowów jest wymagana, jeśli jakiekolwiek spacje znajdują się w ścieżkach plików lub nazwach programów, do których odwołuje się command_string. Jeśli masz problemy z osadzonymi spacjami, rozważ użycie nazw plików FAT 8.3 jako obejścia.

dane wyjściowe NO_

Opcjonalny parametr określający, że żadne dane wyjściowe nie powinny być zwracane do klienta.

Zwracanie wartości kodu

0 (powodzenie) lub 1 (niepowodzenie).

Zestaw wyników

Wykonanie następującej instrukcji xp_cmdshell zwraca listę katalogów bieżącego katalogu.

EXEC xp_cmdshell 'dir *.exe';
GO

Wiersze są zwracane w kolumnie nvarchar(255). Jeśli jest używana opcja NO_OUTPUT, zwracane są tylko następujące dane wyjściowe:

The command(s) completed successfully.

Uwagi

Proces systemu Windows zduplikowany przez xp_cmdshell ma te same prawa zabezpieczeń co konto usługi programu SQL Server.

Ostrożność

xp_cmdshell jest zaawansowaną funkcją i domyślnie wyłączoną. xp_cmdshell można włączyć i wyłączyć za pomocą zarządzania opartego na zasadach lub wykonując sp_configure. Aby uzyskać więcej informacji, zobacz konfiguracja obszaru powierzchni i xp_cmdshell (opcja konfiguracji serwera). Użycie xp_cmdshell może wyzwalać narzędzia inspekcji zabezpieczeń.

xp_cmdshell działa synchronicznie. Kontrolka nie jest zwracana do elementu wywołującego do momentu ukończenia polecenia powłoki poleceń. Jeśli xp_cmdshell jest wykonywana w partii i zwraca błąd, partia zakończy się niepowodzeniem.

konto serwera proxy xp_cmdshell

Gdy jest wywoływany przez użytkownika, który nie jest członkiem sysadmin stałej roli serwera, xp_cmdshell nawiązuje połączenie z systemem Windows przy użyciu nazwy konta i hasła przechowywanego w poświadczeniu o nazwie ##xp_cmdshell_proxy_account###. Jeśli to poświadczenie serwera proxy nie istnieje, xp_cmdshell zakończy się niepowodzeniem.

Poświadczenia konta serwera proxy można utworzyć, wykonując sp_xp_cmdshell_proxy_account. Jako argumenty ta procedura składowana przyjmuje nazwę użytkownika i hasło systemu Windows. Na przykład następujące polecenie tworzy poświadczenia serwera proxy dla użytkownika domeny systemu Windows SHIPPING\KobeR z hasłem systemu Windows sdfh%dkc93vcMt0.

EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';

Aby uzyskać więcej informacji, zobacz sp_xp_cmdshell_proxy_account.

Uprawnienia

Ze względu na to, że złośliwi użytkownicy czasami próbują podnieść swoje uprawnienia przy użyciu xp_cmdshell, xp_cmdshell jest domyślnie wyłączona. Włącz sp_configure lub zarządzanie oparte na zasadach . Aby uzyskać więcej informacji, zobacz xp_cmdshell Server Configuration Option.

Po pierwszym włączeniu xp_cmdshell wymaga uprawnień CONTROL SERVER do wykonania, a proces systemu Windows utworzony przez xp_cmdshell ma ten sam kontekst zabezpieczeń co konto usługi programu SQL Server. Konto usługi programu SQL Server często ma więcej uprawnień niż jest to konieczne do pracy wykonywanej przez proces utworzony przez xp_cmdshell. Aby zwiększyć bezpieczeństwo, dostęp do xp_cmdshell powinien być ograniczony do wysoce uprzywilejowanych użytkowników.

Aby zezwolić administratorom na używanie xp_cmdshelli zezwól programowi SQL Server na tworzenie procesów podrzędnych przy użyciu tokenu zabezpieczającego mniej uprzywilejowanego konta, wykonaj następujące kroki:

  1. Utwórz i dostosuj konto użytkownika lokalnego systemu Windows lub konto domeny z najmniejszymi uprawnieniami wymaganymi przez procesy.

  2. Użyj procedury systemu sp_xp_cmdshell_proxy_account, aby skonfigurować xp_cmdshell do korzystania z tego konta z najniższymi uprawnieniami.

    Nuta

    To konto serwera proxy można również skonfigurować przy użyciu programu SQL Server Management Studio, klikając prawym przyciskiem myszy właściwości nazwę serwera w Eksploratorze obiektów i przeglądając kartę zabezpieczeń dla konta serwera proxy programu Server.

  3. W programie Management Studio przy użyciu bazy danych master wykonaj następującą instrukcję Transact-SQL, aby nadać określonymadministratorowi systemu możliwość wykonywania xp_cmdshell. Określony użytkownik musi istnieć w bazie danych master.

     GRANT exec ON xp_cmdshell TO N'<some_user>';
    

Teraz administratorzy nie mogą uruchamiać procesów systemu operacyjnego przy użyciu xp_cmdshell, a te procesy są uruchamiane z uprawnieniami skonfigurowanego konta serwera proxy. Użytkownicy z uprawnieniami CONTROL SERVER (członkowie sysadmin stałej roli serwera) nadal otrzymują uprawnienia konta usługi PROGRAMU SQL Server dla procesów podrzędnych uruchamianych przez xp_cmdshell.

Aby określić konto systemu Windows używane przez xp_cmdshell podczas uruchamiania procesów systemu operacyjnego, wykonaj następującą instrukcję:

EXEC xp_cmdshell 'whoami.exe';

Aby określić kontekst zabezpieczeń dla innego identyfikatora logowania, wykonaj następujący kod Transact-SQL:

EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;

Przykłady

A. Zwracanie listy plików wykonywalnych

W poniższym przykładzie przedstawiono xp_cmdshell rozszerzoną procedurę składowaną wykonującą polecenie katalogu.

EXEC master..xp_cmdshell 'dir *.exe'

B. Zwracanie danych wyjściowych bez

W poniższym przykładzie użyto xp_cmdshell do wykonania ciągu polecenia bez zwracania danych wyjściowych do klienta.

USE master;

EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
    \\server2\backups\SQLbcks', NO_OUTPUT;
GO

C. Użyj stanu powrotu

W poniższym przykładzie xp_cmdshell rozszerzona procedura składowana sugeruje również stan powrotu. Zwracana wartość kodu jest przechowywana w zmiennej @result.

DECLARE @result INT;

EXEC @result = xp_cmdshell 'dir *.exe';

IF (@result = 0)
    PRINT 'Success'
ELSE
    PRINT 'Failure';

D. Zapisywanie zawartości zmiennej w pliku

Poniższy przykład zapisuje zawartość zmiennej @var do pliku o nazwie var_out.txt w bieżącym katalogu serwera.

DECLARE @cmd SYSNAME,
    @var SYSNAME;

SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';

EXEC master..xp_cmdshell @cmd;

E. Przechwytywanie wyniku polecenia do pliku

Poniższy przykład zapisuje zawartość bieżącego katalogu do pliku o nazwie dir_out.txt w bieżącym katalogu serwera.

DECLARE @cmd SYSNAME,
    @var SYSNAME;

SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';

EXEC master..xp_cmdshell @cmd;