Aracılığıyla paylaş


xp_cmdshell (Transact-SQL)

Şunlar için geçerlidir: SQL Server

Bir Windows komut kabuğu oluşturur ve yürütme için bir dize geçirir. Tüm çıkışlar metin satırları olarak döndürülür.

Transact-SQL söz dizimi kuralları

Sözdizimi

xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]

Tartışmalar

Önemli

Genişletilmiş saklı yordamlar için bağımsız değişkenler, Sözdizimi bölümünde açıklandığı gibi belirli bir sırada girilmelidir. Parametreler sıra dışı girilirse bir hata iletisi oluşur.

'command_string'

İşletim sistemine geçirilecek komutu içeren dize. command_stringvarchar(8000) veya nvarchar(4000) şeklindedir ve varsayılan değer yoktur. command_string birden fazla çift tırnak işareti içeremez. dosya yollarında veya command_string başvuruda bulunılan program adlarında boşluk varsa tek bir çift tırnak işareti gerekir. Ekli alanlarla ilgili sorun yaşıyorsanız geçici çözüm olarak FAT 8.3 dosya adlarını kullanmayı göz önünde bulundurun.

çıktıyı NO_

İstemciye hiçbir çıkış döndürülmemesi gerektiğini belirten isteğe bağlı bir parametre.

Dönüş kodu değerleri

0 (başarı) veya 1 (başarısızlık).

Sonuç kümesi

Aşağıdaki xp_cmdshell deyimi yürütülürken geçerli dizinin dizin listesi döndürülür.

EXECUTE xp_cmdshell 'dir *.exe';
GO

Satırlar bir nvarchar(255) sütununda döndürülür. NO_OUTPUT Seçenek kullanılırsa yalnızca aşağıdaki çıkış döndürülür:

The command(s) completed successfully.

Açıklamalar

tarafından xp_cmdshell oluşturulan Windows işlemi, SQL Server hizmet hesabıyla aynı güvenlik haklarına sahiptir.

Dikkat

xp_cmdshell güçlü bir özelliktir ve varsayılan olarak devre dışıdır. xp_cmdshell , İlke Tabanlı Yönetim kullanılarak veya yürütülerek sp_configureetkinleştirilebilir ve devre dışı bırakılabilir. Daha fazla bilgi için bkz . Surface alanı yapılandırması ve xp_cmdshell (sunucu yapılandırma seçeneği). kullanmak xp_cmdshell , güvenlik denetimi araçlarını tetikleyebilir.

xp_cmdshell zaman uyumlu olarak çalışır. Command-shell komutu tamamlanana kadar denetim çağırana döndürülür. Bir toplu iş içinde yürütülür ve hata döndürürse xp_cmdshell , toplu işlem başarısız olur.

proxy hesabı xp_cmdshell

Sysadmin sabit sunucu rolünün üyesi olmayan bir kullanıcı tarafından çağrıldığında, xp_cmdshell adlı ##xp_cmdshell_proxy_account##kimlik bilgisinde depolanan hesap adını ve parolayı kullanarak Windows'a bağlanır. Bu proxy kimlik bilgisi yoksa başarısız xp_cmdshell olur.

Proxy hesabı kimlik bilgileri yürütülerek sp_xp_cmdshell_proxy_accountoluşturulabilir. Bağımsız değişkenler olarak, bu saklı yordam bir Windows kullanıcı adı ve parolası alır. Örneğin, aşağıdaki komut Windows etki alanı kullanıcısı SHIPPING\KobeRiçin bir proxy kimlik bilgisi oluşturur. değerini güçlü bir parolayla değiştirin <password> .

EXECUTE sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', '<password>';

Daha fazla bilgi için bkz. sp_xp_cmdshell_proxy_account.

İzinler

Kötü amaçlı kullanıcılar bazen kullanarak xp_cmdshellxp_cmdshell ayrıcalıklarını yükseltmeye çalıştığından varsayılan olarak devre dışı bırakılır. Etkinleştirmek için veya sp_configure kullanın. Daha fazla bilgi için bkz. xp_cmdshell Sunucu Yapılandırma Seçeneği.

İlk etkinleştirildiğinde, xp_cmdshell yürütmek için CONTROL SERVER izni gerektirir ve tarafından xp_cmdshell oluşturulan Windows işlemi SQL Server hizmet hesabıyla aynı güvenlik bağlamını kullanır. SQL Server hizmet hesabı genellikle tarafından xp_cmdshelloluşturulan işlem tarafından gerçekleştirilen iş için gerekenden daha fazla izine sahiptir. Güvenliği geliştirmek için xp_cmdshell erişimin yüksek ayrıcalıklı kullanıcılarla sınırlandırılması gerekir.

Yönetici olmayanların uygulamasını kullanmasına xp_cmdshellve SQL Server'ın daha az ayrıcalıklı bir hesabın güvenlik belirteciyle alt işlemler oluşturmasına izin vermek için şu adımları izleyin:

  1. İşlemlerinizin gerektirdiği en düşük ayrıcalıklara sahip bir Windows yerel kullanıcı hesabı veya etki alanı hesabı oluşturun ve özelleştirin.

  2. sp_xp_cmdshell_proxy_account En düşük ayrıcalıklı hesabı kullanacak şekilde yapılandırmak xp_cmdshell için sistem yordamını kullanın.

    Uyarı

    Nesne Gezgini'nde sunucu adınızda Özellikler'e sağ tıklayıp Sunucu proxy hesabı bölümünün Güvenlik sekmesine bakarak da SQL Server Management Studio kullanarak bu proxy hesabını yapılandırabilirsiniz.

  3. Management Studio'da veritabanını kullanarak master , sysadmin olmayan belirli kullanıcılara yürütme olanağı vermek için aşağıdaki Transact-SQL deyimini yürütür xp_cmdshell. Belirtilen kullanıcı veritabanında mevcut master olmalıdır.

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

Artık yönetici olmayanlar ile xp_cmdshell işletim sistemi işlemlerini başlatabilir ve bu işlemler yapılandırdığınız proxy hesabının izinleriyle çalışır. CONTROL SERVER izni olan kullanıcılar ( sysadmin sabit sunucu rolünün üyeleri) tarafından xp_cmdshellbaşlatılan alt işlemler için SQL Server hizmet hesabının izinlerini almaya devam eder.

İşletim sistemi işlemleri başlatılırken tarafından xp_cmdshell kullanılan Windows hesabını belirlemek için aşağıdaki deyimi yürütebilirsiniz:

EXECUTE xp_cmdshell 'whoami.exe';

Başka bir oturum açma işleminin güvenlik bağlamını belirlemek için aşağıdaki Transact-SQL kodunu yürütür:

EXECUTE AS LOGIN = '<other_login>';
GO

EXECUTE xp_cmdshell 'whoami.exe';

REVERT;

Örnekler

A. Yürütülebilir dosyaların listesini döndürme

Aşağıdaki örnekte, dizin komutunu yürüten genişletilmiş saklı yordam gösterilmektedir xp_cmdshell .

EXECUTE master..xp_cmdshell 'dir *.exe';

B. Çıkış döndürme

Aşağıdaki örnek, çıktıyı istemciye döndürmeden bir komut dizesi yürütmek için kullanır xp_cmdshell .

USE master;

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

C. İade durumunu kullan

Aşağıdaki örnekte, xp_cmdshell genişletilmiş saklı yordam da dönüş durumunu önerir. Dönüş kodu değeri değişkeninde @resultdepolanır.

DECLARE @result AS INT;

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

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

D. Dosyaya değişken içeriği yazma

Aşağıdaki örnek, değişkenin @var içeriğini geçerli sunucu dizininde adlı var_out.txt bir dosyaya yazar.

DECLARE @cmd AS SYSNAME, @var AS SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';

EXECUTE master..xp_cmdshell @cmd;

E. Bir komutun sonucunu bir dosyaya yakalama

Aşağıdaki örnek, geçerli dizinin içeriğini geçerli sunucu dizininde adlı dir_out.txt bir dosyaya yazar.

DECLARE @cmd AS SYSNAME, @var AS SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';

EXECUTE master..xp_cmdshell @cmd;