Разрешение на изменение логинов (MS SQL 2005)
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Разрешение на изменение логинов (MS SQL 2005)... Expand / Collapse
Автор
Сообщение
11.07.2006 18:53


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Приветствую.

Ситуация следующая:

Есть сервер с несколькими БД.  Необходимо реализовать возможность программного создания/изменения логинов и юзеров для одной из БД. Притом делать это будет один из пользователей, т.е. человек с ограниченными правами на одну из баз.

Написан простую процедурку, добавляющую или же меняющую пароль юзера. Вид у процедурки следующий:

ALTER PROCEDURE [dbo].[sp_AddUserForUploadData]

@ID int,

@Password varchar(10)

WITH EXECUTE AS 'CleverUser'

AS

 

DECLARE @Login varchar(60), @SQL varchar(2048)

 

SET @Login='dlc' + (SELECT Login FROM cl_List WHERE ID=@ID)

 

IF @Login is null

BEGIN

      RAISERROR ('No Client found!', 16, 1)

      RETURN

END

 

BEGIN TRY

      BEGIN TRAN

      IF DATABASE_PRINCIPAL_ID(@Login) Is Null

      BEGIN

            SET @SQL=

                  'CREATE LOGIN ' + @Login + '

                  WITH

                  PASSWORD = ''' + @Password + ''',

                  CHECK_POLICY = OFF,

                  DEFAULT_DATABASE = DLC'

 

            EXEC (@Sql)

 

            SET @Sql=

                  'CREATE USER ' + @Login + '

                  FOR LOGIN ' + @Login + '

                  WITH DEFAULT_SCHEMA = dbo'

 

            EXEC (@Sql)

            EXEC sp_AddRoleMember 'Stat_Add', @Login

            UPDATE cl_List SET PrincipalID=DATABASE_PRINCIPAL_ID(@Login) WHERE ID=@ID

      END

      ELSE

      BEGIN

            SET @SQL=

                  'ALTER LOGIN ' + @Login + '

                  WITH

                  PASSWORD = ''' + @Password + ''''

 

            EXEC (@Sql)

      END

      COMMIT

END TRY

BEGIN CATCH

      ROLLBACK

      SELECT ERROR_MESSAGE()  

END CATCH

 

 

Заранее хочу предупредить, что о возможной уязвимости в виде SQL Injection атаки я знаю, сейчас не в этом дело.

Как можно видеть, процедура должна отрабатывать от юзера ClearUser. Этого юзера я специально создал для изменения логинов. В нем то и есть вся проблема. У юзера проставлены следующие разрешения на уровне сервера: Alter Any Credential, Alter Any Login. На уровне базы - db_accessadmin, db_securityadmin.

Однако процедура не может ни создавать, ни изменять, ни удалять логины, аргументируя это отсутствием прав.

Собственно вопрос - какие еще ему нужно поставить права, чтобы все нормально работало?

Сообщ. #900507
12.07.2006 11:06


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Дело, как оказалось, еще интереснее.

Если залогиниваюсь под этим самым юзером (CleverUser) и пытаюсь вызвать хранимку с закоментированной строкой Execute As, то работает без проблем.

Если же я ее раскомментирую (т.е. получается что, по идее, ничего не меняется - т.е. как бы Execute as Я), то не рабоатет - ругается на недостаток доступа.

Как такое может быть?

Сообщ. #900546
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 8:41