Kontakte anlegen mit C#

  • Ok, hier der Code.


    Ich habe eine Methode zur Initialiserung der Session.
    Hier öffne ich auch die DB und gebe sie zurück. Da das Thema mit dem Roaming interessant wurde, habe ich die Methode erweitert um einen Parameter, der aussagt, ob die lokale names.nsf oder die auf dem Server geöffnet werden soll.
    Dies geschieht in einer Klasse NotesTest:


    Code
    public class NotesTest{        public NotesTest()        {        }        public NotesDatabase InitSession(bool local)        {            NotesSession session = new NotesSession();            session.Initialize("passwort");            Console.WriteLine("session init");            NotesDatabase db;            if (!local) db = session.GetDatabase("CN=benutzer/O=organisation", @"roaming\TestUser\names.nsf", false);            else db = session.GetDatabase("", "names.nsf", false);            if (!db.IsOpen)            {                Console.WriteLine("db not opened");                db.Open();                Console.WriteLine("db opened now");            }            else Console.WriteLine("db already open");            return db;        }}


    In der Haupt Klasse des Programms initialisiere ich ein Objekt vom Typ NotesTest und rufe die Methode InitSession auf:


    Code
    class Program{        static void Main(string[] args)        {            NotesTest t1 = new NotesTest();            NotesDatabase db = t1.InitSession(false);            if (db!=null)   Console.WriteLine("db open");        }}


    Der Rest ist an der Stelle wohl eher unwichtig, weil das Program diese Codezeilen hier ja gar nicht überschreitet. Der Absturz passiert in der Methode InitSession, und da an der Stelle, an der ich


    Code
    db = session.GetDatabase("CN=benutzer/O=organisation", @"roaming\TestUser\names.nsf", false);


    aufrufe. Und wie schon erwähnt, wenn ich nicht names.nsf zu öffnen versuche, sondern bookmark.nsf, funktioniert es.


    Irgendwie komme ich an der Stelle nicht weiter.

    Nachtrag: Vor und nach TestUser ist jeweils ein "\", das hier allerdings nicht angezeigt wird.

  • Nein, das war leider nicht des Rätsels Lösung. Habe es gerade ausprobiert.
    Ohne das @-Zeichen meckert der Compiler, weil nicht richtig escaped wurde. Ich habe das @-Zeichen trotzdem mal weggelassen und innerhalb des Strings mit einem weiteren "\" escaped. Da kommt dann zwar kein Compilerfehler, aber eben wieder der Absturz.


    Allerdings hätte mich das auch ein wenig verwundert, wenn das an dem @-Zeichen gelegen hätte, denn die anderen Pfadangaben, die ich getestet hatte, funktionierten ja auch.


    Schade eigentlich, das wäre schön einfach gewesen :)

  • Zitat


    taurec schrieb:
    Und was soll das @-Symbol vor dem Pfad ?


    Das @-Symbol übergibt ein Stringliteral. Ist eine tolle Erfindung, damit man sich sauberes Programmieren nicht angewöhnen und mit Nichtigkeiten wie dem Escapen nicht belasten muss...


    Zitat


    taurec schrieb:
    Ja es kann trotzdem ein Zugriffsproblem sein, da der Zugriff auf das Mailfile nichts mit dem Zugriff auf andere Datenbanken zu tun hat.


    Das hier ist die spannende und immer noch nicht geklärte Frage.
    Es wundert mich zwar, dass kein vernünftiger Errorcode geworfen wird (analog zu Error und Err in LS), allerdings sehe ich auch nirgendwo Fehlerbehandlungsroutinen. Wenn ein Agent abraucht, ohne dass man explizit angibt, dass er wenigstens seine letzten Zuckungen noch mitteilt, dann sieht man auch nicht wesentlich mehr...

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Na ja, die Fehlerstelle an sich hatte ich ja schon lokalisiert, deswegen hatte ich keinen Try-Catch-Block.


    Hab jetzt mal einen Try-Catch-Block um die Anweisung, die meinen Code zum abschmieren bringt, gebaut. Viel schlauer bin ich da allerdings auch nicht geworden, denn sie bringt nix Neues mit sich:


    Zitat


    System.Runtime.InteropServices.COMException (0x80040FDC): User CN=myAdmin/O=organization cannot open database CN=domino/O=organization!!roaming\\TestUser\\names.nsf\r\n at Domino.NotesSessionClass.GetDatabase(String pServer, String pFile, Boolean bCreateonfail)\r\n...


    Was mir aufgefallen ist, sind allerdings diese 2 Ausrufezeichen zwischen "organization" und "roaming". Weiß nicht, ob das normal ist, dass die da auftauchen. Ich meine, aus welchem Grund fügt man die da ein, was machen die da?


    Hoffentlich seid ihr dadurch schlauer :)

  • Ein kleines Lichtlein ist mir grad noch aufgegangen:


    Wie ihr an der Meldung der Exception erkennen könnt, versuche ich mit dem Admin die names.nsf des TestUsers zu öffnen. Vielleicht - wie auch schon taurec vermutet hat - ist es wirklich ein Zugriffsproblem.


    Die Mail DB konnte ich öffnen, weil ich da expliziten Zugriff über die ACL vergeben hatte.
    Und wie ich gerade sehen konnte, kann man da nur Zugriff für "Mail, Calendar and To Do" vergeben, aber nicht für Kontakte.
    Muss/Kann man die Zugriffsberechtigung für Kontakte an anderer Stelle delegieren?

  • So, und nochmal ich.


    Habe es geschafft, dass mein Programm beim Zugriff auf die names.nsf auf dem Server nicht abschmiert.


    Habe das folgendermaßen gelöst:
    1. Zuerst habe ich die names.nsf auf dem Server geöffnet
    2. Unter File --> Database --> Access Control habe ich meinen Admin hinzugefügt
    3. Dabei habe ich ihm entsprechende Rechte zugewiesen
    4. Das war's


    Ich konnte jetzt auf die names.nsf des TestUsers auf dem Server zugreifen und dessen Kontakte auslesen.


    So, jetzt hoffe ich, dass auch der Rest klappt, also neuen Kontakt anlegen und so weiter.


    Ich danke euch erst mal für eure ausführliche Hilfe und Bemühungen.


    Falls was nicht klappen sollte, melde ich mich noch mal.


    Bis dann und Grüße,
    Stay

  • Die zwei Ausrufezeichen werden da nur als Trenner zwischen Servername und Dateipfad verwendet.


    Deine Fehlermeldung sagt jetzt ganz klar aus, daß dir der Zugriff fehlt und daher kommt dein Absturz zustande.


    Ich hab auch schon feststellen müssen, daß .NET relativ bescheiden auf Zugriffs- oder andere Probleme beim COM Zugriff reagiert und dann meistens die externe Applikation abschießt.
    Das ist nichts was direkt an Notes liegt. Hab ich auch schon mit Word und Excel hinbekommen.


    Den Zugriff kannst du nicht übers Mailfile einstellen, sondern musst du direkt über das lokale names.nsf des Users machen.

  • Ja, das dachte ich mir zwar, dass das Trennzeichen sein sollen, war mir aber nicht sicher, den Ausrufezeichen dazu zu benutzen finde ich irgendwie ungewöhnlich. Ausrufezeichen symbolisieren für mich eine Warnung.


    Zitat


    taurec schrieb:
    Ich hab auch schon feststellen müssen, daß .NET relativ bescheiden auf Zugriffs- oder andere Probleme beim COM Zugriff reagiert und dann meistens die externe Applikation abschießt.
    Das ist nichts was direkt an Notes liegt. Hab ich auch schon mit Word und Excel hinbekommen.


    Diese Erfahrung habe ich bisher noch nicht so gemacht.
    Aber wenn das tatsächlich so sein sollte, ist das ziemlich dürftig. Das sollte dann hoffentlich in .Net 3.0 verbessert sein.


    Zitat


    taurec schrieb:
    Den Zugriff kannst du nicht übers Mailfile einstellen, sondern musst du direkt über das lokale names.nsf des Users machen.


    Das hatte ich so versucht, aber die Einstellung galt dann auch nur dem lokalen names.nsf File, nicht aber der auf dem Server (was mich etwas gewundert hat, da es ja ein Replik ist und somit ein identisches Abbild sein sollte). Ich habe dann wie oben beschrieben, die Einstellungen am Replik auf dem Server verändert.

  • Wenn du es lokal einstellst müssen die Änderungen natürlich erst auf den Server repliziert werden bevor sie dort zur Verfügung stehen.
    Bei einem Roaming User geschieht das normalerweise beim Abmelden vom Notes Client

  • Ja, hast natürlich recht.
    Da ich die Änderung nicht gleich gesehen habe, habe ich das Replik auf dem Server gleich mitangepasst, was aber nicht nötig gewesen wäre. Aber ich dachte, die Einstellung wird nicht übernommen.
    War wohl zu ungeduldigt :)