接着前面提到过的如何写event log到nt server一文,此处将实现store procedure中写event log到nt server的功能。
其实,写event log到nt server还是采用vb com实现,而在此处所做的是在store procedure中调用该vb com。
首先介绍几个sql server自带的store procedure。
1:sp_oacreate 建立自动操作对象的一个实例
这里自动操作对象可以是 activex exe、com、shell等。其中还可以利用wscript.shell进行入侵攻击(扯远了)。
可以采用如下方式创建com:
exec @hr = sp_oacreate 'eventrecord.eventrecorder',@eventrecorder output
这里eventrecord.eventrecorder即为vb编写的com类,@eventrecorder为返回值,返回值为 int 型。之后的操作都将围绕该@eventrecorder进行,可以看作为store procedure中的一个对象。@hr为sp_oacreate调用返回值,若@hr=0则表示创建成功,否则失败。常用作出错处理。
2:sp_oadestroy 释放一个对象的实例
在对创建的对象操作完成之后需要释放资源,可以采用如下方式:
exec sp_oadestroy @eventrecorder
3:sp_oageterrorinfo 从其他过程返回的hresult中获得错误信息
主要用作错误处理。
4:sp_oagetproperty 把对象的属性存储在结果集或局部变量中
实现与对象的通信。如:
exec sp_oagetproperty @eventrecorder,'source',@eventsource output
实现获取eventrecorder对象中的source属性的值并放入到@eventsource变量中
5:sp_oasetproperty 对对象的属性进行赋值处理,将会改变对象的该属性值
实现与对象的通信。如:
exec sp_oasetproperty @eventrecorder,'source',@eventsource
实现设置@eventrecorder对象的source属性,将source属性设定为@eventsource变量的值。
6:sp_oamethod 实现对象的方法的调用
向对象的方法传递参数,并得到返回值。
有参数有返回值:如
exec sp_oamethod @eventrecorder,'writeeventlog',@resultvalue output,
@[email protected],@[email protected],
@[email protected],@[email protected]
无参数有返回值:如
exec sp_oamethod @eventrecorder,'writeeventlog',@resultvalue output
无参数无返回值:如
exec sp_oamethod @eventrecorder,'writeeventlog',null
7:sp_oastop 关闭sql server的自动存储过程
关闭sql server对com的自动操作环境,无须任何参数。不是必须的,因为第一次调用sp_oacreate时会自动开启自动操作环境,sql server关闭时,该自动环境也会自动关闭。另外,如果一个存储过程正在对一个com对象进行操作,而另一个存储过程关闭了该自动环境,则会出现错误,所以不建议采用这种方式。
ok,至此,对于操作com所必须的知识已经足够了。
下面是本次实现的例子:
/*
** write event log to nt event viewer
*/
create procedure dbo.sp_eventrecorder
(
@eventsource nvarchar(100), ----event source
@eventid int, ----event id , please refer the <application id document>
@eventtype int, ----event type , 0--information;1--error;2--warning
@eventmessage nvarchar(2000), ----event message,the error content
@eventcategory int = 0, ----event category ,default 0
@returnvalue int output ----return value 0--success;1--fail
)
as
declare
@eventmachinename nvarchar(100),
@eventrecorder int,
@hr int,
@resultvalue nvarchar(10)
begin
----set event log server name,' ' means local machine,need to config
set @eventmachinename = ' '
end
----create eventrecorder object
exec @hr = sp_oacreate 'eventrecord.eventrecorder',@eventrecorder output
if @hr = 0
begin
----set method 0--write to event viewer;1--write to database.default 0
exec @hr = sp_oasetproperty @eventrecorder,'method',0
if @hr <> 0 goto errorhandle
----set machine name of event log server,default local server
exec @hr = sp_oasetproperty @eventrecorder,'machinename',@eventmachinename
if @hr <> 0 goto errorhandle
----set event source,must to do it!
exec @hr = sp_oasetproperty @eventrecorder,'source',@eventsource
if @hr <> 0 goto errorhandle
----write event log
exec @hr = sp_oamethod @eventrecorder,'writeeventlog',@resultvalue output,
@[email protected],@[email protected],
@[email protected],@[email protected]
if @hr <> 0 goto errorhandle
----check if write successfully!
if @resultvalue = 'true'
begin
set @returnvalue = 0
exec sp_oadestroy @eventrecorder
return
end
else
begin
set @returnvalue = 1
exec sp_oadestroy @eventrecorder
return
end
end
else
begin
set @returnvalue = 1
return
end
errorhandle:
set @returnvalue = 1
exec sp_oadestroy @eventrecorder
return
新闻热点
疑难解答