首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000:非 sysadmin 角色成員執行 xp_cmdshell 完整設定指南

     編輯:關於SqlServer

問題情境

預設只有 sysadmin 固定伺服器角色成員可執行 xp_cmdshell。若一般登入嘗試執行,會遇到權限不足或代理帳戶錯誤(錯誤 50001:LogonUserW 返回錯誤 1326)。

建立測試登入與授權

-- 建立登入與資料庫用戶
USE master;
GO
EXEC sp_addlogin 'njslt', 'nJSlt', 'test_db';
GO

USE test_db;
GO
EXEC sp_adduser 'njslt', 'nJSlt', 'db_owner';
GO

-- 授予 master 資料庫權限與 xp_cmdshell 執行權限
USE master;
GO
EXEC sp_adduser 'njslt', 'nJSlt', 'db_ddladmin';
GO
GRANT EXEC ON xp_cmdshell TO nJSlt;
GO

兩種解決方案

方案一:提升為 sysadmin 角色(不建議生產環境)

EXEC sp_addsrvrolemember 'nJSlt', 'sysadmin';
GO

⚠️ 安全性風險極高,sysadmin 擁有伺服器最高權限,僅供測試或特殊需求。

方案二:設定 SQL Server Agent Proxy 帳戶(推薦)

非 sysadmin 使用者執行 xp_cmdshell 時,會模擬 xp_sqlagent_proxy_account 指定的 Proxy 帳戶。若 Proxy 帳戶不可用則失敗。

DECLARE @winuser sysname, @passWord sysname, @Nsql varchar(1000);

-- 1. 在作業系統建立 Windows 使用者作為 Proxy 帳戶
SELECT @winuser = N'xpcmdshell', @passWord = N'xpcmdshell';
SET @Nsql = 'NET USER "' + @winuser + '" "' + @passWord + '" /ADD';
EXEC xp_cmdshell @Nsql;
GO

-- 2. 設定 xp_cmdshell Proxy 帳戶
EXEC master.dbo.xp_sqlagent_proxy_account N'SET', N'', @winuser, @passWord;
GO

設定完成後,以 nJSlt 登入即可正常執行 xp_cmdshell。

清除測試環境

-- 移除資料庫用戶、登入、Windows 使用者
USE test_db; GO EXEC sp_dropuser 'nJSlt'; GO
USE master; GO EXEC sp_dropuser 'nJSlt'; GO EXEC sp_droplogin 'nJSlt'; GO

DECLARE @user sysname, @passWord sysname, @sql varchar(1000);
SELECT @user = N'xpcmdshell', @passWord = N'xpcmdshell';
SET @sql = 'NET USER ' + @user + ' /DELETE';
EXEC xp_cmdshell @sql;

重要補充

  • 此機制僅適用於 Windows NT 4.0 / Windows 2000;Windows 9.x 無模擬機制,始終在啟動 SQL Server 的使用者安全內容下執行
  • 嘗試使用 SETUSER 切換安全內容無效
  • Proxy 帳戶必須具備「作為批次工作登入」權限
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved