Domino 9 und frühere Versionen > ND6: Administration & Userprobleme

ACL Protokoll löschen

<< < (2/2)

0xse:
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();
--- Ende Code ---

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

0xse:
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.

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln