xp_cmdshell (języka Transact-SQL)
Spawns powłoki poleceń systemu Windows i przekazuje w ciąg do wykonania.Dowolne dane wyjściowe są zwracane jako wiersze tekstu.
Składnia
xp_cmdshell { 'command_string' } [ , no_output ]
Argumenty
'command_string'
To ciąg , który zawiera polecenia przekazywane do systemu operacyjnego.command_stringjest varchar(8000) lub nvarchar(4000), z braku domyślne.command_stringnie może zawierać więcej niż jeden zestaw podwójnych cudzysłowów.Jednej pary cudzysłowów jest wymagany, jeśli znajdują się w ścieżkach plików spacji lub nazw, do którego odwołuje się program command_string.Jeśli masz problemy z zawierające spacje należy rozważyć przy użyciu nazw plików w formacie 8.3 FAT jako rozwiązanie alternatywne.no_output
Jest opcjonalny parametr określający, że żadne dane wyjściowe powinny być zwrócone do klient.
Wartości kodów powrotnych
0 (sukces) lub 1 (błąd)
Zestawy wyników
Wykonywanie następujących xp_cmdshell instrukcja zwróci listę katalogów katalog bieżący.
EXEC xp_cmdshell 'dir *.exe';
GO
Wiersze są zwracane w nvarchar(255) kolumna.Jeśli no_output jest używana opcja tylko następujące zostaną zwrócone:
The command(s) completed successfully.
Uwagi
Proces systemu Windows zduplikowanego przez xp_cmdshell ma takie same uprawnienia zabezpieczeń, jak SQL Serverkontausługa .
xp_cmdshell działa synchronicznie.Formant nie jest zwracana do obiektu wywołującego, aż do zakończenia polecenia powłoki poleceń.
xp_cmdshell może być włączone i wyłączone za pomocą zarządzania opartego na zasadach lub wykonywanie sp_configure.Aby uzyskać więcej informacji, zobacz Opis konfiguracji obszaru powierzchni i Opcja xp_cmdshell.
![]() |
---|
Jeśli xp_cmdshell wykonana w partia , a następnie zwraca błąd, partia zakończy się niepowodzeniem.Jest to zmiana zachowania.W starszych wersjach Microsoft SQL Server partia będzie kontynuował wykonać. |
xp_cmdshell konto serwera Proxy
Gdy jest wywoływana przez użytkownika, który nie jest elementem element członkowski z sysadmin stała rola serwera xp_cmdshell łączy do systemu Windows przy użyciu nazwy konta i hasła przechowywane w poświadczeń o nazwie ## xp_cmdshell_proxy_account ##.Jeśli poświadczenia serwera proxy nie istnieje, xp_cmdshell nie powiedzie się.
Poświadczenia konto proxy mogą być tworzone przez wykonywanie sp_xp_cmdshell_proxy_account.Jako argumenty to procedura składowana pobiera nazwę użytkownika systemu Windows i hasło.Na przykład następujące polecenie tworzy poświadczeń serwera proxy dla użytkownika domena Windows SHIPPING\KobeR ma hasło 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 (języka Transact-SQL).
Uprawnienia
Ponieważ złośliwi użytkownicy próbują czasami podniesienie poziomu ich uprawnień za pomocą xp_cmdshell, xp_cmdshell jest domyślnie wyłączona.Użycie sp_configure lub Zasady zarządzania opartych na ją włączyć.Aby uzyskać więcej informacji, zobacz Opcja xp_cmdshell.
Po pierwszym włączeniu xp_cmdshell wymaga FORMANTU SERWEROWI uprawnienie do wykonać i proces systemu Windows utworzony przez xp_cmdshell jest tym samym kontekście zabezpieczeń, co SQL Serverkontausługa . SQL ServerKontousługa często ma więcej uprawnień niż jest to konieczne, na pracę wykonaną przez proces utworzony przez xp_cmdshell.Aby zwiększyć bezpieczeństwo, dostęp do xp_cmdshell powinien być ograniczony do wysoko uprzywilejowane użytkowników.
Aby użytkownicy inni niż administratorzy za pomocą xp_cmdshelli SQL Server do tworzenia procesów podrzędność z tokenu zabezpieczeń konta mniej uprzywilejowanych, wykonaj następujące kroki:
Tworzenie i dostosowywanie konto użytkownika lokalnego lub konta domena z najmniejszych uprawnieniach, które wymagają procesów.
Za pomocą sp_xp_cmdshell_proxy_account systemową procedurę konfigurowania xp_cmdshell Aby użyć tego konta najmniej uprzywilejowanych.
Ostrzeżenie
Można również skonfigurować przy użyciu tego konto proxy SQL Server Management Studio klikając prawym przyciskiem myszy Właściwości na nazwa serwera w Eksploratorze obiektów i spojrzenie zabezpieczeń kartę dla Server konto proxy sekcji.
W Management Studio, korzystanie z master bazy danych, wykonać GRANT exec ON xp_cmdshell TO '<somelogin>' instrukcja udzielenia określonych nie-sysadmin użytkownikom możliwość wykonać xp_cmdshell.Określony identyfikator logowania musi być mapowany do użytkownika w master bazy danych.
Teraz użytkownicy inni niż administratorzy mogą uruchomić procesów systemu operacyjnego z xp_cmdshell i procesy uruchomione z uprawnieniami konto proxy , który został skonfigurowany.Użytkownicy mający uprawnienie Kontrola serwera (członków sysadmin stała rola serwera) będą nadal otrzymywać uprawnienia SQL Serverkontausługa dla procesów podrzędność , które są uruchamiane przez xp_cmdshell.
Aby określić konto systemu Windows używany przez xp_cmdshell podczas uruchamiania systemu operacyjnego przetwarza, wykonać następującą instrukcja:
xp_cmdshell 'whoami.exe'
Aby określić kontekst zabezpieczeń dla innego identyfikatora logowania wykonać następujących czynności:
EXECUTE AS LOGIN = '<other_login>' ;
GO
xp_cmdshell 'whoami.exe' ;
REVERT ;
Przykłady
A.Zwracając listę plików wykonywalnych
W poniższym przykładzie xp_cmdshell rozszerzona procedura składowana wykonywania polecenia katalogu.
EXEC master..xp_cmdshell 'dir *.exe'
B.Za pomocą polecenia net systemu Windows
W poniższym przykładzie pokazano użycie xp_cmdshell w procedura składowana.W tym przykładzie powiadamia użytkowników za pomocą net send , wystąpienie SQL Server ma zamknąć niedziałający, wstrzymuje działanie serwera za pomocą net pausei przebiega serwera niedziałający przy użyciu net stop.
CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server
shutting down in 10 minutes. No more connections
allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server
shutting down in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server
shutting down in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output
C.Zwracanie żadnych danych wyjściowych
W poniższym przykładzie użyto xp_cmdshell na wykonać polecenia ciąg bez powracania do klientdane wyjściowe.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks, NO_OUTPUT';
GO
D.Za pomocą stan zwrotu
W poniższym przykładzie xp_cmdshell rozszerzona procedura składowana sugeruje także stan zwrotu.Wartość Kod zwrotny jest przechowywana w zmiennej @result.
DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure'
E.Zawartość zmiennej zapisywanie do pliku
Poniższy przykład zapisuje zawartość @var zmienną w 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
F.Wynik polecenia do pliku przechwytywania
Zawartość katalogu bieżącego w następującym przykładzie polecenie zapisuje w 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