SQL Server EXECUTE AS ненадлежащее поведение

У меня есть пользователь, которому я предоставил доступ к учетным данным, используя:

GRANT ALTER ANY CREDENTIAL TO userA

Когда я вхожу в систему с этим пользователем, мне возвращаются следующие данные

SELECT * FROM sys.credentials

Я вижу, что у меня есть разрешение на уровне СЕРВЕРА. Это можно проверить, выполнив

SELECT * FROM fn_my_permissions (NULL, 'SERVER')

Используя другого пользователя, скажем, userB, я выдал себя за пользователя A, выполнив

GRANT IMPERSONATE ON USER::userA TO userB

В хранимой процедуре, когда я зарегистрирован как userB, я переключаю контекст на userA

EXECUTE AS user = 'userA'
SELECT user_name() AS ContextUserName
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
SELECT * FROM sys.credentials

SELECT * FROM fn_my_permissions (NULL, 'SERVER') не возвращает мне разрешение ALTER ANY CREDENTIAL.
SELECT * FROM sys.credentials не возвращает мне никаких значений.
SELECT user_name() однако возвращает мне userA.

Что я здесь пропустил? Почему я не могу вести себя как userA и получать данные из sys.credentials?

Спасибо!

2 ответа

Решение

Проблема, наверное, в том, что EXECUTE ASтолько предоставляет UserB разрешения UserA для базы данных, которую вы выполняете, но не разрешения, предоставленные на сервере. Вот почемуSELECT user_name() показывает UserA, но SELECT * FROM fn_my_permissions (NULL, 'SERVER') не показывает разрешения UserA, но разрешения UserB.

Документы Microsoft:

EXECUTE AS (Transact-SQL)"Область олицетворения ограничена текущей базой данных. Переключение контекста на пользователя базы данных не наследует разрешения уровня сервера этого пользователя".

sys.fn_my_permissions"SELECT * FROM fn_my_permissions(NULL, 'SERVER');возвращает список действующих разрешений вызывающего абонента на сервере".

Как сказал Матиас, я был Executing ASПОЛЬЗОВАТЕЛЬ, а не ВХОД. Мне пришлосьGRANT IMPERSONATE ON LOGIN:: чтобы это работало.

Другие вопросы по тегам