gigi300885
Goto Top

Abos SSRS via c sharp ändern

Hallo zusammen,

Folgendes Problem tut sich mir gerade auf.
Ich möchte die Ausführungszeit diverser Abos via c# ändern. Dazu berechnet das Programm den ersten Arbeitstag im Monat und soll diesen dann im Zeitplan der Abos eintragen. An diesem Punkt scheitert es leider. Der reportserver ist bereits als web Referenz eingebunden und die Daten der diversen subscriptions hole ich mir über die in der webreferenz verfügbaren getsubscriptions methode. Der Zeitplan ist in dem out Parameter matchdata enthalten. Jedoch sobald ich diesen änder funktioniert die Dateiablage des abos nicht mehr da anscheinend das Passwort für die Laufwerks Freigabe verloren geht. Hat jemand eine Idee wie man dieses Passwort bei der setsubscription Methode mitgeben kann?

Content-ID: 317176

Url: https://administrator.de/forum/abos-ssrs-via-c-sharp-aendern-317176.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

131026
131026 07.10.2016 aktualisiert um 22:46:27 Uhr
Goto Top
Moin,
wie wär's vielleicht erst mal mit den grundlegendsten Angaben von deiner Umgebung, dann wissen die Leute hier auch wovon und welchen Servern und Diensten du überhaupt sprichst face-confused

Kategorie: Entwicklung ... das kann viel bedeuten, sagt aber niente aus wovon du überhaupt sprichst, oder soll ich jetzt meinen Mentalo aus dem Keller kramen?


Gruß R.
gigi300885
gigi300885 10.10.2016 um 11:53:49 Uhr
Goto Top
ok ist evtl. etwas ungenau beschrieben.
Ich habe einen MS ReportingServer bei dem ein Bericht viele Abos enthält welche auf eine Dateiablage zugreifen und den Reports als Excel ablegen soll. Dies soll immer am ersten Arbeitstag des Monats geschehen. Da der Berichtserver keine Feiertage etc. kennt muss der Zeitplan monatlich angepasst werden. Da es sich um mehrere 100 Abos handelt soll dies durch eine c# Applikation automatisiert werden, welche den Zeitplan der Abos anpasst. Mittlerweile konnte ich dieses Problem lösen. Hier der Code falls jemand ebenfalls auf dieses Problem mal treffen sollte:
Die Funktion SetSubscription wird in einer foreach Schleife für die einzelnen Abos an andere Stelle aufgerufen:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RSSetShareSubscriptions.WebreferenzRS;
using System.Windows.Forms;

namespace RSSetShareSubscriptions
{
    class Reporting
    {
        ReportingService2010 rs;

        #region Parameters für GetsubScriptions

        ExtensionSettings extSettings;
        ActiveState actState;
        ParameterValue parValues;
        ParameterValue parNewValues;
        string strDesc;
        string strEventType;
        string strMatchData;
        string strStatus;

        #endregion

        public Reporting(string strUser, string strPass, string strDomain)
        {
            rs = new ReportingService2010();
            rs.Credentials = new System.Net.NetworkCredential(strUser, strPass, strDomain);
        }
        /// <summary>
        /// Update des Ausführungstages eines Abos
        /// </summary>
        public void SetSubscription(string strSubstricption, string strDay, string strPasswordShare)
        {
            rs.GetSubscriptionProperties(strSubstricption, out extSettings, out strDesc, out actState, out strStatus, out strEventType, out strMatchData, out parValues);

            // ===========================================================================================================
            // ###################### START: Passwort in die ExtensionSettings mit aufnehmen [GELÖST ]############################
            // ===========================================================================================================
            // Initialisiere neues ParameterArray welches ein Element mehr erfassen kann(für Passwort)
            int i = extSettings.ParameterValues.Length;
            parNewValues = new ParameterValue[i+1];

            // Kopiere die vorhandenen ParameterValues zum neue ParameterArray
            extSettings.ParameterValues.CopyTo(parNewValues, 0);

            // Füge Passwort mit an
            parNewValues[i] = new ParameterValue();
            parNewValues[i].Name = "PASSWORD";  
            parNewValues[i].Value = strPasswordShare;
            parNewValues[i].Label = null;

            // Erstelle neue ExtensionSettings inkl. des Passwortes
            ExtensionSettings extNewSettings = new ExtensionSettings();
            extNewSettings.ParameterValues = parNewValues;
            extNewSettings.Extension = extSettings.Extension;

            // ===========================================================================================================
            // ###################### ENDE: Problem Passwort in die ExtensionSettings mit aufnehmen [GELÖST] ############################
            // ===========================================================================================================

            // Ersetze den Ausführungstag in MatchData
            string strStartDay = "<Days>";  
            string strEndDay = "</Days>";  
            int iStartIndex = strMatchData.IndexOf(strStartDay);
            if (iStartIndex > 0)
            {
                iStartIndex = iStartIndex + strStartDay.Length;
                int iLength = strMatchData.IndexOf(strEndDay, iStartIndex);
                if (iLength > 0)
                {
                    iLength = iLength - iStartIndex;
                    strMatchData = strMatchData.Remove(iStartIndex, iLength);
                    strMatchData = strMatchData.Insert(iStartIndex, strDay);
                    rs.SetSubscriptionProperties(strSubstricption, extNewSettings, strDesc, strEventType, strMatchData, parValues);
                }
            }
        }
    }
}
131026
131026 10.10.2016 aktualisiert um 12:02:18 Uhr
Goto Top
Passwörter hinterlegt man niemals im Klartext in Code.

R.
gigi300885
gigi300885 10.10.2016 um 12:16:37 Uhr
Goto Top
Die Passwörter sind verschlüsselt in der Registry abgespeichert.
Die einzige Stelle wo das Passwort meines Wissens im Klartext übergeben werden muss ist hier:

parNewValues[i].Value = strPasswordShare;


Die Verschlüsselung des Passwortes auf seitens des Reportservers erfolgt dann durch den Methodenaufruf

rs.SetSubscriptionProperties(strSubstricption, extNewSettings, strDesc, strEventType, strMatchData, parValues);
131026
131026 10.10.2016 aktualisiert um 12:18:35 Uhr
Goto Top
Die einzige Stelle wo das Passwort meines Wissens im Klartext übergeben werden muss ist hier:
Einmal reicht schon . face-wink