2013-07-01 2 views
4

Я пытаюсь разрешить пользователю просматривать данные трассировки SQL Server из файла .trc без предоставления им ALTER TRACE разрешений (SQL Server 2008 R2). Таким образом, я завернул его в хранимой процедуре, используя мой сисадмин счет:SQL Server EXECUTE AS на FN_TRACE_GETTABLE

CREATE PROCEDURE test_trace 
as 
SELECT * FROM FN_TRACE_GETTABLE(N'C:\temp\trace1.trc', 1) 

Если я выполнить эту хранимую процедуру, используя мой сисадмин счет, он прекрасно работает, как ожидалось. Если я попытаюсь запустить это под учетной записью domain1 \ user1, она не запускается с ошибкой "You do not have permission to run 'FN_TRACE_GETTABLE'". Это снова ожидается.

Так что теперь я хочу, чтобы domain1\user1 запустить хранимую процедуру, так что я изменить хранимую процедуру для выполнения под сисадмином счетов:

CREATE PROCEDURE test_trace 
WITH EXECUTE AS 'domain1\sysadmin1' 
as 
SELECT * FROM FN_TRACE_GETTABLE(N'C:\temp\trace1.trc', 1) 

Теперь, когда я выполнить хранимую процедуру, я получаю "You do not have permission to run 'FN_TRACE_GETTABLE'" независимо от счет я его выполню! Я ожидал, что смогу выполнить его как по счетам , так и domain1\sysadmin1.

Может ли кто-нибудь помочь в том, что я пропустил? Моя цель - разрешить domain1\user1 читать trace1.trc файл без предоставления ALTER TRACE разрешений.

ответ

0

В соответствии с documentation вы можете указать только имя пользователя (базы данных) в execute as для хранимых процедур. Тем не менее, я думаю, что это должно нормально работать, но, пожалуйста, измените SP с учетной записью sysadmin и укажите EXECUTE AS SELF вместо имени пользователя.

Если это все еще не работает, попробуйте предоставить исполняющему пользователю права на чтение в файле трассировки, возможно, сервер игнорирует execute as для доступа к файлу (который я бы рассматривал как ошибку).

+0

«возможно, сервер игнорирует выполнение как для доступа к файлу (который я бы рассматривал как ошибку).': На самом деле ошибка была бы, если бы SQL Server мог каким-то образом чудесным образом вызвать токен доступа, даже не представляя пароль для локального авторитет безопасности ... так что нет, EXECUTE AS имеет абсолютно 0 (ноль) значение вне сферы самого SQL Server, и ОС никогда не доверяет ему. Если вы хотите получить доступ к внешнему ресурсу, вам нужно создать [ПОЛНОМОЧИЙ] (http://msdn.microsoft.com/en-us/library/ms189522.aspx) и указать, как вы ** должны ** предоставлять секрет (пароль учетной записи). –

2

Чтобы повысить привилегии контролируемым образом, необходимо использовать code signing. Хотя в контексте процедуры EXECUTE AS вы изолированы и не можете использовать привилегию на уровне сервера (например, разрешения, связанные с трассировкой), прочитайте Extending Database Impersonation by Using EXECUTE AS. Подписание кода - это правильное решение этой проблемы. См. full example here.

+0

Спасибо за ответы! @Yve - У меня есть имена серверов domain1 \ user1 и domain1 \ sysadmin1, сопоставленные с пользователями базы данных с тем же именем, поэтому это не имеет значения в этом случае. Я попробовал указать EXECUTE AS SELF, как вам было предложено, и получил тот же результат :-(Я также попытался дать полный контроль над файлом всем (чтобы устранить любые проблемы, связанные с разрешениями), и опять же никакой радости. @ Remus Rusanu - Спасибо за эти ссылки. Я искал более подробные сведения об этом, и это выглядит великолепно – user1577314

Смежные вопросы