簡體   English   中英

如何從 VBScript 運行 Microsoft SQL Server 代理作業

[英]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 上創建一個計划任務:

  • 計划每 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
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM