Subversion Repositories userdetect2

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit MiscUtils;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils,
  7.   Registry,
  8.   Windows,
  9.   Classes;
  10.  
  11. function GetUserName: string;
  12. function GetComputerName: string;
  13. function ExpandEnvironmentStrings(ATemplate: string): string;
  14. function GetHomeDir: string;
  15. function GetComputerSID: string;
  16. procedure EnvironmentStringsToStrings(outSL: TStrings);
  17.  
  18. implementation
  19.  
  20. function GetHomeDir: string;
  21. var
  22.   reg: TRegistry;
  23. begin
  24.   result := ExpandEnvironmentStrings('%HOMEDRIVE%%HOMEPATH%');
  25.   if result = '%HOMEDRIVE%%HOMEPATH%' then
  26.   begin
  27.     result := '';
  28.  
  29.     // Windows 95
  30.     reg := TRegistry.Create;
  31.     try
  32.       reg.RootKey := HKEY_CURRENT_USER;
  33.       if reg.OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\ProfileReconciliation') then
  34.       begin
  35.         result := reg.ReadString('ProfileDirectory');
  36.         reg.CloseKey;
  37.       end;
  38.     finally;
  39.       reg.Free;
  40.     end;
  41.   end;
  42. end;
  43.  
  44. function GetComputerName: string;
  45. // http://www.delphi-treff.de/tipps-tricks/netzwerkinternet/netzwerkeigenschaften/computernamen-des-eigenen-rechners-ermitteln/
  46. var
  47.   Len: DWORD;
  48. begin
  49.   Len := MAX_COMPUTERNAME_LENGTH+1;
  50.   SetLength(Result,Len);
  51.   if Windows.GetComputerName(PChar(Result), Len) then
  52.     SetLength(Result,Len)
  53.   else
  54.     RaiseLastOSError;
  55. end;
  56.  
  57. function ExpandEnvironmentStrings(ATemplate: string): string;
  58. var
  59.   buffer: array[0..MAX_PATH] of Char; // MAX_PATH ?
  60.   size: DWORD;
  61. begin
  62.   size := SizeOf(buffer);
  63.   ZeroMemory(@buffer, size);
  64.   Windows.ExpandEnvironmentStrings(PChar(ATemplate), buffer, size);
  65.   SetString(result, buffer, lstrlen(buffer));
  66. end;
  67.  
  68.  
  69.  
  70. // --- http://stackoverflow.com/a/7643383 ---
  71.  
  72. function ConvertSidToStringSid(Sid: PSID; out StringSid: PChar): BOOL; stdcall;
  73.   external 'ADVAPI32.DLL' name {$IFDEF UNICODE} 'ConvertSidToStringSidW'{$ELSE} 'ConvertSidToStringSidA'{$ENDIF};
  74.  
  75. function SIDToString(ASID: PSID): string;
  76. var
  77.   StringSid : PChar;
  78. begin
  79.   ConvertSidToStringSid(ASID, StringSid);
  80.   Result := string(StringSid);
  81. end;
  82.  
  83. function GetComputerSID:string;
  84. var
  85.   Sid: PSID;
  86.   cbSid: DWORD;
  87.   cbReferencedDomainName : DWORD;
  88.   ReferencedDomainName: string;
  89.   peUse: SID_NAME_USE;
  90.   Success: BOOL;
  91.   lpSystemName : string;
  92.   lpAccountName: string;
  93. begin
  94.   Sid:=nil;
  95.   try
  96.     lpSystemName:='';
  97.     lpAccountName:=GetComputerName;
  98.  
  99.     cbSid := 0;
  100.     cbReferencedDomainName := 0;
  101.     // First call to LookupAccountName to get the buffer sizes.
  102.     Success := LookupAccountName(PChar(lpSystemName), PChar(lpAccountName), nil, cbSid, nil, cbReferencedDomainName, peUse);
  103.     if (not Success) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  104.     begin
  105.       SetLength(ReferencedDomainName, cbReferencedDomainName);
  106.       Sid := AllocMem(cbSid);
  107.       // Second call to LookupAccountName to get the SID.
  108.       Success := LookupAccountName(PChar(lpSystemName), PChar(lpAccountName), Sid, cbSid, PChar(ReferencedDomainName), cbReferencedDomainName, peUse);
  109.       if not Success then
  110.       begin
  111.         FreeMem(Sid);
  112.         Sid := nil;
  113.         RaiseLastOSError;
  114.       end
  115.       else
  116.         Result := SIDToString(Sid);
  117.     end
  118.     else
  119.       RaiseLastOSError;
  120.   finally
  121.     if Assigned(Sid) then
  122.      FreeMem(Sid);
  123.   end;
  124. end;
  125.  
  126. procedure EnvironmentStringsToStrings(outSL: TStrings);
  127. var
  128.   DosEnv: PChar;
  129. begin
  130.   DosEnv := GetEnvironmentStrings;
  131.   try
  132.     while DosEnv^ <> #0 do
  133.     begin
  134.       outSL.Add(StrPas(DosEnv));
  135.       Inc(DosEnv, lStrLen(DosEnv) + 1);
  136.     end;
  137.   finally
  138.     FreeEnvironmentStrings(DosEnv);
  139.   end;
  140. end;
  141.  
  142. function GetUserName: string; // Source: Luckie@DP
  143. var
  144.   buffer: array[0..MAX_PATH] of Char; // MAX_PATH ?
  145.   size: DWORD;
  146. begin
  147.   size := SizeOf(buffer);
  148.   ZeroMemory(@buffer, size);
  149.   Windows.GetUserName(buffer, size);
  150.   SetString(result, buffer, lstrlen(buffer));
  151. end;
  152.  
  153. end.
  154.