|
以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。 ' K8 i. K9 H8 @1 C( J( [& l8 v
4 h4 d2 W7 D F/ z: ^, q说明 在 Microsoft® Windows® 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。) q( A$ W' C* k( a
* n: n8 Y- b7 I0 I
% S$ f7 r T5 c# H J; t5 T! E语法! S0 u3 L8 r9 f# s0 t
xp_cmdshell {'command_string'} [, no_output]
! n: z/ v' B1 V. ^参数; a! k o3 M- V7 j) i( k5 }# j
'command_string'
2 l# o" D1 f4 G" L6 d是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(8000) 或 nvarchar(4000),没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格,则需要使用一对引号。如果使用嵌入空格不方便,可考虑使用 FAT 8.3 文件名作为解决办法。
& a' {, `8 T& C; J2 jno_output 2 K6 M" u7 s6 i
是可选参数,表示执行给定的 command_string,但不向客户端返回任何输出。 ) e! Y- j+ S% S) j
返回代码值* q, @/ i9 G# X6 Y
0(成功)或 1(失败)
\4 M9 ~: t+ O Z& J' ]结果集( U x( m% i- }. O- A
执行下列 xp_cmdshell 语句将返回当前目录的目录列表。 xp_cmdshell 'dir *.exe'
5 l3 g/ v" X" X2 N: R) j, w7 i' R6 _4 \ a! g. C
行以 nvarchar(255) 列的形式返回。 1 B% L9 {0 F d; a. { ~
执行下列 xp_cmdshell 语句将返回随后的结果集: xp_cmdshell 'dir *.exe', NO_OUTPUT3 z8 q7 i) ^; m2 H
) `7 M5 U2 D6 Z" V- p. y下面是结果: The command(s) completed successfully.
( h2 a: f& M3 W( O( j3 g1 o& t9 x1 x注释3 C! p# v( S/ r
xp_cmdshell 以同步方式操作。在命令行解释器命令执行完毕之前,不会返回控制。
$ Z) r) R0 b0 W4 a, x当授予用户执行权限时,用户能在 Microsoft Windows NT® 命令行解释器上执行运行 Microsoft SQL Server™ 的帐户有权执行的任何操作系统命令。 7 I( [# l5 Z6 Q& M
默认情况下,只有 sysadmin 固定服务器角色的成员才能执行此扩展存储过程。但是,也可以授予其他用户执行此存储过程的权限。
& L2 Y* o8 y* K当作为 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 用户的安全上下文下执行。
+ j4 _# s2 X' y. N5 X
1 J1 b; M. Q5 S9 K0 M说明 在早期版本中,获得 xp_cmdshell 执行权限的用户在 MSSQLServer 服务的用户帐户上下文中运行命令。可以通过配置选项配置 SQL Server,以便对 SQL Server 无 sa 访问权限的用户能够在 SQLExecutiveCmdExec Windows NT 帐户的上下文中运行 xp_cmdshell。在 SQL Server 7.0 中,该帐户称为 SQLAgentCmdExec。现在,不是 sysadmin 固定服务器角色成员的用户将在该帐户上下文中运行命令,而无需再进行配置更改。" x2 W: [7 I4 c4 u. ?$ J
' B$ V# d8 G* I! G, A5 x, l% n- X权限
: B% G7 Y/ U f, s0 P# T xp_deletemail 的执行权限默认授予 sysadmin 固定服务器角色的成员,但可以授予其他用户。 , ^6 `; Z; \9 h
3 e M9 R; c7 ~% E0 f5 N4 ]0 i4 `
重要 如果为 MSSQLServer 服务选用的 Windows NT 帐户不是本地管理员组的成员,则非 sysadmin 固定服务器角色成员的用户将无法执行 xp_cmdshell。$ ?8 I: V7 r6 a* q
" [4 Y7 A# d/ u$ X' X# ], V示例A. 返回可执行文件列表9 Q" `2 _2 b' d3 I3 k+ a0 c6 J1 _+ t/ Q
下例显示执行目录命令的 xp_cmdshell 扩展存储过程。 EXEC master..xp_cmdshell 'dir *.exe'8 [/ `! M* E7 ^0 o9 Z" H5 F
B. 使用 Windows NT net 命令
" @2 Z# ^9 [/ E9 M0 y" h& M. \下例显示 xp_cmdshell 在存储过程中的使用。下例先用 net send 通知用户 SQL Server 即将关闭,然后用 net pause 暂停服务器,最后用 net stop 关闭服务器。 CREATE PROC shutdown10" F; m) _# t/ m4 w+ z( {; M/ v1 E
AS
$ V- ~) v2 `0 D8 C( `" N3 pEXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down ( _- p4 h. {) \/ O3 l" J
in 10 minutes. No more connections allowed.', no_output
+ H# B5 t0 S# D J+ m5 ]: oEXEC xp_cmdshell 'net pause sqlserver'
% c$ p# A. E* n7 w( F; b3 U% M G' QWAITFOR DELAY '00:05:00'* I! c) t9 B3 l/ q `
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down
0 m* i3 X' |# L in 5 minutes.', no_output
$ f0 o2 i b) bWAITFOR DELAY '00:04:00'
: x; j( d4 P7 E* vEXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
/ \2 J0 c$ W& p6 a* B7 b: A. j6 R in 1 minute. Log off now.', no_output
- ^6 R, i" E- B2 q' P8 o0 L& ~WAITFOR DELAY '00:01:00'
0 e8 R3 n( t( M# S2 I/ bEXEC xp_cmdshell 'net stop sqlserver', no_output
& }. [0 \* K: `4 R4 O9 lC. 不返回输出 3 ]; ]$ u$ @8 n p5 ^ _
下例使用 xp_cmdshell 执行命令字符串,且不向客户端返回输出。 USE master A6 L5 ]: \8 v6 [9 r( K# T
EXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps',
# U- I, T0 b$ h! j% _! G0 [" w0 {# V NO_OUTPUT/ {/ O0 l3 j+ n$ k
D. 使用返回状态7 E. [5 M- c6 U7 q& ?
在下例中,xp_cmdshell 扩展存储过程也给出了返回状态。返回代码值存储在变量 @result 中。 DECLARE @result int9 a8 S3 P8 q3 J2 Q5 G. n8 H
EXEC @result = xp_cmdshell 'dir *.exe'
$ M$ B. a; W9 J- ?. h' J4 o7 n% IIF (@result = 0)
* `9 Z, d6 F. A* ^2 X8 J+ z PRINT 'Success'% V. Q# ~3 I* j- H' Z. R( M3 p
ELSE- I2 S& B6 I7 p' `. o
PRINT 'Failure'
% P! I) c8 J" z W! z' [2 J; YE. 将变量内容写入文件
3 S8 _9 w" H8 j# E V! [1 `7 k下例将 @var 变量的内容写入当前服务器目录下名为 var_out.txt 的文件中。 DECLARE @cmd sysname, @var sysname6 k7 y. j8 f1 q
SET @var = 'Hello world'
c& D1 z0 g: }# b. ]/ bSET @cmd = 'echo ' + @var + ' > var_out.txt'5 K9 J9 G( e( ^7 C3 G8 c6 M
EXEC master..xp_cmdshell @cmd9 J1 \) O* \' v: q8 E2 }4 v3 y7 C
F. 将命令的结果捕获到文件
7 J) `6 |8 ?# Q0 N5 Q; Y& n9 a下例将当前目录的内容写入当前服务器目录中名为 dir_out.txt 的文件中。 DECLARE @cmd sysname, @var sysname, M1 r1 S( `& l
SET @var = 'dir/p'/ v2 p: X; r& J& s8 N9 M: c
SET @cmd = @var + ' > dir_out.txt'
5 y; G8 Y! X' b# ^* Q* wEXEC master..xp_cmdshell @cmd
- x* E) x3 s% M4 R4 f% q/ L3 d' P
( S E1 U1 j6 q' ?
* F+ l: {0 W7 p9 n+ U请参见
5 q/ u* e6 y4 a) X1 k% I8 \
9 V) E. p g. g# H/ i n sqlserver2000/tsqlref/ts_create_4hk5.htm">CREATE PROCEDURE 0 I- `$ ]+ p8 ~* h( j. t/ @5 o
sqlserver2000/tsqlref/ts_ea-ez_05ro.htm">EXECUTE 7 a( L# V: C: B
创建安全帐户 / A \2 G8 A2 [6 s
sqlserver2000/tsqlref/ts_sp_00_519s.htm">系统存储过程(常规扩展过程) 4 q, Q2 s o& _2 Z" U/ ]# X
* F. C, n5 E7 o. D! g) r0 h
9 R1 K2 n6 V1 a
|