Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вызов msdb.dbo.sp_send_dbmail под фикс. логином / 11 сообщений из 11, страница 1 из 1
28.01.2020, 11:56
    #39919369
вызов msdb.dbo.sp_send_dbmail под фикс. логином
Здравствуйте!
Подскажите, в чем может быть причина отказа вызова msdb.dbo.sp_send_dbmail в хранимой процедуре (обертке)
с конструкцией WITH EXECUTE AS 'Domen\User1'?
У нас дано:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SELECT @@VERSION 
Microsoft SQL Server 2012 (SP4-GDR) (KB4057116) - 11.0.7462.6 (X64) 
	Jan  5 2018 22:11:56 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
 

USE myDb
ALTER PROCEDURE [dbo].[user_send_mail](@from_address varchar(64), @recipient varchar(2000), @subject nvarchar(255), @body nvarchar(max), @errnumber int OUTPUT, @errmsg nvarchar(2000) OUTPUT)
 -- WITH EXECUTE AS 'Domen\User1'
AS
BEGIN
	DECLARE @mail_id int
	SELECT @errnumber=0, @mail_id=0
	BEGIN TRY
		EXEC msdb.dbo.sp_send_dbmail 
			@profile_name = 'DbMail BOSS-1', 
			@recipients = @recipient,
			@from_address = @from_address,
			@subject = @subject,
			@body_format = 'TEXT',
			@body = @body,
			@mailitem_id = @mail_id OUTPUT
	END TRY

	BEGIN CATCH
		SELECT @errnumber=ERROR_NUMBER(), @errmsg=ERROR_MESSAGE()
	END CATCH
	RETURN @mail_id
END
go

USE msdb;
CREATE USER [Domen\User1] FOR LOGIN   [Domen\User1];
EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole', @membername = [Domen\User1] ;
GRANT EXECUTE ON msdb.dbo.sp_send_dbmail to [Domen\User] ;
go

User MyDb
declare @errnumber int, @errmsg nvarchar(2000)
execute [dbo].[user_send_mail] 'no_reply@Domen.ru', 'User1@Domen.ru', N'Тестовое сообщение' , N'--Тестовое сообщение--', @errnumber output,@errmsg output
SELECT @errnumber,@errmsg



Этот Скрипт работает. Письмо получено .

Мне надо дать права на отправку писем для других пользователей.
Для этого в процедуре обертке ставлю WITH EXECUTE AS
ALTER PROCEDURE [dbo].[user_send_mail]......
WITH EXECUTE AS 'Domen\User1'

И после этого , под ЛЮБЫМ пользователем (и админом тоже) получаю:
Код: sql
1.
The EXECUTE permission was denied on the object 'sp_send_dbmail', database 'msdb', schema 'dbo'.


В чем может быть причина отказа?
...
Рейтинг: 0 / 0
28.01.2020, 12:44
    #39919398
KRS544
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов msdb.dbo.sp_send_dbmail под фикс. логином
Вероятно потому, что у Domen\User1 нет прав на запуск sp_send_dbmail
...
Рейтинг: 0 / 0
28.01.2020, 13:10
    #39919416
вызов msdb.dbo.sp_send_dbmail под фикс. логином
KRS544,
Код: sql
1.
2.
USE msdb
GRANT EXECUTE ON msdb.dbo.sp_send_dbmail to [Domen\User1] ;



Результат без изменений.
Или это не те права?
И по прежнему каких-то прав не хватает?
...
Рейтинг: 0 / 0
28.01.2020, 13:11
    #39919417
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов msdb.dbo.sp_send_dbmail под фикс. логином
Александр М.,

Предложение with execute as процедуры это уровень базы данных а не сервера. Применяя такую конструкцию вы пойдете в msdb под учеткой гостя а не domain\user.

Легче всего в тпком случае использовать цифровую подпись процедуры чтобы прокинуть права на запуск

Ну или если хотите дырок в безопасности то сделайте базу trustworthy. Логин также должен быть отмаплен в мсдб, у владельца вашей бд должно быть право authenticate
...
Рейтинг: 0 / 0
28.01.2020, 13:14
    #39919423
KRS544
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов msdb.dbo.sp_send_dbmail под фикс. логином
Код: sql
1.
2.
3.
4.
5.
USE [msdb]
GO
CREATE USER [Domen\User1] FOR LOGIN [Domen\User1] WITH DEFAULT_SCHEMA=[dbo]
GO
GRANT EXECUTE ON msdb.dbo.sp_send_dbmail to [Domen\User1]


а так
...
Рейтинг: 0 / 0
28.01.2020, 13:15
    #39919425
KRS544
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов msdb.dbo.sp_send_dbmail под фикс. логином
И уберите WITH EXECUTE AS 'Domen\User1' в процедуре, уже не нужно

И да, trustworthy
...
Рейтинг: 0 / 0
28.01.2020, 13:24
    #39919427
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов msdb.dbo.sp_send_dbmail под фикс. логином
Александр М.,

справку же читать - для слабаков. Поищите DatabaseMailUserRole.
...
Рейтинг: 0 / 0
28.01.2020, 13:55
    #39919440
вызов msdb.dbo.sp_send_dbmail под фикс. логином
felix_ff

Предложение with execute as процедуры это уровень базы данных а не сервера. Применяя такую конструкцию вы пойдете в msdb под учеткой гостя а не domain\user.

Т.е. БЕЗ with execute as процедуры в msdb попадаю под логином domain\user1 и тогда у меня все работает.
А с этой включенной опцией уже как гость?

В процедуре обертке никак не получится использовать отдельно?
Код: sql
1.
2.
3.
EXECUTE AS login = [domain\user1]
.....
REVERT


Гляну в этом направлении. Если не получится , буду читать про " цифровую подпись процедуры чтобы прокинуть права на запуск "
...
Рейтинг: 0 / 0
28.01.2020, 14:13
    #39919447
вызов msdb.dbo.sp_send_dbmail под фикс. логином
KRS544

а так

Увы , нет
...
Рейтинг: 0 / 0
28.01.2020, 15:05
    #39919474
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов msdb.dbo.sp_send_dbmail под фикс. логином
Александр М.,

EXECUTE AS login = [domain\user1]
.....
REVERT


для такого у вас должно выполняться три условия:
у учетки которая исполняет данную инструкцию должно быть право impersonate на логин

что бы выйти из контекста базы у вас должно для вашей базы быть установлено trustworthy
что бы войти в базу в измененном контексте дополнительно должно у владельца вашей БД должно быть право authenticate на целевую базу или если целевой базой является master то authenticate server
...
Рейтинг: 0 / 0
31.01.2020, 19:06
    #39921135
вызов msdb.dbo.sp_send_dbmail под фикс. логином
felix_ff
Легче всего в таком случае использовать цифровую подпись процедуры чтобы прокинуть права на запуск

СПАСИБО!!!
А когда знаешь направление поиска, остальное уже легко.
Решение взято отсюда .
Вопрос закрыт.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вызов msdb.dbo.sp_send_dbmail под фикс. логином / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]