以操作系統(tǒng)命令行解釋器的方式執(zhí)行給定的命令字符串,并以文本行方式返回任何輸出。授予非管理用戶執(zhí)行 xp_cmdshell 的權(quán)限。
說明 在 Microsoft? Windows? 95 或 Microsoft Windows 98 操作系統(tǒng)中執(zhí)行 xp_cmdshell 時,將不把 xp_cmdshell 的返回代碼設(shè)置為喚醒調(diào)用的可執(zhí)行文件的進程退出代碼。返回代碼始終為 0。
xp_cmdshell
{'command_string'
} [, no_output
]
'command_string'
是在操作系統(tǒng)命令行解釋器上執(zhí)行的命令字符串。command_string 的數(shù)據(jù)類型為 varchar(255) 或 nvarchar(4000),沒有默認值。command_string 不能包含一對以上的雙引號。如果由 command_string 引用的文件路徑或程序名稱中有空格,則需要使用一對引號。如果使用嵌入空格不方便,可考慮使用 FAT 8.3 文件名作為解決辦法。
no_output
是可選參數(shù),表示執(zhí)行給定的 command_string,但不向客戶端返回任何輸出。
0(成功)或 1(失?。?/p>
執(zhí)行下列 xp_cmdshell 語句將返回當(dāng)前目錄的目錄列表。
xp_cmdshell 'dir *.exe'
行以 nvarchar(255) 列的形式返回。
執(zhí)行下列 xp_cmdshell 語句將返回隨后的結(jié)果集:
xp_cmdshell 'dir *.exe', NO_OUTPUT
下面是結(jié)果:
The command(s) completed successfully.
xp_cmdshell 以同步方式操作。在命令行解釋器命令執(zhí)行完畢之前,不會返回控制。
當(dāng)授予用戶執(zhí)行權(quán)限時,用戶能在 Microsoft Windows NT? 命令行解釋器上執(zhí)行運行 Microsoft SQL Server? 的帳戶有權(quán)執(zhí)行的任何操作系統(tǒng)命令。
默認情況下,只有 sysadmin 固定服務(wù)器角色的成員才能執(zhí)行此擴展存儲過程。但是,也可以授予其他用戶執(zhí)行此存儲過程的權(quán)限。
當(dāng)作為 sysadmin 固定服務(wù)器角色成員的用戶喚醒調(diào)用 xp_cmdshell 時,將在運行 SQL Server 服務(wù)的安全上下文中執(zhí)行 xp_cmdshell。當(dāng)用戶不是 sysadmin 組的成員時,xp_cmdshell 將模擬使用 xp_sqlagent_proxy_account 指定的 SQL Server 代理程序的代理帳戶。如果代理帳戶不能用,則 xp_cmdshell 將失敗。這只是針對于 Microsoft? Windows NT? 4.0 和 Windows 2000。在 Windows 9.x 上,沒有模擬,且 xp_cmdshell 始終在啟動 SQL Server 的 Windows 9.x 用戶的安全上下文下執(zhí)行。
說明 在早期版本中,獲得 xp_cmdshell 執(zhí)行權(quán)限的用戶在 MSSQLServer 服務(wù)的用戶帳戶上下文中運行命令??梢酝ㄟ^配置選項配置 SQL Server,以便對 SQL Server 無 sa 訪問權(quán)限的用戶能夠在 SQLExecutiveCmdExec Windows NT 帳戶的上下文中運行 xp_cmdshell。在 SQL Server 7.0 中,該帳戶稱為 SQLAgentCmdExec。現(xiàn)在,不是 sysadmin 固定服務(wù)器角色成員的用戶將在該帳戶上下文中運行命令,而無需再進行配置更改。
xp_deletemail 的執(zhí)行權(quán)限默認授予 sysadmin 固定服務(wù)器角色的成員,但可以授予其他用戶。
重要 如果為 MSSQLServer 服務(wù)選用的 Windows NT 帳戶不是本地管理員組的成員,則非 sysadmin 固定服務(wù)器角色成員的用戶將無法執(zhí)行 xp_cmdshell。
下例顯示執(zhí)行目錄命令的 xp_cmdshell 擴展存儲過程。
EXEC master..xp_cmdshell 'dir *.exe'
下例顯示 xp_cmdshell 在存儲過程中的使用。下例先用 net send 通知用戶 SQL Server 即將關(guān)閉,然后用 net pause 暫停服務(wù)器,最后用 net stop 關(guān)閉服務(wù)器。
CREATE PROC shutdown10ASEXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down in 10 minutes. No more connections allowed.', no_outputEXEC 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_outputWAITFOR DELAY '00:04:00'EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down in 1 minute. Log off now.', no_outputWAITFOR DELAY '00:01:00'EXEC xp_cmdshell 'net stop sqlserver', no_output
下例使用 xp_cmdshell 執(zhí)行命令字符串,且不向客戶端返回輸出。
USE masterEXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps', NO_OUTPUT
在下例中,xp_cmdshell 擴展存儲過程也給出了返回狀態(tài)。返回代碼值存儲在變量 @result 中。
DECLARE @result intEXEC @result = xp_cmdshell 'dir *.exe'IF (@result = 0) PRINT 'Success'ELSE PRINT 'Failure'
下例將當(dāng)前目錄內(nèi)容寫入當(dāng)前服務(wù)器目錄下名為 dir_out.txt 的文件中。
DECLARE @cmd sysname, @var sysnameSET @var = 'dir /p'SET @cmd = 'echo ' + @var + ' > dir_out.txt'EXEC master..xp_cmdshell @cmd
系統(tǒng)存儲過程(常規(guī)擴展過程)