执行 xp_cmdshell 权限授权
USE master;
GO
/* — 如果没有 xp_cmdshell 代理帐户, 则会收到下面的错误信息, 可以参考注释中的代码来创建代理帐户
–消息 15153,级别 16,状态 1,过程 xp_cmdshell,第 1 行
–xp_cmdshell 代理帐户信息无法检索或无效。请验证 ‘##xp_cmdshell_proxy_account##’ 凭据存在并且包含有效的信息。
USE master;
GO
DECLARE
@user sysname,
@password sysname,
@sql varchar(1000);
SELECT
@user = N’XpCmdAccount’,
@password = N’P@ssw0rd.’,
@sql = ‘NET USER “‘ + @user + ‘” “‘ + @password + ‘” /ADD’;
print @sql
EXEC sys.xp_cmdshell @sql;
SELECT
@user = CONVERT(sysname, SERVERPROPERTY(N’MachineName’))
+ N’\’ + @user
EXEC sp_xp_cmdshell_proxy_account @user, @password
GO
– */
– 1. 具有执行 xp_cmdshell 权限的登录
USE master;
GO
– 1.a. 建立登录
CREATE LOGIN Cmd_Login
WITH PASSWORD = N’Pwd.123′,
CHECK_POLICY = OFF;
GO
– 1.b. 这个登录是内置的, 不允许登录, 这样可以减少安全隐藏
DENY CONNECT SQL
TO Cmd_Login;
GO
– 1.c. 因为要调用 xp_cmdshell , 所以在 master 中要有用户, 并具有权限
CREATE USER Cmd_Login
FOR LOGIN Cmd_Login
WITH DEFAULT_SCHEMA = dbo;
GRANT EXECUTE ON sys.xp_cmdshell
TO Cmd_Login;
GO
– 2. 用户数据库
USE tempdb;
GO
– 2.a 为执行 xp_cmdshell 权限的登录建立用户
CREATE USER Cmd_Login
FOR LOGIN Cmd_Login
WITH DEFAULT_SCHEMA = dbo;
GO
– 2.b 测试存储过程
CREATE PROC dbo.p
WITH EXECUTE AS N’Cmd_Login’ — 指定存储过程的执行时的上下文
AS
EXEC master.sys.xp_cmdshell ‘dir c:\’
GO
– 3. 调用存储过程的普通登录
USE master;
GO
– 3.a 登录
CREATE LOGIN test
WITH PASSWORD = N’abc.123′,
CHECK_POLICY = OFF;
GO
– 3.b 数据库用户
USE tempdb;
GO
CREATE USER test
FOR LOGIN test;
GO
– 3.c 执行存储过程的权限
GRANT EXECUTE ON dbo.p
TO test;
GO
– 3.d 执行测试
EXECUTE AS LOGIN = N’test’;
GO
EXEC dbo.p;
GO
REVERT;
GO
– 4. 删除测试
DROP PROC dbo.p;
DROP USER test;
DROP USER Cmd_Login;
USE master;
DROP LOGIN test;
DROP USER Cmd_Login;
DROP LOGIN Cmd_Login;
GO
浙公网安备 33010602011771号