У меня есть очень простой отчет в SSRS, который представляет собой таблицу с тремя столбцами, именем объекта, учетной записью клиента и датой истечения срока действия.
В свой отчет я включил фильтр по идентификатору пользователя, чтобы данные ограничивались только зарегистрированными учетными записями пользователей.
Я храню учетные записи клиентов пользователя в простой таблице с доменом \ alias | поля учетной записи клиента, которые заполняются из пакета служб SSIS.
Когда новый псевдоним | введена связь с учетной записью клиента, я также хотел бы настроить подписку на отчет для этого псевдонима, чтобы они получали уведомление при его обновлении.
Возможно ли это?
Недавно я обнаружил веб-службу сервера отчетов и думаю, что это может помочь. Могу ли я настроить новые подписки здесь? В идеале я хотел бы позвонить по этому вопросу в моем пакете служб SSIS, когда будет идентифицирована новая учетная запись клиента.
Также обратите внимание, Я не верю, что управляемые данными подписки будут работать по нескольким причинам:
1) Я использую параметр UserID для фильтрации отчета
2) Я бы хотел, чтобы пользователи могли сами управлять своей подпиской после ее создания в разделе «Мои подписки»
UPDATE
Мне удалось успешно создать подписку для себя с помощью веб-службы (см. Ниже), и я все еще изучаю, как это можно сделать для других пользователей, хотя это выглядит не очень хорошо:
ReportingService2010SoapClient service = new ReportingService2010SoapClient();
service.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
TrustedUserHeader userHeader = new TrustedUserHeader();
string desc = "Send to Document Library";
string eventType = "TimedSubscription";
string scheduleXml =
@"<ScheduleDefinition>" +
" <StartDateTime>2010-11-30T08:00:00-08:00" +
" </StartDateTime>" +
" <WeeklyRecurrence>" +
" <WeeksInterval>1</WeeksInterval>" +
" <DaysOfWeek>" +
" <Monday>True</Monday>" +
" </DaysOfWeek>" +
" </WeeklyRecurrence>" +
"</ScheduleDefinition>";
ParameterValue[] extensionParams = new ParameterValue[4];
extensionParams[0] = new ParameterValue();
extensionParams[0].Name = "TO";
extensionParams[0].Value = "my alias";
extensionParams[1] = new ParameterValue();
extensionParams[1].Name = "IncludeReport";
extensionParams[1].Value = "FALSE";
extensionParams[2] = new ParameterValue();
extensionParams[2].Name = "IncludeLink";
extensionParams[2].Value = "TRUE";
extensionParams[3] = new ParameterValue();
extensionParams[3].Name = "Subject";
extensionParams[3].Value = "@ReportName was executed at @ExecutionTime";
string matchData = scheduleXml;
ExtensionSettings extSettings = new ExtensionSettings();
extSettings.ParameterValues = extensionParams;
extSettings.Extension = "Report Server Email";
string id;
service.CreateSubscription(userHeader, "/report path/report name",
extSettings, desc, eventType, matchData, null, out id );
Я хочу иметь возможность сделать что-то вроде следующего перед вызовом CreateSubscription, но я не могу сделать это без включения пароля пользователя.
NetworkCredential credentials = new NetworkCredential("alias", "", "userdomain");
service.ClientCredentials.Windows.ClientCredential = credentials;
или другой найденный вариант, который не требует пароля, но выдает исключение COM:
WindowsIdentity wi = new WindowsIdentity("alias@fqdn");
WindowsImpersonationContext ctx = null;
ctx = wi.Impersonate();