Hallo,
Du musst den Inhalt von ADOQuery1.FieldByName('objectSid').AsString byteweise lesen und nicht jeweils zwei Byte.
Der String ist 28 Zeichen lang. Die Art, wie ich es gelesen habe führt zum gleichen Ergebnis, das ich auch erhalte, wenn ich mir die ObjectSid per
LDAP-Browser ausgeben lasse.
Bei Deiner Methode gehst Du her und nimmst jeweils zwei Byte um daraus eine "Hexwert" zu machen, dies ist in dem Zusammenhang nicht zielführend. Wenn Du die SID als Hexwert haben möchtest, musst Du
jedes Byte in einen Hexadezimalwert umwandeln.
Also, was musst Du machen?
Code:
Die Sid zeichenweise lesen: Copy(sField,i,1)[1]
von jedem Zeichen benötigst Du den Ordinalwert: Ord(Copy(sField,i,1)[1])
Den Ordinalwert wandelst Du mit IntToHex(Ord(Copy(sField,i,1)[1]),2) in einen zwei Zeichen langen Hexadezimalwert um.
Eventuell wird es im folgenden Quelltext ja etwas deutlicher:
Delphi-Quellcode:
Var
i : integer;
b : Byte;
ch : Char;
sField : String;
sHex : String;
sSid : String;
begin
sField := ADOQuery1.FieldByName('objectSid').AsString;
sSid := '';
for i := 1 to Length(sField) do begin
ch := Copy(sField,i,1)[1];
// ch := sField[i]; // <-- wäre auch eine Möglichkeit.
b := Ord(ch);
sHex := IntToHex(b,2);
sSid := sSid + sHex + ' ';
// sSid := sSid + '$' + sHex; // <-- wenn's denn mit $ vorneweg sein soll.
end;
showmessage(sSid);
end;