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.
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