當用一般的帳號(非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:從零開始的軟體開發生活」
請大家繼續支持 ^_^