利用 sp_OACreate、sp_OAMethod、sp_OADestroy 呼叫 Scripting.FileSystemObject COM 元件,可在 T-SQL 中執行檔案移動、複製、刪除等作業,繞過 xp_cmdshell 限制。
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[p_movefile]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[p_movefile];
GO
CREATE PROC p_movefile
@s_file VARCHAR(1000), -- 來源檔案完整路徑
@d_file VARCHAR(1000) -- 目標資料夾或完整路徑
AS
BEGIN
DECLARE @err INT, @src VARCHAR(255), @desc VARCHAR(255), @obj INT;
-- 建立 FileSystemObject 實例
EXEC @err = sp_OACreate 'Scripting.FileSystemObject', @obj OUT;
IF @err <> 0 GOTO lberr;
-- 呼叫 MoveFile 方法
EXEC @err = sp_OAMethod @obj, 'MoveFile', NULL, @s_file, @d_file;
IF @err <> 0 GOTO lberr;
-- 釋放物件
EXEC @err = sp_OADestroy @obj;
RETURN;
lberr:
EXEC sp_OAGetErrorInfo 0, @src OUT, @desc OUT;
SELECT CAST(@err AS VARBINARY(4)) AS 錯誤碼, @src AS 錯誤來源, @desc AS 錯誤描述;
END;
GO
EXEC p_movefile 'd:\aa.txt', 'c:\'; -- 將 d:\aa.txt 移至 c:\ 目錄下
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;在 xp_cmdshell 受限環境下,OLE 自動化提供 T-SQL 操作檔案系統的替代方案,但需謹慎評估安全性 (啟用 OLE Automation 擴大攻擊面) 與效能,建議嚴格限制執行權限並記錄稽核軌跡。