SA(系統管理員)帳號擁有最高權限,是資料庫安全的核心。本文整理 SA 權限常見操作,特別針對 xp_cmdshell 擴展預存程序的移除、恢復,以及 DLL 遺失時的應對策略,協助 DBA 強化伺服器防護。
IF EXISTS (
SELECT * FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[xp_cmdshell]')
AND OBJECTPROPERTY(id, N'IsExtendedProc') = 1
)
EXEC sp_dropextendedproc N'xp_cmdshell';
-- SQL Server 7.0
EXEC sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll';
-- SQL Server 2000
EXEC sp_addextendedproc 'xp_cmdshell', 'xplog70.dll';
若在查詢分析器執行恢復語句提示「資料庫中已存在名為 'xp_cmdshell' 的物件」,表示擴展程序仍在目錄中,但可能 DLL 遺失或損壞。
若無法使用查詢分析器,可透過 SqlExec 遠端執行:
%ssp_addextendedproc 或 sp_dropextendedproc 語句現象:執行恢復語句提示「已存在」,但實際無法使用 xp_cmdshell。
原因:系統資料表仍保留擴展程序項目,但實體 DLL 檔案遺失或被改名。
解決步驟:
C:\Program Files\Microsoft SQL Server\MSSQL\Binn 目錄下是否存在 xplog70.dll(SQL 2000)或 xpsql70.dll(SQL 7.0)。sp_dropextendedproc 移除舊項目,再執行 sp_addextendedproc 重新註冊。xp_cmdshell,僅在必要時臨時開啟。掌握 xp_cmdshell 的生命週期管理,是 SQL Server 安全防禦的基本功。結合 DLL 完整性檢查與最小權限原則,可有效降低惡意程式碼執行風險。