QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2815|回复: 0
打印 上一主题 下一主题

xp_cmdshel完全手册

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 00:16 |只看该作者 |正序浏览
|招呼Ta 关注Ta

以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 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 j

no_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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-19 03:32 , Processed in 0.410458 second(s), 52 queries .

回顶部