Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. unit Unit2;
  2.  
  3. interface
  4.  
  5. uses
  6. {$IF RTLVersion < 23.0}
  7. Windows, SysUtils;
  8. {$ELSE}
  9. Winapi.Windows, System.SysUtils;
  10. {$IFEND}
  11.  
  12. function SidToUsername(const ASID: String): String;
  13. function UsernameToSid(const AUsername: String): String;
  14.  
  15.  
  16. implementation
  17.  
  18. {$IF RTLVersion < 28.0}
  19. { Win32API ConvertStringSidToSid }
  20. {$IFNDEF Unicode}
  21. function ConvertStringSidToSid(StringSid: LPCSTR; var Sid: PSID): BOOL; stdcall; external advapi32 name 'ConvertStringSidToSidA';
  22. {$ELSE}
  23. function ConvertStringSidToSid(StringSid: LPCWSTR; var Sid: PSID): BOOL; stdcall; external advapi32 name 'ConvertStringSidToSidW';
  24. {$ENDIF}
  25. {$EXTERNALSYM ConvertStringSidToSid}
  26.  
  27. { Win32API ConvertSidToStringSid }
  28. {$IFNDEF Unicode}
  29. function ConvertSidToStringSid(Sid: PSID; var StringSid: LPSTR): BOOL; stdcall; external advapi32 name 'ConvertSidToStringSidA';
  30. {$ELSE}
  31. function ConvertSidToStringSid(Sid: PSID; var StringSid: LPWSTR): BOOL; stdcall; external advapi32 name 'ConvertSidToStringSidW';
  32. {$ENDIF}
  33. {$EXTERNALSYM ConvertSidToStringSid}
  34. {$IFEND}
  35.  
  36. {$IF RTLVersion < 19.0}
  37. { Win32API LookupAccountSid }
  38. {$IFNDEF Unicode}
  39. function LookupAccountSid(lpSystemName: LPCSTR; Sid: PSID;
  40. Name: LPSTR; var cbName: DWORD; ReferencedDomainName: LPSTR;
  41. var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountSidA';
  42. {$ELSE}
  43. function LookupAccountSid(lpSystemName: LPCWSTR; Sid: PSID;
  44. Name: LPWSTR; var cbName: DWORD; ReferencedDomainName: LPWSTR;
  45. var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountSidW';
  46. {$ENDIF}
  47. {$EXTERNALSYM LookupAccountSid}
  48.  
  49. { Win32API LookupAccountName }
  50. {$IFNDEF Unicode}
  51. function LookupAccountName(lpSystemName, lpAccountName: LPCSTR;
  52. Sid: PSID; var cbSid: DWORD; ReferencedDomainName: LPSTR;
  53. var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountNameA';
  54. {$ELSE}
  55. function LookupAccountName(lpSystemName, lpAccountName: LPCWSTR;
  56. Sid: PSID; var cbSid: DWORD; ReferencedDomainName: LPWSTR;
  57. var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE): BOOL; stdcall; external advapi32 name 'LookupAccountNameW';
  58. {$ENDIF}
  59. {$EXTERNALSYM LookupAccountName}
  60. {$IFEND}
  61.  
  62. function SidToUsername(const ASID: String): String;
  63. var
  64. PSID: Pointer;
  65. UserNameLen: DWORD;
  66. Domain: String;
  67. DomainLen: DWORD;
  68. SidName: SID_NAME_USE;
  69. begin
  70.  
  71. PSID := nil;
  72. try
  73. if ConvertStringSidToSid(PChar(ASID),PSID) = False then
  74. begin
  75. RaiseLastOSError;
  76. end;
  77.  
  78. UserNameLen := 0;
  79. DomainLen := 0;
  80. LookupAccountSid(nil,PSID,nil,UserNameLen,nil,DomainLen,SidName);
  81. if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
  82. begin
  83. RaiseLastOSError;
  84. end;
  85.  
  86. SetLength(Result,UserNameLen);
  87. SetLength(Domain,DomainLen);
  88. if LookupAccountSid(nil,PSID,PChar(Result),UserNameLen,PChar(Domain),DomainLen,SidName) = False then
  89. begin
  90. RaiseLastOSError;
  91. end;
  92.  
  93. SetLength(Result,StrLen(PChar(Result)));
  94.  
  95. finally
  96. if PSID <> nil then
  97. begin
  98. {$IFNDEF WIN64}
  99. LocalFree(DWORD(PSID));
  100. {$ELSE}
  101. LocalFree(UInt64(PSID));
  102. {$ENDIF}
  103. end;
  104. end;
  105.  
  106. end;
  107.  
  108. function UsernameToSid(const AUsername: String): String;
  109. var
  110. PSID: Pointer;
  111. SidSize: DWORD;
  112. Domain: String;
  113. DomainLen: DWORD;
  114. SidName: SID_NAME_USE;
  115. SidStr: PChar;
  116. begin
  117.  
  118. PSID := nil;
  119. SidStr := nil;
  120. try
  121. SidSize := 0;
  122. DomainLen := 0;
  123. LookupAccountName(nil,PChar(AUsername),nil,SidSize,nil,DomainLen,SidName);
  124. if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
  125. begin
  126. RaiseLastOSError;
  127. end;
  128.  
  129. PSID := Pointer(LocalAlloc(LPTR,SidSize));
  130. SetLength(Domain,DomainLen);
  131. if LookupAccountName(nil,PChar(AUsername),PSID,SidSize,PChar(Domain),DomainLen,SidName) = False then
  132. begin
  133. RaiseLastOSError;
  134. end;
  135.  
  136. ConvertSidToStringSid(PSID,SidStr);
  137. SetString(Result,SidStr,StrLen(SidStr));
  138.  
  139. finally
  140. if PSID <> nil then
  141. begin
  142. {$IFNDEF WIN64}
  143. LocalFree(DWORD(PSID));
  144. {$ELSE}
  145. LocalFree(UInt64(PSID));
  146. {$ENDIF}
  147. end;
  148.  
  149. if SidStr <> nil then
  150. begin
  151. {$IFNDEF WIN64}
  152. LocalFree(DWORD(SidStr));
  153. {$ELSE}
  154. LocalFree(UInt64(SidStr));
  155. {$ENDIF}
  156. end;
  157. end;
  158.  
  159. end;
  160.  
  161. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement