1

我正在尝试编写一个 Java 应用程序来显示来自 SSRS 2012 的报告。我设置了我的 Web 服务代理,并且我有这个代码来尝试登录到服务器:

try
{
    ReportExecutionServiceSoapStub service = getService();
    System.out.println("ADP1N: Test.main, Checkpoint Bravo...");
    service.logonUser("CAMPUSAD/<username>", "<password>", "");
} catch (Exception e)
{
    e.printStackTrace();
}

但我不断收到此错误:

Apr 29, 2013 3:29:32 PM org.apache.commons.httpclient.HttpMethodDirector authenticate
SEVERE: Credentials cannot be used for NTLM authentication:         org.apache.commons.httpclient.UsernamePasswordCredentials
org.apache.commons.httpclient.auth.InvalidCredentialsException: Credentials cannot be used for NTLM authentication: org.apache.commons.httpclient.UsernamePasswordCredentials
at org.apache.commons.httpclient.auth.NTLMScheme.authenticate(NTLMScheme.java:331)
at org.apache.commons.httpclient.HttpMethodDirector.authenticateHost(HttpMethodDirector.java:281)
at org.apache.commons.httpclient.HttpMethodDirector.authenticate(HttpMethodDirector.java:233)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:169)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
at org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:196)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceSoapStub.logonUser(ReportExecutionServiceSoapStub.java:1893)
at Test.main(Test.java:29)
Apr 29, 2013 3:29:32 PM org.apache.commons.httpclient.HttpMethodDirector processWWWAuthChallenge
INFO: Failure authenticating with NTLM <any realm>@ais-fgnk3k1:80
AxisFault
 faultCode: {http://xml.apache.org/axis/}HTTP
 faultSubcode: 
 faultString: (401)Unauthorized
 faultActor: 
 faultNode: 
 faultDetail: 
    {}:return code:  401

    {http://xml.apache.org/axis/}HttpErrorCode:401

(401)Unauthorized
    at org.apache.axis.transport.http.CommonsHTTPSender.invoke(CommonsHTTPSender.java:218)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at com.microsoft.schemas.sqlserver._2005._06._30.reporting.reportingservices.ReportExecutionServiceSoapStub.logonUser(ReportExecutionServiceSoapStub.java:1893)
    at Test.main(Test.java:29)

我什至尝试了这段代码并得到了相同的结果:

ExecutionInfo info = service.loadReport("http://usys-dbd1.dev.ais.msu.edu/ReportServer/Pages/ReportViewer.aspx?%2fUSYS%2fAdvisor+Scheduling%2fAdvisor_Scheduling_Report&amp;rs:Command=Render", null);

我的 rsreportserver.config 文件具有以下身份验证条目:

<Authentication>
    <AuthenticationTypes>
         <RSWindowsNegotiate />
         <RSWindowsKerberos />
         <RSWindowsNTLM />
    </AuthenticationTypes>
    <RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel>
    <RSWindowsExtendedProtectionScenario>Proxy</RSWindowsExtendedProtectionScenario>
    <EnableAuthPersistence>true</EnableAuthPersistence>
</Authentication>

我不确定我在这里做错了什么。

4

2 回答 2

1

如果您从 Windows 7 调用报告,您可能必须使用 NTLM V2 身份验证,如下所述。我们已经实现了相同的逻辑(仅删除了日志)并且能够解决问题。

http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html

于 2014-10-04T21:10:27.540 回答
1

没有看到“GetService()”方法是什么,并且您需要做一些事情来对服务进行身份验证。我首先会看看您是否可以使用您知道对相关站点具有管理员权限的用户在本地测试一些代码。我已经编写了与 SSRS 对话的代码,但仅限于 C# .NET,但我不确定 Java。现在,我知道有几种传统方式可以从 SSRS 获取数据:

  1. 只需直接从 web 服务查看 URL:http:// (servername)/ReportServer/Pages/ReportViewer.aspx(Path)&rs:Command=Render

  2. 从 Web 服务填充 HTML 表单对象。I 与上述类似,但:

    <form id="ssrsform" action="(link above or similar)" method="post" target="_self" >
     .....(options and settings)....
    </form>
    
  3. 创建一个具有“报告”控件的 .NET 项目,您可以直接联系 SSRS 服务器,而不是在选项下拥有本地报告。

  4. 完全在代理类的代码中创建服务器 RDL 对象:我在这里有另一个线程:Programmatically Export SSRS report from sharepoint using ReportService2010.asmx关于如何使用 C# 和 .NET,其中一些可能适用于 Java但我不确定。关键部分是测试这个顶部:

    ReportExecutionService rs = new ReportExecutionService();
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
    rs.Url = "http://myserver/reportserver/ReportExecution2005.asmx";
    

如果你想走那条路,你需要有一个代理类或 Web 服务,通常是调用 SSRS 服务器。您需要通过身份验证。您需要确保您联系的是正确的点,否则它只会挂断您的电话。

编辑 5-3-13:

在我所知道的版本 2008、2008 R2、2012(从未在 2005 年使用过 SSRS)的大多数原生模式下的托管报告解决方案中,您应该在下图中显示的下拉列表中的“C”部分看到类似于下面的内容。如果您说您的凭据在报告中,那么即使它们被托管,您也应该能够更改它们。SSRS 的 Web 服务与它的数据库联系,该数据库包含您的所有设置,您可以在部署后自由更改它们。这是我真正喜欢 SSRS 的一件事,如果是一个小改动,您可以更改托管对象,而不必重新部署该对象。问题似乎是提示您,并且在我所见过的每种情况下,当设置“运行报告的用户提供的凭据”选项而不是存储凭据时,这是默认行为。

但是,如果未设置其他设置,您可能无法看到这些设置。如果您只是一个浏览器,则您无权更改内容。如果您没有看到设置,那是大部分问题,因为您无法设置它们。首次设置 SSRS 时,第一步是让默认管理员进入本地安装的 Web 位置并设置需要管理员访问权限的用户。通常你进入站点设置,添加一个“系统管理员”,然后 SSRS 在它的荣耀中有另一个安全设置,用于在“文件夹设置”上实际遍历对象。您还需要设置这些安全设置。您需要确保您的代理帐户拥有“内容管理员”权限(或者如果您严格,内容管理员权限可能较低,内容管理员是最高权限)。老实说SSRS'

一般来说,权限继承树结构,如果您在名为“report1.rdl”的“报告”下发布报告,通常是 Home/Reports/report1.rdl,您有权查看主文件夹、报告文件夹和报告对象。但是...管理员可以覆盖此链的任何部分并破坏它。在我工作的公司里,我继承了一个意大利面条式的混乱,每次都设置一个对象,因为他们没有正确设置 AD 组,并且一次在一个组织单元结构中做一个目录中的所有事情。如果你很了解 TSQL,你可以通过 Sql management Studio 直接从数据库结构中查询权限,数据库的默认值为“ReportServer”,我相信大多数对象所在的表是 CATALOG。

这是一张用于更好解释的图片,我认为显示的环境是 SSRS 2008R2,但 2008 和 2012 非常相似。 在此处输入图像描述

于 2013-04-29T20:29:18.153 回答