我有一个ERP系统,允许我将VBScript附加到自定义窗口上的按钮。我希望能够运行此脚本,以便它触发服务器上的SQL Server代理作业(SQL Server 2008)。我现在已经看了好几个小时了,我能看到的最接近的是一个似乎使用折旧命令(SQL.DMO)的短脚本。这是我从网上刷过的代码:
On Error Goto 0: Main()
Sub Main()
Set objSQL = CreateObject("SQLDMO.SQLServer")
' Leave as trusted connection
objSQL.LoginSecure = True
' Change to match the name of your SQL server
objSQL.Connect "Server Name"
Set objJob = objSQL.JobServer
For each job in objJob.Jobs
if instr(1,job.Name,"Job Name") > 0 then
msgbox job.Name
job.Start
msgbox "Job Started"
end if
Next
End Sub
产生的错误是:
Line: 3
Char: 3
Error: ActiveX component can't create object: 'SQLDMO.SQLServer'
Code: 800A01AD
Source: Microsoft VBScript runtime error
答案 0 :(得分:2)
使用sqlcmd并执行sp_start_job命令:
Set oShell = CreateObject ("WScript.Shell")
oShell.run "sqlcmd -S localhost -E -Q ""EXECUTE msdb.dbo.sp_start_job N'My Job Name'""
sqlcmd
应存在于SQL Server上。
这可能存在安全风险。根据文档,默认情况下,只有 sysadmin 角色的成员才能执行sp_start_job
。您需要在SQL Server中具有 sysadmin 权限的用户的安全上下文中运行VBScript(这不是很好)。
使用任务计划程序和触发器文件
不是直接启动SQL代理作业,而是在SQL Server上创建一个计划任务:
执行cmd脚本,该脚本将:
sqlcmd
启动SQL代理作业,然后删除触发器文件ERP系统触发的VBScript应该只是在指定的位置放置一个空的,正确命名的触发器文件。
使用存储过程控制正在启动的内容
要进一步减少攻击向量,可以在SQL Server中创建自己的包装器存储过程,以启动所需的SQL代理作业。
USE [master]
GO
CREATE LOGIN [erp_trigger_user] WITH PASSWORD=N'pwd', DEFAULT_DATABASE=[msdb], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [msdb]
GO
CREATE USER [erp_trigger_user] FOR LOGIN [erp_trigger_user] WITH DEFAULT_SCHEMA=[dbo]
GO
注意:存储过程将以 dbo 用户身份执行,该用户有权执行msdb.dbo.sp_start_job
。
CREATE PROCEDURE dbo.sp_StartERPJob
WITH EXECUTE AS 'dbo'
AS
BEGIN
EXECUTE msdb.dbo.sp_start_job N'My Job Name'
END
GO
GRANT EXECUTE ON [dbo].[sp_StartERPJob] TO [erp_trigger_user]
GO
if exist trigger_file.txt (
sqlcmd -S localhost -E -Q -U erp_trigger_user -P pwd "EXECUTE msdb.dbo.sp_StartERPJob"
del trigger_file.txt
) else (
rem file doesn't exist
)