|
以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。 ! V* S3 G7 O$ i, M* D7 n; N
5 [# {0 s k' A: f" z% ^说明 在 Microsoft® Windows® 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。. R4 M% ?) o- i0 k. u9 t$ _; F; C" S9 a
' l, j3 }' S' c$ {: J$ I& P* S
. J6 N$ r% j' k% Z. j+ Q语法
: m1 n, u& y+ C' Ixp_cmdshell {'command_string'} [, no_output] # r4 ?, C# d: d2 w/ U [$ _
参数4 I7 t7 e# s) e3 h# ~2 ^, p6 _8 u
'command_string' 3 V+ S, G" R5 K. H
是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(8000) 或 nvarchar(4000),没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格,则需要使用一对引号。如果使用嵌入空格不方便,可考虑使用 FAT 8.3 文件名作为解决办法。
+ p9 w* `4 @+ o) H6 q; ]* x& }no_output ; b- ]7 o$ w6 c2 z7 [ \
是可选参数,表示执行给定的 command_string,但不向客户端返回任何输出。 ( I+ o8 `6 A! h. m9 F: o
返回代码值7 L' M) v4 m7 a, C* u
0(成功)或 1(失败)
/ ~1 N5 f8 ~$ X/ N# t6 e+ A结果集
/ ^) b8 y/ M/ d) }执行下列 xp_cmdshell 语句将返回当前目录的目录列表。 xp_cmdshell 'dir *.exe'3 Z" U0 D+ j/ e! w2 R& n
9 w; n. L' C) K3 V; X行以 nvarchar(255) 列的形式返回。 " G( V; \4 G, O z- ]; t
执行下列 xp_cmdshell 语句将返回随后的结果集: xp_cmdshell 'dir *.exe', NO_OUTPUT
0 u/ b$ `' |$ D# n
; b' P& J! H2 f* G8 ^3 ^& Q( j下面是结果: The command(s) completed successfully., [/ o- e1 V7 X
注释- d' Q* p% p2 \" H$ A
xp_cmdshell 以同步方式操作。在命令行解释器命令执行完毕之前,不会返回控制。
2 a8 H/ q0 q" ? t' L1 I0 e当授予用户执行权限时,用户能在 Microsoft Windows NT® 命令行解释器上执行运行 Microsoft SQL Server™ 的帐户有权执行的任何操作系统命令。
% P1 \( {1 y" O% M默认情况下,只有 sysadmin 固定服务器角色的成员才能执行此扩展存储过程。但是,也可以授予其他用户执行此存储过程的权限。 5 N2 k8 y' i# |9 e# Z: j
当作为 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 用户的安全上下文下执行。
$ o* v4 ~- n- H* D! [6 r* o$ e9 }8 d* \ p. K. Z4 M/ N9 d1 H, r8 J
说明 在早期版本中,获得 xp_cmdshell 执行权限的用户在 MSSQLServer 服务的用户帐户上下文中运行命令。可以通过配置选项配置 SQL Server,以便对 SQL Server 无 sa 访问权限的用户能够在 SQLExecutiveCmdExec Windows NT 帐户的上下文中运行 xp_cmdshell。在 SQL Server 7.0 中,该帐户称为 SQLAgentCmdExec。现在,不是 sysadmin 固定服务器角色成员的用户将在该帐户上下文中运行命令,而无需再进行配置更改。# x& E0 r, f5 J$ K
0 A1 ?+ Y3 T$ V% c% b Y4 m权限: H+ v1 N: e# m4 F9 s5 j0 ^% i
xp_deletemail 的执行权限默认授予 sysadmin 固定服务器角色的成员,但可以授予其他用户。 6 r1 Q, L( u: l5 N
( \" p5 l0 S: d5 I; ` @% L2 T
重要 如果为 MSSQLServer 服务选用的 Windows NT 帐户不是本地管理员组的成员,则非 sysadmin 固定服务器角色成员的用户将无法执行 xp_cmdshell。% I& n* N7 D% z7 c0 [8 E
, q- w% T: w! N, a* v$ }示例A. 返回可执行文件列表
& N. {' v& j1 \5 E 下例显示执行目录命令的 xp_cmdshell 扩展存储过程。 EXEC master..xp_cmdshell 'dir *.exe'4 `5 H) D g) h
B. 使用 Windows NT net 命令
! A/ k1 p2 G& _下例显示 xp_cmdshell 在存储过程中的使用。下例先用 net send 通知用户 SQL Server 即将关闭,然后用 net pause 暂停服务器,最后用 net stop 关闭服务器。 CREATE PROC shutdown10& z) _6 A" q2 d# J" I
AS
% B0 C2 u. O" V8 \# R4 MEXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down # B- J. q) @* y$ p
in 10 minutes. No more connections allowed.', no_output
) H' s. e* s2 N, o$ U% x5 HEXEC xp_cmdshell 'net pause sqlserver') [1 H! t/ S; m
WAITFOR DELAY '00:05:00'
7 T: l; i" K" Z1 DEXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down
1 z3 N: [( n$ m! M9 C" `# t4 @ in 5 minutes.', no_output
# a7 P( [' a4 nWAITFOR DELAY '00:04:00'
$ W3 j- Y6 K- f/ M) ZEXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
6 t. C: |% Q) T2 v( h! f) a in 1 minute. Log off now.', no_output
8 ?2 N- e6 m! d9 @* F8 ~' IWAITFOR DELAY '00:01:00'
5 b7 { T; m6 A1 ^' F+ N* p. YEXEC xp_cmdshell 'net stop sqlserver', no_output
2 j( D8 ~. N1 y: P" OC. 不返回输出
' t3 ]+ ~8 G1 m7 _/ s" t3 F4 T3 j& C下例使用 xp_cmdshell 执行命令字符串,且不向客户端返回输出。 USE master5 ?/ O* C: C" B: `/ x' T1 t
EXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps',
& B5 u9 \5 Z; E0 c NO_OUTPUT) R+ S0 u- ^- ]$ t
D. 使用返回状态
3 b, ]% ~7 U' f+ W在下例中,xp_cmdshell 扩展存储过程也给出了返回状态。返回代码值存储在变量 @result 中。 DECLARE @result int
6 G$ y+ W9 ]) q5 WEXEC @result = xp_cmdshell 'dir *.exe'
( k4 F$ `& i5 J5 ?! u# {- v, [IF (@result = 0)
( u0 r% U" f, O PRINT 'Success'
, O' p L2 ?3 |" H. iELSE
: A; s0 i# N* T9 u* D PRINT 'Failure'; R7 G( w i* _9 J' @) ~; g
E. 将变量内容写入文件 # P# F" B8 k# y9 `& C- L
下例将 @var 变量的内容写入当前服务器目录下名为 var_out.txt 的文件中。 DECLARE @cmd sysname, @var sysname* X/ H# n9 h& t/ [" k5 e
SET @var = 'Hello world'$ R$ b3 T6 Q6 B, c; ^1 c5 ?9 U3 s8 `9 W3 m
SET @cmd = 'echo ' + @var + ' > var_out.txt'
% i1 M# @; q! Y" z7 l# O: KEXEC master..xp_cmdshell @cmd7 R$ G1 i$ E1 S) W1 n
F. 将命令的结果捕获到文件, k% k# [8 z! r
下例将当前目录的内容写入当前服务器目录中名为 dir_out.txt 的文件中。 DECLARE @cmd sysname, @var sysname
; Q2 b" q' m9 E# A$ ]SET @var = 'dir/p'- h. r/ L- w; [; ^" A8 y
SET @cmd = @var + ' > dir_out.txt'
' Z" Q. q R7 [4 U' }. D HEXEC master..xp_cmdshell @cmd! B( [. O5 e7 @! I) L! Z
( \$ S' W* P& Y% S" s
' e" x3 g0 ]; P- Y
请参见
# e8 b4 F' ~/ l. \4 {. A
' @; H, p$ ^2 C6 D9 {" w7 } sqlserver2000/tsqlref/ts_create_4hk5.htm">CREATE PROCEDURE W5 k& r; Z( |- H* |. Q2 c
sqlserver2000/tsqlref/ts_ea-ez_05ro.htm">EXECUTE
7 x6 `7 g9 f$ `" z$ x创建安全帐户
0 R. O" ~2 c4 Gsqlserver2000/tsqlref/ts_sp_00_519s.htm">系统存储过程(常规扩展过程) 1 j. ]# W# o. {2 h" W7 g/ l% i
8 z# k/ z, b4 R- ]- K* B/ l& h, `/ `$ c3 O, {2 a2 i
|