常用的告警方式大致有:短信、郵件、應用程序 (beep提示,圖標提示,升窗提示等),可是不能一直坐在電腦前看著應用程序,或者用腳本部署監控,根本沒有程序界面,所以通常用短信、郵件兩種方式告警。
一. 告警方式
1. 短信
用程序發短信的方式一般有這兩種:
(1) 硬件
需要1張SIM卡,1個SIM卡讀卡設備 (比如:短信貓),然后把設備連接到電腦,應用程序根據設備的軟件接口,傳參并發送短信。記得把SIM卡設備放在信號好,無干擾的地方;
如果有大量短信要發,1張SIM卡是不夠用的,而且發送過度頻繁,可能被運營商視為惡意短信,把SIM卡號加入黑名單,那么就需要多張SIM卡甚至多個讀卡設備。
顯示號碼為當前SIM卡號碼,大多供應商都支持DLL、HTTP等多種接口,當然也可以基于接口二次開發。
DLL接口方法參考:SmsManager.sendTextMessage(…)
(2) 第三方短信接口
有多種接口形式提供,比如:Web Service形式,HTTP形式,還有郵件接口:往1380013900@xxx.com發個短小的郵件,這個郵件會以短信的形式轉發到手機上,等等。只要往接口傳參數,告訴它發給誰,發什么內容,就可以了。
顯示號碼為某個SIM卡號碼,或者為固定號碼 (如:106開頭的),這取決于短信平臺和運營商的實現方式,因為運營商發短信是不要卡的,直接可以發給目標號碼,而且可以顯示為固定的某個號碼。
Web Service接口地址參考:http://123.456.789.000/SmsManager.asmx?wsdl
Http接口地址參考:http://api.abc.xyz/sms/send.html
2. 郵件
凡是實現了SMTP協議的組件,都可以發送郵件。
在Windows環境下,有系統自帶的組件CDO (Collaboration Data Objects,以前叫OLE Messaging 或者Active Messaging),是MAPI庫的COM封裝。不管是自己開發程序,使用VBS,還是SQL Server的SQL Mail/Database Mail,通常都是調用的這個組件。
SMTP協議要求的參數大致如下:
SMTP Hostname: SMTP服務器名,如mail.test.com或者IP
SMTP Port: SMTP服務端口,25
SMTP Username: 通過SMTP發送郵件用來驗證的用戶名, 如果不要求身份驗證,留空
SMTP PassWord: 通過SMTP發送郵件用來驗證的密碼, 如果不要求身份驗證,留空
二. 選擇告警方式并配置
1. 短信
不管是選擇硬件,還是第三方接口,都需要一個程序來調用,可以是監控工具、腳本、甚至數據庫。
(1) 監控工具/應用程序中,通常都留有短信接口的配置,配置接口地址即可;
(2) 在腳本中配置,Windows環境通常要借助OLE Automation;
OLE Automation后來改名叫Automation,是Windows上基于COM,用于腳本語言實現進程間通訊的機制,腳本如:VBS, SQL, Powershell,不包括BAT(BAT可以調用VBS)。
SQL Server中使用OLE Automation調用Web Service短信接口如下:
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ole Automation PRocedures', 1;RECONFIGURE;declare @text_message nvarchar(180) ,@phone_number nvarchar(15) ,@soap_object int ,@status int ,@output nvarchar(255)set @text_message = N'Testing Mail'set @phone_number = N'138000139000'--Create MSSOAP.SoapClient objectexec @status=sp_OACreate 'MSSOAP.SoapClient', @soap_object out--SmsManager is Web Service nameexec @status = sp_OAMethod @object, 'mssoapinit', null, 'http://123.456.789.000/SmsManager.asmx?wsdl', 'SmsManager'--SendTextMessage is webservice methodexec @status = sp_OAMethod @object, 'SendTextMessage', @output OUT, @phone_number, @text_messageif @status <> 0begin exec sp_OAGetErrorInfo @soap_object select @soap_objectendelsebegin select @outputend--Destroy MSSOAP.SoapClient objectexec @status = sp_OADestroy @soap_objectGO
對于HTTP, DLL接口,和SOAP接口類似,用OLE Automation也都可以調用,主要區別就是在CreateObject() 時。
以VBS為例,調用HTTP, DLL時CreateObject()如下:
Dim http Set http = CreateObject("Msxml2.xmlhttp") Dim dllSet dll = CreateObject("工程名.類名")
2. 郵件
(1) 監控工具/應用程序中,通常都留有SMTP配置項,配置SMTP參數即可;
(2) 在腳本中配置,Windows環境通常要借助OLE Automation;
VBS發送郵件如下:
Dim nsns = "http://schemas.microsoft.com/cdo/configuration/"Dim title, contenttitle = "db_maint_alert"content = ""content = content&"Hi All,"content = content&chr(13)&chr(10)content = content&" "content = content&chr(13)&chr(10)content = content&"----test mail----"Msgbox('~1~')Set cm = CreateObject("CDO.Message")cm.from = "from_user_name@abc.com" cm.to = "to_user_name@abc.com"cm.cc = "cc_user_name@abc.com"cm.subject = titlecm.textbody = content'cm.AddAttachment ""Msgbox('~2~')'sendusing: 1 = pickup, 2 = port'smtpauthenticate: 0 = anonymous,1 = common,2 = NTLM'smtpusessl: 0 = no,1 = yesWith cm.configuration.fields .item(ns & "sendusing") = 2 .item(ns & "smtpserver") = "xxx.xxx.xxx.xxx" .item(ns & "smtpserverport") = 25 .item(ns & "smtpauthenticate") = 1 .item(ns & "sendusername") = "user_name@abc.com" .item(ns & "sendpassword") = "*****************" .item(ns & "smtpconnectiontimeout") = 10 .item(ns & "smtpusessl") = 0 .updateEnd WithMsgbox('~3~')cm.sendSet cm = nothingMsgbox('~success~')
SQL Server 2000發送郵件如下:
SQL Server 2000有SQL Mail,不過必須要同服務器上安裝一個實現了MAPI的郵件程序,如:Outlook,因為SQL Mail需要借用郵件應用程序的MAPI來發送郵件,配置起來不太方便,所以使用類似上面VBS的OLE Automation方法。
use master;if OBJECT_ID('sp_SendDatabaseMail') is not null drop proc sp_SendDatabaseMailgoCREATE PROCEDURE sp_SendDatabaseMail @recipients varchar(8000), --'001@abc.com; 002@abc.com;' @Subject varchar(400) = '', @HtmlBody varchar(8000) = ''asDeclare @From varchar(100)Declare @To varchar(100)Declare @Bcc varchar(500)Declare @AddAttachment varchar(100)Declare @object intDeclare @hr intDeclare @source varchar(255) Declare @description varchar(500) Declare @output varchar(1000) set @From = 'SqlAlert@abc.com' set @To = @recipients set @Bcc = '' set @AddAttachment = '' --set @HtmlBody= '<body><h1><font color=Red>' +@HtmlBody+'</font></h1></body>' EXEC @hr = sp_OACreate 'CDO.Message', @object OUT EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', 'xxx.xxx.xxx.xxx' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value','25' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value','1' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value','user_name@abc.com' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value','*****************' EXEC @hr = sp_OAMethod @object, 'Configuration.Fields.Update', null EXEC @hr = sp_OASetProperty @object, 'To', @To EXEC @hr = sp_OASetProperty @object, 'Bcc', @Bcc EXEC @hr = sp_OASetProperty @object, 'From', @From EXEC @hr = sp_OASetProperty @object, 'Subject', @Subject EXEC @hr = sp_OASetProperty @object, 'HtmlBody', @HtmlBody --add attachment if @AddAttachment<>'' EXEC @hr = sp_OAMethod @object, 'AddAttachment',NULL,@AddAttachment IF @hr <>0 select @hr BEGIN EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT IF @hr = 0 BEGIN SELECT @output = ' Source: ' + @source PRINT @output SELECT @output = ' Description: ' + @description PRINT @output END ELSE BEGIN PRINT ' sp_OAGetErrorInfo failed.' RETURN END END --send mailEXEC @hr = sp_OAMethod @object, 'Send', NULL IF @hr <>0 select @hr BEGIN EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT IF @hr = 0 BEGIN SELECT @output = ' Source: ' + @source PRINT @output SELECT @output = ' Description: ' + @description PRINT @output END ELSE BEGIN PRINT ' sp_OAGetErrorInfo failed.' RETURN END endPRINT 'Send Success!!!' --destroy objectEXEC @hr = sp_OADestroy @object
調用上面這個SP來發郵件:
EXEC sp_SendDatabaseMail @recipients = '001@test.com; 002@test.com;', @body = 'This is a testing mail', @HtmlBody = 'Testing Database Mail'
SQL Server 2005起,使用Database Mail,腳本如下:
--1. 啟用database mailuse masterGOexec sp_configure 'show advanced opt
新聞熱點
疑難解答