数学建模社区-数学中国

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

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

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

+ F. c `- T, }' P) X) J& S

) y& _' X9 T+ F( m3 |) [, b说明 在 Microsoft® Windows® 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。

4 e( }6 S1 R/ r% b$ b * ?( B r1 O0 V0 f" d ?9 A$ Q! w5 L& ^. v% [+ E" E5 N' C 语法 4 d7 S; ^1 L; p3 Y$ R ~

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 文件名作为解决办法。

0 g$ ]# P; ?- u% w4 x- e# o

no_output

, R+ ]# }% F8 r/ e9 [% U8 U8 H( e

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

0 y: i, _1 w+ z! a返回代码值 + L& s, S/ r \0 _

0(成功)或 1(失败)

: Y# t1 t9 ~6 E! E2 U. J# z结果集 3 B t: i: c# x; e+ _$ f

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

xp_cmdshell 'dir *.exe' - Y. u5 z1 V6 d ! r: D7 Q' U1 |) f

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

O# m- E* m$ Y, y7 a" P

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

xp_cmdshell 'dir *.exe', NO_OUTPUT- E' F3 w$ W" m; G / Q) _2 q8 U' I, P- W! g8 F

下面是结果:

The command(s) completed successfully.2 Z1 ]& V( P/ r& N* C$ k5 b6 x 注释' D- Z) H2 t- u

xp_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 固定服务器角色的成员才能执行此扩展存储过程。但是,也可以授予其他用户执行此存储过程的权限。

+ z% P- N( j; J/ i0 s

当作为 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

5 Y9 t7 O/ [4 E说明 在早期版本中,获得 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

+ o( D& b+ M: M. \权限; Y+ L+ J* M! S8 v5 j1 K) X0 A

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

! w* U9 L( s! ~: U

, Q2 e, |! f0 `) _7 T重要 如果为 MSSQLServer 服务选用的 Windows NT 帐户不是本地管理员组的成员,则非 sysadmin 固定服务器角色成员的用户将无法执行 xp_cmdshell

2 K9 i4 [9 t5 L. L" ~+ L% K

; d. q( k( d! ]+ @5 Q3 ~示例A. 返回可执行文件列表, F# g( k1 y* R; H) \! q

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

EXEC master..xp_cmdshell 'dir *.exe' 0 L5 w( s0 M B+ L0 @B. 使用 Windows NT net 命令 # \# g' n' y5 z+ ^

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

CREATE PROC shutdown10$ w2 g6 m1 N) r# B) w9 c; s AS % U. |" z" S: Q- vEXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down . |& ]+ X0 r/ `. k% I: w in 10 minutes. No more connections allowed.', no_output1 l) ~" i1 a/ f EXEC xp_cmdshell 'net pause sqlserver' * ]: S: ]- E. l, W/ e* }WAITFOR DELAY '00:05:00' * \ ~9 U0 M4 q, `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' * }4 x; Y. k. tEXEC 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 1 e& u) |# h1 Q4 w" WC. 不返回输出 ( 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 * i/ W! q7 T% ~0 W4 S$ M/ BD. 使用返回状态# 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) 9 Q2 D4 a% M+ j1 R6 K 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' ' M( [$ n, R- VSET @cmd = 'echo ' + @var + ' > var_out.txt'( d) f8 b! T8 ^/ | EXEC master..xp_cmdshell @cmd . M' p! N, J% D; Z: {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 # l2 x) \" m- _6 e/ b7 R" s! |# `. Z {$ X; A- ~' R# K/ L3 X

. `; R# {" [! l# n+ p* k+ e: ]( Z) e* D 请参见2 x* E) W6 ~) _% `

% a$ A5 t* E. J0 {0 H- Z

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

创建安全帐户

7 [3 B) P" Q1 d% \% h0 [, F$ k0 m; B3 l

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

% t( e) j9 o$ T {- g1 q/ V

: B2 Z$ I) y# p. C6 K5 Q+ w# i" `) n) f0 S7 a8 ?, d1 o) ] N






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