Udostępnij za pośrednictwem


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.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

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.

Ważna informacjaWażne:

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:

  1. Tworzenie i dostosowywanie konto użytkownika lokalnego lub konta domena z najmniejszych uprawnieniach, które wymagają procesów.

  2. 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.

  3. 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