数学建模社区-数学中国

标题: xp_cmdshel完全手册 [打印本页]

作者: 韩冰    时间: 2004-11-21 00:16
标题: xp_cmdshel完全手册

以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。

% N0 p7 N8 z2 C9 y: b1 w% n) H8 C0 x

2 b+ \) u. J* x+ _5 S& J 说明 在 Microsoft® Windows® 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。

! w" e! h6 {% J8 U( [ 3 B1 |/ z; E+ f) r, q3 D/ `1 \4 l1 T j5 I0 j 语法 & n9 M! r1 _5 n, C

xp_cmdshell {'command_string'} [, no_output]

5 R, h7 Z5 A' \0 w8 ~) U5 E参数! Z# Z; N- W. \/ B. T

'command_string'

" t8 a1 z1 T$ b/ u4 Z# T5 H

是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(8000)nvarchar(4000),没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格,则需要使用一对引号。如果使用嵌入空格不方便,可考虑使用 FAT 8.3 文件名作为解决办法。

, D% ]7 t3 S0 J* K

no_output

" y; a5 p& m# C# u3 g

是可选参数,表示执行给定的 command_string,但不向客户端返回任何输出。

1 s* f4 s+ D. _& B* m/ c+ H 返回代码值 6 A6 V7 ?9 B% z1 {

0(成功)或 1(失败)

2 _5 Q/ L9 v$ }5 G结果集 % a: z- h; C7 M# n5 b9 W7 g$ [

执行下列 xp_cmdshell 语句将返回当前目录的目录列表。

xp_cmdshell 'dir *.exe'. l5 [+ V* e1 h6 o! c+ } 1 T8 N4 n: R! v6 M# p1 b; d0 z

行以 nvarchar(255) 列的形式返回。

/ ~. ~' b8 \( L, @

执行下列 xp_cmdshell 语句将返回随后的结果集:

xp_cmdshell 'dir *.exe', NO_OUTPUT 5 c+ \- A5 W* i3 m+ ^6 Z . q& a1 Y4 P9 c9 D

下面是结果:

The command(s) completed successfully. w+ Q2 M! a* D0 v7 b8 G注释) `7 b8 h1 w( {$ z8 P8 r

xp_cmdshell 以同步方式操作。在命令行解释器命令执行完毕之前,不会返回控制。

. v/ F9 h5 ?2 D( y# I' v: d+ g

当授予用户执行权限时,用户能在 Microsoft Windows NT® 命令行解释器上执行运行 Microsoft SQL Server™ 的帐户有权执行的任何操作系统命令。

{5 m5 ]9 x, ^- |! D' P, I! V

默认情况下,只有 sysadmin 固定服务器角色的成员才能执行此扩展存储过程。但是,也可以授予其他用户执行此存储过程的权限。

) M- w0 y6 ?( J0 t8 o$ o8 r A

当作为 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 用户的安全上下文下执行。

# J& o2 n! c [0 W5 I! s U

, j& z: E" _: X1 j, H/ O说明 在早期版本中,获得 xp_cmdshell 执行权限的用户在 MSSQLServer 服务的用户帐户上下文中运行命令。可以通过配置选项配置 SQL Server,以便对 SQL Server 无 sa 访问权限的用户能够在 SQLExecutiveCmdExec Windows NT 帐户的上下文中运行 xp_cmdshell。在 SQL Server 7.0 中,该帐户称为 SQLAgentCmdExec。现在,不是 sysadmin 固定服务器角色成员的用户将在该帐户上下文中运行命令,而无需再进行配置更改。

! G: P! I" ]) M. O- m

# T9 w# C) b1 Z: `: J 权限9 W2 }3 ] i( A% T- Q5 w" _6 Z3 @

xp_deletemail 的执行权限默认授予 sysadmin 固定服务器角色的成员,但可以授予其他用户。

" z( `: A# \% p: e

1 a6 T3 o% E' ?$ M重要 如果为 MSSQLServer 服务选用的 Windows NT 帐户不是本地管理员组的成员,则非 sysadmin 固定服务器角色成员的用户将无法执行 xp_cmdshell

6 X2 k& B: h8 O% ~* W# P$ p4 S

# A/ V) K1 Y$ t) t- u+ m8 n% J 示例A. 返回可执行文件列表- F7 Q: C0 e, V$ g

下例显示执行目录命令的 xp_cmdshell 扩展存储过程。

EXEC master..xp_cmdshell 'dir *.exe' 1 S J: s9 O* ~! D) w' G; XB. 使用 Windows NT net 命令 6 E, U0 V0 F. \+ r9 O6 n

下例显示 xp_cmdshell 在存储过程中的使用。下例先用 net send 通知用户 SQL Server 即将关闭,然后用 net pause 暂停服务器,最后用 net stop 关闭服务器。

CREATE PROC shutdown10' P2 e# B8 h# i2 X+ R E! q AS) t+ P/ F$ ]$ c" R EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down 0 z" a- p: z3 P0 o in 10 minutes. No more connections allowed.', no_output& L; ^: n4 I# B EXEC xp_cmdshell 'net pause sqlserver'3 O" b8 B6 R W7 j0 m; ^ WAITFOR DELAY '00:05:00'6 S4 I2 O3 b! W; n EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down $ k* U% R- K! G+ H$ P [1 Q$ j( M5 K3 O in 5 minutes.', no_output( H0 T3 F' Y- g: z! P# g+ k" l. L WAITFOR DELAY '00:04:00' ; r6 y8 w2 S# B* K3 {4 \EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down " F7 m! }7 Y ?' \8 ^3 l in 1 minute. Log off now.', no_output ) G9 j1 T9 Z# ^' e/ EWAITFOR DELAY '00:01:00'' u$ F! U3 \# I7 V EXEC xp_cmdshell 'net stop sqlserver', no_output 0 V8 m: P/ @0 V. |C. 不返回输出 - a) L; I7 x/ J

下例使用 xp_cmdshell 执行命令字符串,且不向客户端返回输出。

USE master 8 d3 [% u: [( S, }' j( GEXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps', 5 L ?! R7 s/ a NO_OUTPUT 7 N8 [, c, g: } ?D. 使用返回状态 $ O _' y7 S3 a Q7 O1 M

在下例中,xp_cmdshell 扩展存储过程也给出了返回状态。返回代码值存储在变量 @result 中。

DECLARE @result int3 o* P- o" n! b# t9 h EXEC @result = xp_cmdshell 'dir *.exe', a1 L1 R4 m% e1 f IF (@result = 0) * B2 X6 U9 H- J; ~3 \( Q7 x/ Q PRINT 'Success' , O! a# w& x% E8 P! lELSE & T" h& @7 y5 J3 ^0 Q8 { [ PRINT 'Failure' 8 D7 @( S- J4 K9 b0 ~# iE. 将变量内容写入文件 * A, ~8 }, U) e" @0 U

下例将 @var 变量的内容写入当前服务器目录下名为 var_out.txt 的文件中。

DECLARE @cmd sysname, @var sysname : h M* F: M: }- D& W# S- SSET @var = 'Hello world'5 f \* ]/ N8 A* ~( \( i SET @cmd = 'echo ' + @var + ' > var_out.txt' 9 {9 _' j9 Z0 p% M y9 Y7 c1 |EXEC master..xp_cmdshell @cmd# V5 k. Y: s7 f6 I F. 将命令的结果捕获到文件: A* ~ J* o8 e* r; U

下例将当前目录的内容写入当前服务器目录中名为 dir_out.txt 的文件中。

DECLARE @cmd sysname, @var sysname & E* q$ Y# d4 w' HSET @var = 'dir/p'# [ n0 D7 ]1 ^: H1 I# A1 H1 ]) C SET @cmd = @var + ' > dir_out.txt' ' h+ D7 G2 _- ]$ k% _6 e1 p8 DEXEC master..xp_cmdshell @cmd' ~4 F: }3 c, b% x! T ) h* N6 S% y+ G ?

# n) y2 k: c) D. N# \' _1 F 请参见 : P4 G7 X% T- u7 O5 f4 C

/ @ ]. [- q) E. Z3 i4 m

sqlserver2000/tsqlref/ts_create_4hk5.htm">CREATE PROCEDURE

( j* |$ c3 R" Z, G0 v

sqlserver2000/tsqlref/ts_ea-ez_05ro.htm">EXECUTE

7 o6 w2 j7 X- L$ t T* b

创建安全帐户

" z$ \. P+ V2 f9 D

sqlserver2000/tsqlref/ts_sp_00_519s.htm">系统存储过程(常规扩展过程)

3 R& Y/ I- U7 L* x8 g2 A6 V

5 d& N, o5 c' E r 3 N- Y( ^* U7 I6 G$ x* D






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5