Ein Hallo in die Runde
.
Manchmal bin ich echt kurz davor, wahnsinnig zu werden
. Ich bin gerade dabei, mit der
Unit LsaApi von
Colin Wilson rumzuprobieren, um Funktionen wie
LsaEnumerateAccountRights,
LsaAddAccountRights usw. benutzen zu können. Für 32 Bit funktioniert alles einwandfrei, sogar mit
Unicode und so. Kompiliere ich die Geschichte mit XE2 für 64 Bit, bekomme ich immer beim Aufruf der Funktion LsaOpenPolicy eine Zugriffsverletzung in ntdll.dll (beim Lesen von Adresse 16x F).
Bei der Suche nach einer Lösung bzw. möglichen Ursache, stieß ich auf
diesen Thread bei StackOverflow, in dem unter anderem die Tatsache bemängelt wird, dass die Records in der
Unit LsaApi als packed deklariert sind. Also habe ich dieses Statement von allen Records entfernt, aber der Fehler bleibt. Ich komme im Code noch nicht einmal so weit wie der dortige Fragesteller, denn schon das LsaOpenPolicy ist das Problem.
Delphi-Quellcode:
uses LsaApi;
function GetDomainName:
string;
var
Buffer: Pointer;
Status: NTStatus;
PolicyHandle: LSA_HANDLE;
ComputerName: TLsaUnicodeStr;
Attributes: TLsaObjectAttributes;
PolicyAccountDomainInfo: PPolicyAccountDomainInfo;
begin
ComputerName := TLsaUnicodeStr.CreateFromStr('
');
try
FillChar(Attributes, SizeOf(Attributes), 0);
Status := LsaOpenPolicy(ComputerName.Value, Attributes,
POLICY_VIEW_LOCAL_INFORMATION, PolicyHandle);
if Status <> STATUS_SUCCESS
then
raise Exception.Create('
LsaOpenPolicy Failed: ' +
SysErrorMessage(LsaNtStatusToWinError(Status)));
try
Status := LsaQueryInformationPolicy(PolicyHandle,
PolicyPrimaryDomainInformation, Buffer);
if Status <> STATUS_SUCCESS
then
raise Exception.Create('
LsaQueryInformationPolicy Failed: ' +
SysErrorMessage(LsaNtStatusToWinError(Status)));
try
PolicyAccountDomainInfo := Buffer;
Result := PolicyAccountDomainInfo.DomainName.Buffer;
finally
LsaFreeMemory(Buffer)
end;
finally
LsaClose(PolicyHandle)
end;
finally
ComputerName.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(GetDomainName);
end;
Kann mir jemand sagen, wo das Problem liegt? Hab ich mal wieder was übersehen? Hinweis: Ich möchte, sofern möglich, auf die bei StackOverflow genannte Alternative JwaNtSecApi verzichten, weil das wieder weitere Abhängigkeiten nach sich zieht.
MfG Dalai