【发布时间】:2011-05-17 13:15:15
【问题描述】:
我在 SSRS 中有一个非常简单的报告,它只是一个包含三列、对象名称、客户帐户和到期日期的表格。
在我的报告中,我包含一个按 UserID 的过滤器,以将数据限制为仅登录用户的客户帐户。
我将用户的客户帐户存储在一个带有域\别名 | 的简单表中从 SSIS 包填充的客户帐户字段。
当一个新的别名 |已输入客户帐户关联,我还想为此别名设置订阅报告,以便在更新时通知他们。
这可能吗?
我最近发现了Report Server Web Service,我认为这可能会有所帮助。我可以在这里设置新订阅吗?理想情况下,当识别出新的客户帐户时,我想在我的 SSIS 包中调用它。
另外请注意,我不相信数据驱动订阅会起作用,原因如下:
1) 我正在使用 UserID 参数来过滤报告
2) 我希望用户能够在“我的订阅”下创建订阅后自行管理他们的订阅
更新
我已经能够使用网络服务成功地为我自己创建订阅(见下文),我仍在研究如何为其他用户完成此操作,尽管它看起来不太好:
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();
【问题讨论】:
-
是否可以在数据库表中添加条目来实现这一点?
标签: sql-server web-services authentication reporting-services impersonation