zoukankan      html  css  js  c++  java
  • OA账号架构权限的问题

    用sa的账号执行也报错,提示为

    方案一:

    首先用sa开启OLE Automation Procedures

    sp_configure 'show advanced options', 1;

    GO

    RECONFIGURE;

    GO

    sp_configure 'Ole Automation Procedures', 1;

    GO

    RECONFIGURE;-----RECONFIGURE WITH OVERRIDE;

    GO

    最开始使用这个的时候也不行,因为是32位的数据库,重新安装64位数据库解决

    接着给账号开权限

    除了给存储过程所在的库的完全权限还需要master的权限,必须两种组合才能执行

    sp_configure 'show advanced options', 1;

    GO

    RECONFIGURE;

    GO

    sp_configure 'Ole Automation Procedures', 1;

    GO

    RECONFIGURE;

    GO

    EXEC sp_configure 'Ole Automation Procedures';

    GO

    方案二:在不提升用户权限的情况下,使普通用户执行sp_OACreate存储过程

     

    在论坛上遇到一个问题,询问如何使用一个普通用户调用一个存储过程,这个存储过程使用了sp_OACreate这一系列存储过程来执行一些非常规的任务。当然,前提是普通用户只有调用这个存储过程的时候才能获得执行sp_OACreate的权限。最初的时候也没有仔细考虑,心想,sp_OACreate需要具有sysadmin固定服务器角色的成员身份才能调用,那么直接在存储过程用EXECUTE
    AS LOGIN将会话的执行上下文设置了一个sysadmin固定服务器角色的成员就好了吧,于是给了一段T-SQL脚本。

    但随后发现是行不通的,如果要用EXECUTE AS LOGIN,调用者必须对要模拟的登录具有IMPERSONATE权限,但如果普通用户拿到了这个权限,则他可以随时使用EXECUTE
    AS LOGIN,没有达到“普通用户只有调用这个存储过程的时候才能获得执行sp_OACreate的权限”的控制目的。

     

    错误的解决办法

    USE master;

    GO

     

    -- 建立登录

    CREATE LOGIN OA_login

    WITH PASSWORD = N'Pwd.123',

        CHECK_POLICY = OFF;

    GO

     

    -- 授予权限

    EXEC sp_addsrvrolemember N'OA_login', N'sysadmin';

    GO

     

    -- 这个登录是内置的不允许登录这样可以减少安全隐藏

    DENY CONNECT SQL

        TO oa_login;

    GO

     

     

    -- 被调用的存储过程

    USE tempdb;

    GO

    CREATE PROC dbo.p

    AS

    EXECUTE AS LOGIN = N'OA_login' ;

     

    -- 调用sp_OACreate 代码

    --EXEC sp_OACreate;

     

    REVERT;

    GO

    当试图使用普通用户调用上面的存储过程的时候,会收到如下的错误信息。

    无法作为服务器主体执行,因为主体 "grant_login" 不存在、无法模拟这种类型的主体,或您没有所需的权限。

     

    正确的解决办法

    正确的解决办法是在通过存储过程的EXEUTE AS指定存储过程执行时的安全上下文,当然,这个被指定的用户要求能够调用sp_OACreate这一系列存储过程。

    -- 1. 具有执行sp_OA... 权限的登录

    USE master;

    GO

     

    -- 1.a. 建立登录

    CREATE LOGIN OA_login

    WITH PASSWORD = N'Pwd.123',

        CHECK_POLICY = OFF;

    GO

    -- 1.b. 这个登录是内置的不允许登录这样可以减少安全隐藏

    DENY CONNECT SQL

        TO OA_login;

    GO

    -- 1.c. 因为要使用sp_OA 这一系列的存储过程所以在 master 中要有用户并具有权限

    CREATE USER OA_login

    FOR LOGIN OA_login

    WITH DEFAULT_SCHEMA = dbo;

     

    GRANT EXECUTE ON sys.sp_OACreate

        TO OA_login;

       

    GRANT EXECUTE ON sys.sp_OADestroy

        TO OA_login;

       

    GRANT EXECUTE ON sys.sp_OAGetErrorInfo

        TO OA_login;

       

    GRANT EXECUTE ON sys.sp_OAGetProperty

        TO OA_login;

       

    GRANT EXECUTE ON sys.sp_OAMethod

        TO OA_login;

       

    GRANT EXECUTE ON sys.sp_OASetProperty

        TO OA_login;

       

    GRANT EXECUTE ON sys.sp_OAStop

        TO OA_login;

    GO

     

     

    -- 2. 用户数据库

    USE tempdb;

    GO

     

    -- 2.a 为执行sp_OA... 权限的登录建立用户

    CREATE USER OA_login

    FOR LOGIN OA_login

    WITH DEFAULT_SCHEMA = dbo;

    GO

     

    -- 2.b 测试存储过程

    CREATE PROC dbo.p

    WITH EXECUTE AS N'OA_login'  -- 指定存储过程的执行时的上下文

    AS

        DECLARE @object int;

        DECLARE @hr int;

        DECLARE @src varchar(255), @desc varchar(255);

       

        EXEC @hr = sp_OACreate 'ADODB.RecordSet', @object OUT;

        IF @hr <> 0

            GOTO lb_Err;

           

        EXEC @hr = sp_OAMethod @object, 'Open', NULL, 'SELECT
    ServerName = @@SERVERNAME',N'Provider=SQLOLEDB.1;Integrated Security=SSPI';

        IF @hr <> 0

            GOTO lb_Err;

           

        EXEC @hr = sp_OAMethod @object, 'GetRows';

        IF @hr <> 0

            GOTO lb_Err;

     

        EXEC @hr = sp_OADestroy @object;

        RETURN;

       

    lb_Err:

        BEGIN

           EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT ;

           RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc);

        END;

    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 OA_login;

     

    USE master;

    DROP LOGIN test;

    DROP USER OA_login;

    DROP LOGIN OA_login;

     

    补充说明

    多数情况下,数据库的所有者是sa一类的sysadmin固定服务器角色的成员,所以在这种情况下,也可以直接指定使用数据库所有者作为存储过程执行的安全上下文。

    USE tempdb;

    GO

    -- 2.b 测试存储过程

    CREATE PROC dbo.p

    WITH EXECUTE AS N'dbo'  -- 指定存储过程的执行时的上下文

    AS

        DECLARE @object int;

        DECLARE @hr int;

        DECLARE @src varchar(255), @desc varchar(255);

       

        EXEC @hr = sp_OACreate 'ADODB.RecordSet', @object OUT;

        IF @hr <> 0

            GOTO lb_Err;

           

        EXEC @hr = sp_OAMethod @object, 'Open', NULL, 'SELECT
    ServerName = @@SERVERNAME',N'Provider=SQLOLEDB.1;Integrated Security=SSPI';

        IF @hr <> 0

            GOTO lb_Err;

           

        EXEC @hr = sp_OAMethod @object, 'GetRows';

        IF @hr <> 0

            GOTO lb_Err;

     

        EXEC @hr = sp_OADestroy @object;

        RETURN;

       

    lb_Err:

        BEGIN

           EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT ;

           RAISERROR('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc);

        END;

    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;

     

    USE master;

    DROP LOGIN test;

     

    最后说明一点,要使用sp_OACreate这一系列存储过程,得将服务器的“Ole Automation Procedures”选项打开,参考如下的代码。

    EXEC sp_configure 'show advanced options', 1;

    RECONFIGURE;

     

    EXEC sp_configure 'Ole Automation Procedures', 1;

    RECONFIGURE;

     

    方案二转自http://blog.csdn.net/zjcxc/article/details/2935298

  • 相关阅读:
    二维码
    文件下载
    相对路径使用的特殊符号
    Httpclient的使用
    MySQL比like语句更高效的写法
    jQuery中turn.js(翻页效果)学习笔记
    如何在忘记mysql的登录密码时更改mysql登录的密码(window及linux)
    详细介绍svn在eclipse中的使用(附图解说明)
    Xshell6远程访问linux及Xftp6远程针对linux系统中文件操作(附图文详解)
    利用workbench对linux/Ubuntu系统中的mysql数据库进行操作
  • 原文地址:https://www.cnblogs.com/liu-shiliu/p/5549240.html
Copyright © 2011-2022 走看看