Das Notes Forum

Domino 9 und frühere Versionen => ND6: Administration & Userprobleme => Thema gestartet von: Glombi am 06.05.04 - 21:27:24

Titel: ACL Protokoll löschen
Beitrag von: Glombi am 06.05.04 - 21:27:24
Kennt jemand ein (kostenloses) Tool oder hat einer ein API-Programm
 in der Schublade, mit dem man das Protokoll einer ACL, aber nicht die ACL löschen kann?

Andreas
Titel: Re:ACL Protokoll löschen
Beitrag von: TMC am 06.05.04 - 21:33:53
Protokoll-Löschung geht imho nur über Copy Database, da dies massiv in die DB eingreift.
Wäre aber auch auf eine Software-Lösung gespannt  :)
Wobei ich mir nicht wirklich vorstellen kann dass es da was gibt - es sei denn von IRIS.
Titel: Re:ACL Protokoll löschen
Beitrag von: Glombi am 06.05.04 - 21:41:32
Ich habe natürlich vorher gegoogelt und auch die LDD durchsucht, aber nichts gefunden.

Das kopieren der ACL über den Admin Client kopiert leider auch immer das ACL Log mit.

Ich habe eine Datenbank mit diversen Gruppen, Personen und Rollen und möchte eine neue Datenbank erstellen, ohne dass das Log dabei ist.

Mit Script geht es nicht. Mit der API wohl auch nicht, jedenfalls habe ich in der C-API Dokumentation für Notes nichts dazu gefunden (nur STATUS LNPUBLIC ACLGetHistory).

Mit NotesPeek kann ich die ACL History sehen, also geht es wohl irgendwie...

Andreas
Titel: Re:ACL Protokoll löschen
Beitrag von: koehlerbv am 06.05.04 - 21:43:55
Da ist IRIS davor, dass man solche Features aushebelt ... Schlechte Karten für sowas !
Ich kann mir auch kaum vorstellen, dass die API da was hergibt. IRIS wird sich kaum so eine (Sicherheits-)Blösse geben.

Bernhard
Titel: Re:ACL Protokoll löschen
Beitrag von: Glombi am 06.05.04 - 21:55:00
Nun ja, es geht halt mit roher Gewalt  ;D

In R5 werden nur die letzten 20 Änderungen protokolliert. Das folgende Script schreibt 20 Dummy-Einträge und löscht diese wieder:

Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim acl As NotesACL
   Dim entry As NotesACLEntry
   
   Dim i As Integer
   
   Set db = session.CurrentDatabase
   If Not ( db.IsOpen ) Then
      Call db.Open( "", "" )
   End If
   Set acl = db.ACL
   
   For i = 1 To 20
      Set entry = New NotesACLEntry( acl, " ", ACLLEVEL_NOACCESS )
      Call acl.Save
      
      Set entry = acl.GetEntry( " " )
      Call entry.Remove
      Call acl.Save
   Next

Es steht zwar was in der Historie, aber damit kann ich leben.

In R6 gibt es wohl ein anderes Limit.

Andreas
Titel: Re: ACL Protokoll löschen
Beitrag von: 0xse am 04.09.09 - 01:53:35
Selbe Herausforderung, es soll die ACL Historie gelöscht werden. Hab mich die letzten paar Stunden mal ein wenig mit der Notes Dateistruktur beschäftigt und ein kleines C# Programm (Quick & Dirty) geschrieben, mit dem sich die Historie der ACL sauber löschen läßt. Hier der Auszug des Hauptteils.

Code
String infile = "C:\\Programme\\lotus\\notes\\data\\3Test.nsf";

            Console.Write("Reading ");
            Console.WriteLine(infile);
            
            FileStream f = new FileStream(infile, FileMode.Open);

            int counter = 0, fstatus, indexhis, indexs1, indexs2,i;
            byte[] val = new byte[4096];
            String sval;
            Encoding enc = Encoding.Default;
                                 
            while (counter * 4096 + 4096 < f.Length)
            {
                fstatus = f.Read(val, 0, 4096);
                Console.Write("#");

                sval = enc.GetString(val);
                if ((indexhis = sval.IndexOf("IHAVETOKILLTHISHISTORY")) > 0)
                {
                    indexs1 = indexhis - 100 < 0 ? 0 : indexhis - 100;
                    indexs2 = 0;
                    while((indexs1 = sval.IndexOf("/20", indexs1 + 1, indexhis - indexs1)) > 0){
                        indexs2 = indexs1;
                    }

                    if (sval[indexs2 - 3] == '/')
                    {
                        indexs2 = indexs2 - 5;

                        Console.WriteLine("");
                        Console.Write("ACL history found at block ");
                        Console.Write(counter * 4096);
                        Console.Write(", subblock ");
                        Console.Write((indexhis - (indexhis % 1024)) / 1024);
                        Console.Write(", offset ");
                        Console.WriteLine(indexs2 % 1024);

                        indexs1 = sval.IndexOf("\0\0", indexs2);
                        Console.Write("length ");
                        Console.Write(indexs1 - indexs2);
                        Console.Write(" byte, overwriting...");

                        for (i = 0; i < 4096; i++)
                        {
                            val[i] = 0;
                        }

                        f.Seek(counter * 4096 + indexs2, SeekOrigin.Begin);
                        f.Write(val,0,indexs1-indexs2);

                        Console.WriteLine(" Done");
                        Console.WriteLine("");
                    }

                    break;
                }

                counter++;                
            }

            f.Close();

Notes ist eigentlich recht trivial gestrickt. Leider konnte ich im Header (lt. Filemon zieht sich Notes immer die ersten 1024 Byte als Meta Infos rein) keinen Offset dafür ausmachen. Im ACL Bereich auch nicht. Deswegen ist es jetzt so gelöst, dass man einen Benutzer "IHAVETOKILLTHISHISTORY" in der ACL hinterlegen muss. Das muss der aktuellste Eintrag sein! Dann sucht sich das Programm den Part raus, füllt ihn mit Nullen und Notes zeigt eine leere Historie.

Bisher nur getestet mit Notes 6 Datenbanken.

Problem gelöst, nachdem Google und sonst auch nix eine brauchbare Antwort geliefert haben. Viel Vergnügen bei der Verwendung.

LG, 0xse
Titel: Re: ACL Protokoll löschen
Beitrag von: 0xse am 04.09.09 - 11:35:17
Die Suche in der History in dem Block könnte man auch mit einem RegExp in der Art gestalten:

#([0-9]{2}/[0-9]{2}/[0-9]{4}(.*)\0)+\0#

Mal schauen, vlt stell ich da bald ein kleines Tool zu online.