【问题标题】:How to run a Microsoft SQL Server Agent Job from VBScript如何从 VBScript 运行 Microsoft SQL Server 代理作业
【发布时间】:2017-02-10 21:59:22
【问题描述】:

我有一个 ERP 系统,允许我将 VBScript 附加到自定义窗口上的按钮。我希望能够运行此脚本,以便它在服务器(SQL Server 2008)上触发 SQL Server 代理作业。我已经研究了几个小时了,我能看到的最接近的是一个简短的脚本,它似乎使用了一个贬值的命令(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

【问题讨论】:

  • 我猜您需要在客户端上安装一些(已弃用)SQL Server 相关的东西才能使其正常工作。如果一切都失败了,你总是可以让你的 VBScript 触发 PowerShell script
  • 这将如何工作完全取决于执行 vbscript 的客户端。这些客户端会安装 SQL Server 库吗?

标签: sql-server vbscript


【解决方案1】:

使用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。您将需要您的 VBScript 在 SQL Server 中具有 sysadmin 权限的用户的安全上下文下运行(这不好)。

使用任务计划程序和触发器文件

与其直接启动 SQL 代理作业,不如在 SQL Server 上创建一个计划任务:

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

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

由 ERP 系统触发的 VBScript 只需在指定位置放置一个正确命名的空触发文件

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

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

  1. 创建服务器登录:
USE [master]
GO
CREATE LOGIN [erp_trigger_user] WITH PASSWORD=N'pwd', DEFAULT_DATABASE=[msdb], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
  1. 创建数据库用户:
USE [msdb]
GO
CREATE USER [erp_trigger_user] FOR LOGIN [erp_trigger_user] WITH DEFAULT_SCHEMA=[dbo]
GO
  1. 创建将启动所需的 SQL Server 代理作业的存储过程:

注意:存储过程将以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. 授予用户执行存储过程的权限:
GO
GRANT EXECUTE ON [dbo].[sp_StartERPJob] TO [erp_trigger_user]
GO
  1. 更新您的计划任务以执行如下所示的 Windows 批处理文件:
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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多