[英]How to run a Microsoft SQL Server Agent Job from VBScript
我有一個 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 中具有系統管理員權限的用戶的安全上下文中運行(這不好)。
使用任務計划程序和觸發器文件
與其直接啟動 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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.