2009-06-24

【Delphi】檢查目前使用者是否為系統管理員

參考資料 ----
http://delphi.about.com/od/delphitips2007/qt/is_win_admin.htm

建立一個 unit
  1.  
  2. unit WindowsUser;
  3.  
  4. interface
  5. uses Windows;
  6.  
  7. // 檢查目前登入的使用者的系統管理員時, 則傳回 true
  8.  
  9. function IsWindowsAdmin: Boolean;
  10.  
  11. implementation
  12.  
  13. const
  14. SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)) ;
  15.  
  16. const
  17. SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  18. DOMAIN_ALIAS_RID_ADMINS = $00000220;
  19.  
  20.  
  21. function IsWindowsAdmin: Boolean;
  22. var
  23. hAccessToken: THandle;
  24. ptgGroups: PTokenGroups;
  25. dwInfoBufferSize: DWORD;
  26. psidAdministrators: PSID;
  27. g: Integer;
  28. bSuccess: BOOL;
  29. begin
  30. Result := False;
  31. bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken) ;
  32. if not bSuccess then
  33. begin
  34. if GetLastError = ERROR_NO_TOKEN then
  35. bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken) ;
  36. end;
  37.  
  38.  
  39. if bSuccess then
  40. begin
  41. GetMem(ptgGroups, 1024) ;
  42.  
  43. bSuccess := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize) ;
  44.  
  45. CloseHandle(hAccessToken) ;
  46.  
  47. if bSuccess then
  48. begin
  49. AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators) ;
  50.  
  51. for g := 0 to ptgGroups.GroupCount - 1 do
  52. if EqualSid(psidAdministrators, ptgGroups.Groups[g].Sid) then
  53. begin
  54. Result := True;
  55. Break;
  56. end;
  57.  
  58. FreeSid(psidAdministrators) ;
  59. end;
  60.  
  61. FreeMem(ptgGroups) ;
  62. end;
  63. end;
  64.  
  65. end.
  66.  


然後在自己的專案中 use 這個 unit, 就可使用這個函式了
  1.  
  2. if IsWindowsAdmin then
  3. Showmessage('系統管理者')
  4. else
  5. Showmessage('一般使用者');
  6.  

沒有留言:

張貼留言