Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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_cmdshell
i 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:
Utwórz i dostosuj konto użytkownika lokalnego systemu Windows lub konto domeny z najmniejszymi uprawnieniami wymaganymi przez procesy.
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.
W programie Management Studio przy użyciu bazy danych
master
wykonaj następującą instrukcję Transact-SQL, aby nadać określonymadministratorowi systemu możliwość wykonywaniaxp_cmdshell
. Określony użytkownik musi istnieć w bazie danychmaster
.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;