gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:11:43 24 4
gpt4 key购买 nike

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

最佳答案

使用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
)

关于sql-server - 如何从 VBScript 运行 Microsoft SQL Server 代理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com