選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
2 分鐘閱讀時間 (365 個字)

[SQL]執行 xp_cmdshell 可能遇到的問題

unsplash-coding113



當用一般的帳號(非sysadmin)在SQL中執行 xp_cmdshell 時,

有可能會發生以下的錯誤,

Msg 229, Level 14, State 5, Procedure xp_cmdshell, Line 1 [Batch Start Line 7]
The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.




以 Windows 管理帳號登入 登入執行 exec master..xp_cmdshell 'dir' 可以順利執行,如下,



再來新建一個帳號再執行看看,如下,
CREATE LOGIN login1 WITH PASSWORD = 'rmok';  
CREATE USER user1 FOR LOGIN login1;
--使用 user1 身份EXECUTE AS LOGIN = 'login1';
SELECT SUSER_NAME(), USER_NAME();
exec master..xp_cmdshell 'dir';

所以我們要將權限 GRANT 給 user1 ,如下,
--切換回 管理者  身份REVERT; 
--將權限 GRANT 給 user1 GRANT exec ON xp_cmdshell TO user1
 
再切到 user1 來執行看看,
--使用 user1 身份EXECUTE AS LOGIN = 'login1';  
SELECT SUSER_NAME(), USER_NAME();
exec master..xp_cmdshell 'dir';
這時有可能又會出現以下的錯誤,

Msg 15153, Level 16, State 1, Procedure xp_cmdshell, Line 1 [Batch Start Line 19]
The xp_cmdshell proxy account information cannot be retrieved or is invalid. Verify that the '##xp_cmdshell_proxy_account##' credential exists and contains valid information.

這是因為非 sysadmin 的帳號使用 xp_cmdshell 時,需要透過 xp_cmdshell_proxy_account 去幫它執行,

所以這時我們要設定一個 Windows 帳號給它(請注意,SSMS要以「系統管理員身份」來開啟,同時要以 Windows 帳號登入),如下,
EXEC sp_xp_cmdshell_proxy_account 'domain\winUser','winUserPassword'
當執行完成後,再用 user1 來執行,就可以順利執行了哦!

最後將測試的帳號 drop 掉,如下,

REVERT;
-- drop test accountDROP LOGIN login1;

DROP USER user1;
本文也發表於亂馬客Blog
[SQL]為資料做加解密處理
[.NET]From Sync to Async
 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/06, 週一

Captcha 圖像