xp_cmdshell (Transact-SQL)
繁衍 Windows 命令 Shell 並傳入字串中以供執行。任何輸出都會當作文字資料列來傳回。
語法
xp_cmdshell { 'command_string' } [ , no_output ]
引數
- 'command_string'
這是包含要傳送至作業系統之命令的字串。command_string 是 varchar(8000) 或 nvarchar(4000),沒有預設值。command_string 不能包含多組雙引號。如果檔案路徑或 command_string 參考的程式名稱中有任何空格,則需使用單引號配對。如果使用內嵌空格會出錯,請考慮改用 FAT 8.3 檔案名稱作為因應措施。
- no_output
這是選擇性參數,用來指定不應將輸出傳回用戶端。
傳回碼值
0 (成功) 或 1 (失敗)
結果集
執行下列 xp_cmdshell
陳述式會傳回目前目錄的目錄清單。
EXEC xp_cmdshell 'dir *.exe';
GO
資料列會傳回在 nvarchar(255) 資料行中。如果使用了 no_output 選項,則只傳回下行:
The command(s) completed successfully.
備註
xp_cmdshell 繁衍的 Windows 處理序擁有與 SQL Server 服務帳戶相同的安全性權限。
xp_cmdshell 會同步操作。完成 command-shell 命令時,才會將控制權傳回呼叫者。
您可以利用介面區組態工具及執行 sp_configure 來啟用及停用 xp_cmdshell。如需詳細資訊,請參閱<介面區組態>和<xp_cmdshell 選項>。
重要事項: |
---|
如果 xp_cmdshell 是在批次內執行,且傳回錯誤,則批次會失敗。這是行為的變更。在舊版 Microsoft SQL Server 中,批次仍可繼續執行。 |
xp_cmdshell Proxy 帳戶
當它被一個不屬於系統管理員 (sysadmin) 固定伺服器角色的成員呼叫時,xp_cmdshell 會利用儲存在命名為 ##xp_cmdshell_proxy_account## 之認證中的帳戶名稱和密碼來連接到 Windows。如果這個 Proxy 認證不存在,xp_cmdshell 便會失敗。
您可以執行 sp_xp_cmdshell_proxy_account 來建立 Proxy 帳戶認證。作為引數,這個預存程序會取得 Windows 使用者名稱和密碼。例如,下列命令會針對 Windows 網域使用者 SHIPPING\KobeR
(這個使用者有 Windows 密碼 sdfh%dkc93vcMt0
) 來建立 Proxy 認證。
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR','sdfh%dkc93vcMt0'
如需詳細資訊,請參閱<sp_xp_cmdshell_proxy_account (Transact-SQL)>。
權限
需要 CONTROL SERVER 權限。
範例
A. 傳回可執行檔清單
下列範例會顯示執行目錄命令的 xp_cmdshell
擴充預存程序。
EXEC master..xp_cmdshell 'dir *.exe'
B. 使用 Windows net 命令
下列範例會顯示如何在預存程序中使用 xp_cmdshell
。這個範例利用 net send
來通知使用者即將關閉 SQL Server 的執行個體,利用 net pause
來暫停伺服器,然後利用 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. 未傳回輸出
下列範例會利用 xp_cmdshell
執行命令字串,但不將輸出傳回用戶端。
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks, NO_OUTPUT';
GO
D. 使用傳回狀態
在下列範例中,xp_cmdshell
擴充預存程序也建議傳回狀態。傳回碼值儲存在變數 @result
中。
DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure'
E. 將變數內容寫入檔案
下列範例將 @var
變數的內容寫入目前伺服器目錄中一個命名為 var_out.txt
的檔案。
DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd
F. 將命令結果擷取至檔案
下列範例會將目前目錄的內容寫入目前伺服器目錄中一個名稱為 dir_out.txt
的檔案。
DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd
請參閱
參考
一般擴充預存程序 (Transact-SQL)
sp_xp_cmdshell_proxy_account (Transact-SQL)