The function GetLogonSid takes a hToken as first parameter. Why not pass it the token from some exe (say explorer.exe) that run's in the user's context?
Or maybe my alternative GetLogonSid, that should probably work in case of in interactive service (pre-vista). Or maybe it can be adapted to acquire the right hWinstation somehow...
Delphi-Quellcode:
// Alternative way to get the Logon Sid
procedure GetLogonSid(var LogonSid: pSid);
var hWinstation: HWINSTA;
dwSize : Cardinal;
begin
// Open the WindowStation
hWinstation := OpenWindowStation('winsta0', False, READ_CONTROL);
if hWinstation = 0 then
begin
ShowMessageFmt('OpenWindowStation: %s', [SysErrorMessage(GetLastError)]);
Exit;
end;
// GetUserObjectInformation returns required size in dwSizeNeeded
if not GetUserObjectInformation(hWinStation, UOI_USER_SID, nil, 0, dwSize) then
begin
// GetUserObjectInformation returns required size
GetMem(LogonSid, dwSize + 1);
if not GetUserObjectInformation(hWinStation, UOI_USER_SID, LogonSid, dwSize, dwSize) then
begin
ShowMessageFmt('GetUserObjectInformation: %s', [SysErrorMessage(GetLastError)]);
Exit;
end;
end;
// Cleanup
CloseWindowStation(hWinStation);
end;
I got some other ideas but I have to look into that (will be continued)