执行 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

posted @ 2014-05-08 10:26  OS.cn  阅读(1706)  评论(0)    收藏  举报