powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вызов msdb.dbo.sp_send_dbmail под фикс. логином
11 сообщений из 11, страница 1 из 1
вызов msdb.dbo.sp_send_dbmail под фикс. логином
    #39919369
Здравствуйте!
Подскажите, в чем может быть причина отказа вызова 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
вызов msdb.dbo.sp_send_dbmail под фикс. логином
    #39919398
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно потому, что у Domen\User1 нет прав на запуск sp_send_dbmail
...
Рейтинг: 0 / 0
вызов msdb.dbo.sp_send_dbmail под фикс. логином
    #39919416
KRS544,
Код: sql
1.
2.
USE msdb
GRANT EXECUTE ON msdb.dbo.sp_send_dbmail to [Domen\User1] ;



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

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

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

Ну или если хотите дырок в безопасности то сделайте базу trustworthy. Логин также должен быть отмаплен в мсдб, у владельца вашей бд должно быть право authenticate
...
Рейтинг: 0 / 0
вызов msdb.dbo.sp_send_dbmail под фикс. логином
    #39919423
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
вызов msdb.dbo.sp_send_dbmail под фикс. логином
    #39919425
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И уберите WITH EXECUTE AS 'Domen\User1' в процедуре, уже не нужно

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

справку же читать - для слабаков. Поищите DatabaseMailUserRole.
...
Рейтинг: 0 / 0
вызов msdb.dbo.sp_send_dbmail под фикс. логином
    #39919440
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
вызов msdb.dbo.sp_send_dbmail под фикс. логином
    #39919447
KRS544

а так

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

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


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

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

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


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