以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。
说明 在 Microsoft® Windows® 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。4 e( }6 S1 R/ r% b$ b $ Q! w5 L& ^. v% [+ E" E5 N' C 语法xp_cmdshell {'command_string'} [, no_output]
8 n, g- J- z9 ^# @4 @2 ?+ c+ m2 T 参数- D h# m6 f0 g* a7 M1 S' K, z'command_string'
! K, s% ^( z5 E: X4 I% Z) x' D是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(8000) 或 nvarchar(4000),没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格,则需要使用一对引号。如果使用嵌入空格不方便,可考虑使用 FAT 8.3 文件名作为解决办法。
no_output
是可选参数,表示执行给定的 command_string,但不向客户端返回任何输出。
返回代码值0(成功)或 1(失败)
结果集执行下列 xp_cmdshell 语句将返回当前目录的目录列表。
xp_cmdshell 'dir *.exe'行以 nvarchar(255) 列的形式返回。
O# m- E* m$ Y, y7 a" P执行下列 xp_cmdshell 语句将返回随后的结果集:
xp_cmdshell 'dir *.exe', NO_OUTPUT- E' F3 w$ W" m; G下面是结果:
The command(s) completed successfully.2 Z1 ]& V( P/ r& N* C$ k5 b6 x 注释' D- Z) H2 t- uxp_cmdshell 以同步方式操作。在命令行解释器命令执行完毕之前,不会返回控制。
0 X6 J: A9 D7 [: N+ E% V' Y7 ?当授予用户执行权限时,用户能在 Microsoft Windows NT® 命令行解释器上执行运行 Microsoft SQL Server™ 的帐户有权执行的任何操作系统命令。
! c0 e; q2 \- d! J; p( D3 ^6 ^默认情况下,只有 sysadmin 固定服务器角色的成员才能执行此扩展存储过程。但是,也可以授予其他用户执行此存储过程的权限。
当作为 sysadmin 固定服务器角色成员的用户唤醒调用 xp_cmdshell 时,将在运行 SQL Server 服务的安全上下文中执行 xp_cmdshell。当用户不是 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 用户的安全上下文下执行。
" H. ?' z0 z( u) W 说明 在早期版本中,获得 xp_cmdshell 执行权限的用户在 MSSQLServer 服务的用户帐户上下文中运行命令。可以通过配置选项配置 SQL Server,以便对 SQL Server 无 sa 访问权限的用户能够在 SQLExecutiveCmdExec Windows NT 帐户的上下文中运行 xp_cmdshell。在 SQL Server 7.0 中,该帐户称为 SQLAgentCmdExec。现在,不是 sysadmin 固定服务器角色成员的用户将在该帐户上下文中运行命令,而无需再进行配置更改。; c4 b7 P0 g- ~: W0 @! F权限; Y+ L+ J* M! S8 v5 j1 K) X0 A
xp_deletemail 的执行权限默认授予 sysadmin 固定服务器角色的成员,但可以授予其他用户。
! w* U9 L( s! ~: U 重要 如果为 MSSQLServer 服务选用的 Windows NT 帐户不是本地管理员组的成员,则非 sysadmin 固定服务器角色成员的用户将无法执行 xp_cmdshell。示例A. 返回可执行文件列表, F# g( k1 y* R; H) \! q
下例显示执行目录命令的 xp_cmdshell 扩展存储过程。
EXEC master..xp_cmdshell 'dir *.exe' B. 使用 Windows NT net 命令下例显示 xp_cmdshell 在存储过程中的使用。下例先用 net send 通知用户 SQL Server 即将关闭,然后用 net pause 暂停服务器,最后用 net stop 关闭服务器。
CREATE PROC shutdown10$ w2 g6 m1 N) r# B) w9 c; s AS EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down in 10 minutes. No more connections allowed.', no_output1 l) ~" i1 a/ f EXEC xp_cmdshell 'net pause sqlserver' WAITFOR DELAY '00:05:00' EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down : f3 v+ g2 C6 F* V0 z) ^3 | in 5 minutes.', no_output( U' j9 E3 m4 w9 p' c7 D WAITFOR DELAY '00:04:00' EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down " v/ U) z @3 W4 H2 W in 1 minute. Log off now.', no_output( V' B5 ^8 ~0 _. E' h WAITFOR DELAY '00:01:00'+ g, F7 ?8 [( Z EXEC xp_cmdshell 'net stop sqlserver', no_output C. 不返回输出 ( a: D K7 F: C7 O3 ?下例使用 xp_cmdshell 执行命令字符串,且不向客户端返回输出。
USE master+ d7 ~3 [5 T* u& T+ u EXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps', - z4 ^2 q; e$ Y. P NO_OUTPUT D. 使用返回状态# l. w E" j3 F$ p- r5 c; ?在下例中,xp_cmdshell 扩展存储过程也给出了返回状态。返回代码值存储在变量 @result 中。
DECLARE @result int. g' n0 T, _+ H+ @0 C EXEC @result = xp_cmdshell 'dir *.exe'3 h# K }) x/ d+ Q w IF (@result = 0) PRINT 'Success': r9 @ U4 n) g* C/ f ELSE4 e v: m8 g8 k$ U6 I$ i! R PRINT 'Failure'0 G: D" S# k' U" v, v E. 将变量内容写入文件 . j4 w+ g/ {/ \1 Y下例将 @var 变量的内容写入当前服务器目录下名为 var_out.txt 的文件中。
DECLARE @cmd sysname, @var sysname5 `) N; s l8 n/ ^6 u& k( D, { SET @var = 'Hello world' SET @cmd = 'echo ' + @var + ' > var_out.txt'( d) f8 b! T8 ^/ | EXEC master..xp_cmdshell @cmd F. 将命令的结果捕获到文件, @. O+ `0 T% C* |下例将当前目录的内容写入当前服务器目录中名为 dir_out.txt 的文件中。
DECLARE @cmd sysname, @var sysname* J& W# t8 n' R- w7 {2 _: i SET @var = 'dir/p'" H; w/ w. k0 Q1 M3 O. ]* N SET @cmd = @var + ' > dir_out.txt', q; C1 G) d. a* ^9 N3 z/ N EXEC master..xp_cmdshell @cmd # `. Z {$ X; A- ~' R# K/ L3 X. `; R# {" [! l# n+ p* k+ e: ]( Z) e* D 请参见2 x* E) W6 ~) _% `
sqlserver2000/tsqlref/ts_create_4hk5.htm">CREATE PROCEDURE
- V, f: `' ]8 u, y }sqlserver2000/tsqlref/ts_ea-ez_05ro.htm">EXECUTE
: |: N1 R! K! |) J创建安全帐户
sqlserver2000/tsqlref/ts_sp_00_519s.htm">系统存储过程(常规扩展过程)
% t( e) j9 o$ T {- g1 q/ V5 Q+ w# i" `) n) f0 S7 a8 ?, d1 o) ] N
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |