Используя веб-службу служб отчетов, как получить разрешения для конкретного пользователя? - PullRequest
2 голосов
/ 02 июня 2009

Используя SQL Server Reporting Services Web Service, как я могу определить разрешения конкретного пользователя домена для определенного отчета? Данный пользователь не является пользователем, который обращается к веб-службе.

Я получаю доступ к веб-службе, используя учетную запись службы домена (скажем, MYDOMAIN\SSRSAdmin), которая имеет полные разрешения в SSRS. Я хотел бы программно найти разрешения пользователя домена (скажем, MYDOMAIN\JimBob) для конкретного отчета.

Метод GetPermissions() в веб-службе вернет список разрешений, которыми обладает текущий пользователь (MYDOMAIN\SSRSAdmin), но это не то, что я ищу. Как я могу получить этот же список разрешений для MYDOMAIN\JimBob? У меня не будет пароля домена пользователя, поэтому использование его учетных данных для вызова метода GetPermissions() не вариант. Однако я получаю доступ к этому из учетной записи, которая имеет полные разрешения, поэтому я думаю, что теоретически информация должна быть доступна для нее.

Ответы [ 3 ]

2 голосов
/ 03 июня 2009

SSRS получает группы NT из пользовательского токена NT. Вот почему при добавлении в новую группу вы должны выйти из системы и снова войти в нее. То же самое относится к большинству проверок Windows (SQL Server, общие папки, NTFS и т. Д.).

Если вы знаете группу (ы) NT ...

Вы можете напрямую запросить базу данных ReportServer. Я почти напрямую извлек это из одного из наших отчетов, который мы используем для проверки безопасности папок (C.Type = 1). Фильтр по U.UserName.

SELECT
    R.RoleName,
    U.UserName,
    C.Path
FROM
    ReportServer.dbo.Catalog C WITH (NOLOCK)    --Parent
    JOIN
    ReportServer.dbo.Policies P WITH (NOLOCK) ON C.PolicyID = P.PolicyID
    JOIN
    ReportServer.dbo.PolicyUserRole PUR WITH (NOLOCK) ON P.PolicyID = PUR.PolicyID 
    JOIN
    ReportServer.dbo.Users U WITH (NOLOCK) ON PUR.UserID = U.UserID 
    JOIN
    ReportServer.dbo.Roles R WITH (NOLOCK) ON PUR.RoleID = R.RoleID
WHERE
    C.Type = 1 
0 голосов
/ 17 мая 2016

Надеюсь, это поможет вам начать. Я использую его при копировании структуры папок и отчетов со старого сервера на новый, когда я хочу «перенести» мои элементы SSRS из источника на конечный сервер. Это метод получения политик безопасности для элемента на одном сервере и затем установки политик безопасности для идентичного элемента на другом сервере после того, как я скопировал элемент с исходного сервера на целевой сервер. Вы должны установить свои собственные имена исходного и конечного серверов.

using System;

using System.Collections.Generic;
using System.Diagnostics;
using System.Web.Services.Protocols;    //<=== required for SoapException

namespace SSRS_WebServices_Utility
{
internal static class TEST
{


    internal static void GetPoliciesForAnItem_from_Source_ThenSetThePolicyForTheItem_on_Destination(string itemPath)
    {

        string sSourceServer = "SOURCE-ServerName";
        Source_ReportService2010.ReportingService2010 sourceRS = new Source_ReportService2010.ReportingService2010();
        sourceRS.Credentials = System.Net.CredentialCache.DefaultCredentials;
        sourceRS.Url = @"http://" + sSourceServer + "/reportserver/reportservice2010.asmx";


        string sDestinationServer = "DESTINATION-ServerName";
        Destination_ReportService2010.ReportingService2010 DestinationRS = new Destination_ReportService2010.ReportingService2010();
        DestinationRS.Credentials = System.Net.CredentialCache.DefaultCredentials;
        DestinationRS.Url = @"http://" + sDestinationServer + "/reportserver/reportservice2010.asmx";



        Boolean val = true;
        Source_ReportService2010.Policy[] curPolicy = null;
        Destination_ReportService2010.Policy[] newPolicy = null;
        try
        {

            curPolicy = new Source_ReportService2010.Policy[1];
            curPolicy = sourceRS.GetPolicies(itemPath, out val);        //e.g. of itemPath:  "/B2W/001_OLD_PuertoRicoReport"



            //DestinationRS.SetPolicies(itemPath, newPolicy);
            int iCounter = 0;
            //int iMax = curPolicy.Length;

            newPolicy = new Destination_ReportService2010.Policy[curPolicy.Length];
            foreach (Source_ReportService2010.Policy p in curPolicy)
            {
                //create the Policy
                Destination_ReportService2010.Policy pNew = new Destination_ReportService2010.Policy();
                pNew.GroupUserName = p.GroupUserName;
                pNew.GroupUserName = p.GroupUserName;
                Destination_ReportService2010.Role rNew = new Destination_ReportService2010.Role();
                rNew.Description = p.Roles[0].Description;
                rNew.Name = p.Roles[0].Name;

                //create the Role, which is part of the Policy
                pNew.Roles = new Destination_ReportService2010.Role[1];
                pNew.Roles[0]=rNew;
                newPolicy[iCounter] = pNew;
                iCounter += 1;

            }

            DestinationRS.SetPolicies(itemPath, newPolicy);

            Debug.Print("whatever");

        }
        catch (SoapException ex)
        {

            Debug.Print("SoapException: " + ex.Message);


        }
        catch (Exception Ex)
        {
            Debug.Print("NON-SoapException: " + Ex.Message);

        }

        finally
        {
            if (sourceRS != null)
                sourceRS.Dispose();
            if (DestinationRS != null)
                DestinationRS.Dispose();                    

        }
    }

}

}

Чтобы вызвать его, используйте следующее:

 TEST.GetPoliciesForAnItem_from_Source_ThenSetThePolicyForTheItem_on_Destination("/FolderName/ReportName");

Где вы должны указать собственное имя папки SSRS и имя отчета, т. Е. Путь к элементу.

На самом деле я использую метод, который перебирает все элементы в папке Destination, который затем вызывает метод следующим образом:

        internal static void CopyTheSecurityPolicyFromSourceToDestinationForAllItems_2010()
    {
        string sDestinationServer = "DESTINATION-ServerName";

        Destination_ReportService2010.ReportingService2010 DestinationRS = new Destination_ReportService2010.ReportingService2010();
        DestinationRS.Credentials = System.Net.CredentialCache.DefaultCredentials;
        DestinationRS.Url = @"http://" + sDestinationServer + "/reportserver/reportservice2010.asmx";

        // Return a list of catalog items in the report server database
        Destination_ReportService2010.CatalogItem[] items = DestinationRS.ListChildren("/", true);

        // For each FOLDER, debug Print some properties
        foreach (Destination_ReportService2010.CatalogItem ci in items)
        {
            {
                Debug.Print("START----------------------------------------------------");
                Debug.Print("Object Name:         " + ci.Name);
                Debug.Print("Object Type:         " + ci.TypeName);
                Debug.Print("Object Path:         " + ci.Path);
                Debug.Print("Object Description:  " + ci.Description);
                Debug.Print("Object ID:           " + ci.ID);
                Debug.Print("END----------------------------------------------------");
                try
                {
                    GetPoliciesForAnItem_from_Source_ThenSetThePolicyForTheItem_on_Destination(ci.Path);
                }
                catch (SoapException e)
                {
                    Debug.Print("SoapException START----------------------------------------------------");
                    Debug.Print(e.Detail.InnerXml);
                    Debug.Print("SoapException END----------------------------------------------------");

                }
                catch (Exception ex)
                {
                    Debug.Print("ERROR START----------------------------------------------------");
                    Debug.Print(ex.GetType().FullName);
                    Debug.Print(ex.Message);
                    Debug.Print("ERROR END----------------------------------------------------");
                }
            }
        }
    }
0 голосов
/ 04 апреля 2012

Изучите «Метод GetPolicies», который вы можете увидеть по следующей ссылке.

http://msdn.microsoft.com/en-us/library/reportservice2010.reportingservice2010.getpolicies.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...