xp_cmdshell (Transact-sql)

Windows komut kabuğu balık yumurtası ve yürütme için bir dize olarak geçirir. Herhangi bir çıktı metin satırları verilir.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

xp_cmdshell { 'command_string' } [ , no_output ]

Bağımsız değişkenler

  • 'command_string'
    İşletim sistemine geçirilmesi için bir komut içeren dizedir. command_stringise varchar(8000)ya nvarchar(4000), hiçbir varsayılan ile. command_stringbirden fazla çift tırnak işareti kümesinin içeremez. Boşluk dosya yolları varsa veya programı başvurulan adları tek bir çift tırnak işareti gereklidir command_string. Katıştırılmış boşluklar sorun varsa, bir çözüm olarak yağ 8.3 dosya adları kullanmayı düşünün.

  • no_output
    Çıktı istemciye döndürülen olduğunu belirten isteğe bağlı bir parametre,.

Dönüş Kodu Değerleri

0 (başarılı) veya 1 (hata)

Sonuç Kümeleri

Aşağıdaki yürütme xp_cmdshelldeyimi geçerli dizini dizin listesini döndürür.

EXEC xp_cmdshell 'dir *.exe';
GO

EXEC xp_cmdshell 'dir *.exe';
GO

Satır döndürülür bir nvarchar(255)sütun. Eğer no_outputseçeneği kullanılırsa, yalnızca aşağıdaki döndürülür:

The command(s) completed successfully.

The command(s) completed successfully.

Açıklamalar

Windows işlemi spawned by xp_cmdshell aynı güvenlik haklarına sahip SQL Serverhizmet hesabı.

xp_cmdshell zaman uyumlu olarak çalışır. Komut kabuğu komutu tamamlanmadan denetim çağırana döndürülür.

xp_cmdshell etkin ve devre dışı ilke tabanlı yönetimi kullanarak veya yürütme sp_configure. Daha fazla bilgi için Yüzey Alanı Yapılandırmave xp_cmdshell Sunucu Yapılandırma Seçeneği.

Önemli notÖnemli

Eğer xp_cmdshell toplu iş içinde yürütülür ve hata verir toplu işlem başarısız olur. Bu davranış değişikliğidir. Önceki sürümlerinde Microsoft SQL Servertoplu iş yürütme devam edecekti.

xp_cmdshell Proxy hesabı

Ne zaman o bir üyesi olmayan bir kullanıcı tarafından denir sysadmin sabit sunucu rolü, xp_cmdshell Windows hesap adını ve parolasını adlı kimlik bilgileri depolanan kullanarak bağlanan ## xp_cmdshell_proxy_account ##. Bu proxy kimlik bilgisi yoksa, xp_cmdshell başarısız olur.

Proxy hesabı kimlik bilgisi yürüterek oluşturulabilir sp_xp_cmdshell_proxy_account. Bağımsız değişkenler olarak bu saklı yordam, bir Windows kullanıcı adı ve parola alır. Örneğin, aşağıdaki komut bir proxy kimlik bilgisi için Windows etki alanı kullanıcı oluşturur SHIPPING\KobeRWindows parolası olan sdfh%dkc93vcMt0.

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

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

Daha fazla bilgi için, bkz. sp_xp_cmdshell_proxy_account (Transact-sql).

İzinler

Çünkü kötü niyetli kullanıcılar bazen ayrıcalıklarını kullanarak yükseltebilir girişiminde xp_cmdshell, xp_cmdshell varsayılan olarak devre dışıdır. Kullanım sp_configure veya İlkesi tabanlı yönetimi etkinleştirmek için. Daha fazla bilgi için, bkz. xp_cmdshell Sunucu Yapılandırma Seçeneği.

İlk kez etkinleştirildiğinde, xp_cmdshell tarafından oluşturulan Windows işlemi yürütmek için control server izni gerektirir xp_cmdshell olarak aynı güvenlik bağlamına sahip SQL Serverhizmet hesabı. SQL ServerHizmet hesabı genellikle daha gerekli çalışmanın tarafından oluşturulan işlemin daha fazla izni xp_cmdshell. Güvenliği artırmak için erişim xp_cmdshell yüksek ayrıcalıklı kullanıcılar için sınırlı olmalıdır.

Yönetici olmayanların kullanmak için xp_cmdshellve SQL Serverçocuk süreçleri ile daha az ayrıcalıklı hesabı güvenlik belirteci oluşturmak için şu adımları izleyin:

  1. Oluşturabilir ve Windows yerel kullanıcı hesabına veya kendi süreçlerinin gerektirdiği en az ayrıcalıklara sahip bir etki alanı hesabıyla özelleştirebilirsiniz.

  2. Kullanın sp_xp_cmdshell_proxy_account yapılandırma yordamını xp_cmdshell bu en az ayrıcalıklı hesabı kullanmak için.

    [!NOT]

    Bu proxy hesabını kullanarak da yapılandırabilirsiniz SQL Server Management Studiosağ tıklayarak Özellikler sunucunuzun adını nesne Explorer ve arayan güvenlik için sekme sunucu proxy hesabı bölüm.

  3. De Management Studio, kullanarak masterveritabanı, idam GRANT exec ON xp_cmdshell TO '<somelogin>'deyimi Özel Sigara vermek-sysadmin kullanıcıların yürütme yeteneğini xp_cmdshell. Belirtilen oturum açma kullanıcı eşlenmesi gerekir masterveritabanı.

Şimdi olmayanların işletim sistemi işlemleri ile piyasaya xp_cmdshell ve bu işlemleri yapılandırılmış proxy hesabının izinleriyle çalışır. control server izni olan kullanıcılar (üye sysadmin sabit sunucu rolü) izinleri almaya devam SQL Servertarafından başlatılan alt işlemler için hizmet hesabı xp_cmdshell.

Tarafından kullanılan Windows hesabını belirlemek için xp_cmdshell işletim sistemi işlemleri başlatılırken aşağıdaki deyimini yürütün:

xp_cmdshell 'whoami.exe'

xp_cmdshell 'whoami.exe'

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

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

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

Örnekler

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

Aşağıdaki örnekte gösterildiği xp_cmdshellGenişletilmiş saklı yordamı, bir dizin komutu yürütmeden.

EXEC master..xp_cmdshell 'dir *.exe'

EXEC master..xp_cmdshell 'dir *.exe'

B.Windows net komutları kullanarak

Aşağıdaki örnek kullanımını gösterir xp_cmdshellsaklı yordamdaki. Bu örnek notifies kullanıcı kullanarak net send, örneğini SQL Serverhakkında kapatılması için kullanarak sunucuyu duraklatır net pauseve sonra kullanarak sunucu kapandığında 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

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.Çıktı döndürme

Aşağıdaki örnek xp_cmdshellbir komut dizesi istemciye çıkış dönmeden yürütmek için.

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

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

D.Dönüş durumunu kullanma

Aşağıdaki örnekte, xp_cmdshell Genişletilmiş saklı yordam, döndürülen durum da göstermektedir. Dönüş kodu değeri değişken depolanan @result.

DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'

DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'

E.Değişken içeriğini bir dosyaya yazma

Aşağıdaki örnek, içeriğini yazar @varadlı bir dosyaya değişken var_out.txtsunucu dizinde.

DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd

DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd

F.Bir komut dosyasına sonucu yakalama

Aşağıdaki örnek, adlı bir dosyada geçerli dizinin içeriğini yazar dir_out.txtsunucu dizinde.

DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd

DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd

Ayrıca bkz.

Başvuru

Genel genişletilmiş saklı yordamlar (Transact-sql)

sp_xp_cmdshell_proxy_account (Transact-sql)

Kavramlar

xp_cmdshell Sunucu Yapılandırma Seçeneği

Yüzey Alanı Yapılandırma