我试图了解在用户定义的存储过程中包装 xp_cmdshell 功能的详细信息,以便其他用户可以只获得对存储过程的执行权限,而不是 xp_cmdshell。
此场景中的步骤是:
这出乎我的意料。我不希望只有 db_owner 的用户能够实现这一点。(显然假设系统管理员已经启用了 xp_cmdshell。)
当数据库所有者从 sa 更改为另一个低特权登录名时,用户存储过程将不再能够调用 xp_cmdshell。
USE MASTER;
CREATE DATABASE testdb;
CREATE LOGIN testuser WITH PASSWORD = 'password', CHECK_POLICY=OFF;
CREATE LOGIN dummyuser WITH PASSWORD = 'password', CHECK_POLICY=OFF;
SELECT * from sys.credentials WHERE NAME LIKE '%cmdshell%';
-- returned: 101 ##xp_cmdshell_proxy_account## .....
USE testdb;
EXEC sp_changedbowner 'sa';
CREATE USER testuser FOR LOGIN testuser;
ALTER ROLE db_owner ADD MEMBER testuser;
EXECUTE AS …
Run Code Online (Sandbox Code Playgroud)