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

當用一般的帳號(非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 account
DROP LOGIN login1;  
 
DROP USER user1;  
 

 

 

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^