如何从VBScript运行Microsoft SQL Server代理作业

时间:2017-02-10 21:59:22

标签: sql-server vbscript

我有一个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

1 个答案:

答案 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上创建一个计划任务:

  • 计划每10分钟运行一次
  • 执行cmd脚本,该脚本将:

    • 检查指定位置是否存在触发器文件
    • 如果找到文件,将使用sqlcmd启动SQL代理作业,然后删除触发器文件

ERP系统触发的VBScript应该只是在指定的位置放置一个空的,正确命名的触发器文件

使用存储过程控制正在启动的内容

要进一步减少攻击向量,可以在SQL Server中创建自己的包装器存储过程,以启动所需的SQL代理作业。

  1. 创建服务器登录:
  2. USE [master]
    GO
    CREATE LOGIN [erp_trigger_user] WITH PASSWORD=N'pwd', DEFAULT_DATABASE=[msdb], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
    GO
    
    1. 创建数据库用户:
    2. USE [msdb]
      GO
      CREATE USER [erp_trigger_user] FOR LOGIN [erp_trigger_user] WITH DEFAULT_SCHEMA=[dbo]
      GO
      
      1. 创建将启动所需SQL Server代理作业的存储过程:
      2. 注意:存储过程将以 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
        
        1. 授予用户执行存储过程的权限:
        2. GO
          GRANT EXECUTE ON [dbo].[sp_StartERPJob] TO [erp_trigger_user]
          GO
          
          1. 更新您的预定任务以执行如下所示的Windows批处理文件:
          2. 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
            )