Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit2;
- interface
- uses
- {$IF RTLVersion < 23.0}
- Windows, SysUtils;
- {$ELSE}
- Winapi.Windows, System.SysUtils;
- {$IFEND}
- function SidToUsername(const ASID: String): String;
- function UsernameToSid(const AUsername: String): String;
- implementation
- {$IF RTLVersion < 28.0}
- { Win32API ConvertStringSidToSid }
- {$IFNDEF Unicode}
- function ConvertStringSidToSid(StringSid: LPCSTR; var Sid: PSID): BOOL; stdcall; external advapi32 name 'ConvertStringSidToSidA';
- {$ELSE}
- function ConvertStringSidToSid(StringSid: LPCWSTR; var Sid: PSID): BOOL; stdcall; external advapi32 name 'ConvertStringSidToSidW';
- {$ENDIF}
- {$EXTERNALSYM ConvertStringSidToSid}
- { Win32API ConvertSidToStringSid }
- {$IFNDEF Unicode}
- function ConvertSidToStringSid(Sid: PSID; var StringSid: LPSTR): BOOL; stdcall; external advapi32 name 'ConvertSidToStringSidA';
- {$ELSE}
- function ConvertSidToStringSid(Sid: PSID; var StringSid: LPWSTR): BOOL; stdcall; external advapi32 name 'ConvertSidToStringSidW';
- {$ENDIF}
- {$EXTERNALSYM ConvertSidToStringSid}
- {$IFEND}
- {$IF RTLVersion < 19.0}
- { Win32API LookupAccountSid }
- {$IFNDEF Unicode}
- function LookupAccountSid(lpSystemName: LPCSTR; Sid: PSID;
- Name: LPSTR; var cbName: DWORD; ReferencedDomainName: LPSTR;
- var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountSidA';
- {$ELSE}
- function LookupAccountSid(lpSystemName: LPCWSTR; Sid: PSID;
- Name: LPWSTR; var cbName: DWORD; ReferencedDomainName: LPWSTR;
- var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountSidW';
- {$ENDIF}
- {$EXTERNALSYM LookupAccountSid}
- { Win32API LookupAccountName }
- {$IFNDEF Unicode}
- function LookupAccountName(lpSystemName, lpAccountName: LPCSTR;
- Sid: PSID; var cbSid: DWORD; ReferencedDomainName: LPSTR;
- var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountNameA';
- {$ELSE}
- function LookupAccountName(lpSystemName, lpAccountName: LPCWSTR;
- Sid: PSID; var cbSid: DWORD; ReferencedDomainName: LPWSTR;
- var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountNameW';
- {$ENDIF}
- {$EXTERNALSYM LookupAccountName}
- {$IFEND}
- function SidToUsername(const ASID: String): String;
- var
- PSID: Pointer;
- UserNameLen: DWORD;
- Domain: String;
- DomainLen: DWORD;
- SidName: SID_NAME_USE;
- begin
- PSID := nil;
- try
- if ConvertStringSidToSid(PChar(ASID),PSID) = False then
- begin
- RaiseLastOSError;
- end;
- UserNameLen := 0;
- DomainLen := 0;
- LookupAccountSid(nil,PSID,nil,UserNameLen,nil,DomainLen,SidName);
- if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
- begin
- RaiseLastOSError;
- end;
- SetLength(Result,UserNameLen);
- SetLength(Domain,DomainLen);
- if LookupAccountSid(nil,PSID,PChar(Result),UserNameLen,PChar(Domain),DomainLen,SidName) = False then
- begin
- RaiseLastOSError;
- end;
- SetLength(Result,StrLen(PChar(Result)));
- finally
- if PSID <> nil then
- begin
- {$IFNDEF WIN64}
- LocalFree(DWORD(PSID));
- {$ELSE}
- LocalFree(UInt64(PSID));
- {$ENDIF}
- end;
- end;
- end;
- function UsernameToSid(const AUsername: String): String;
- var
- PSID: Pointer;
- SidSize: DWORD;
- Domain: String;
- DomainLen: DWORD;
- SidName: SID_NAME_USE;
- SidStr: PChar;
- begin
- PSID := nil;
- SidStr := nil;
- try
- SidSize := 0;
- DomainLen := 0;
- LookupAccountName(nil,PChar(AUsername),nil,SidSize,nil,DomainLen,SidName);
- if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
- begin
- RaiseLastOSError;
- end;
- PSID := Pointer(LocalAlloc(LPTR,SidSize));
- SetLength(Domain,DomainLen);
- if LookupAccountName(nil,PChar(AUsername),PSID,SidSize,PChar(Domain),DomainLen,SidName) = False then
- begin
- RaiseLastOSError;
- end;
- ConvertSidToStringSid(PSID,SidStr);
- SetString(Result,SidStr,StrLen(SidStr));
- finally
- if PSID <> nil then
- begin
- {$IFNDEF WIN64}
- LocalFree(DWORD(PSID));
- {$ELSE}
- LocalFree(UInt64(PSID));
- {$ENDIF}
- end;
- if SidStr <> nil then
- begin
- {$IFNDEF WIN64}
- LocalFree(DWORD(SidStr));
- {$ELSE}
- LocalFree(UInt64(SidStr));
- {$ENDIF}
- end;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement