QQ登录

只需要一步,快速开始

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

xp_cmdshel完全手册

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

xp_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 G

sqlserver2000/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

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-20 06:19 , Processed in 0.412338 second(s), 52 queries .

回顶部