2009-06-24

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

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

建立一個 unit
 
unit WindowsUser;

interface
uses Windows;

// 檢查目前登入的使用者的系統管理員時, 則傳回 true

function IsWindowsAdmin: Boolean;

implementation

const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)) ;

const
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;


function IsWindowsAdmin: Boolean;
var
    hAccessToken: THandle;
    ptgGroups: PTokenGroups;
    dwInfoBufferSize: DWORD;
    psidAdministrators: PSID;
    g: Integer;
    bSuccess: BOOL;
begin
    Result := False;
    bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken) ;
    if not bSuccess then
    begin
        if GetLastError = ERROR_NO_TOKEN then
            bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken) ;
    end;


    if bSuccess then
    begin
        GetMem(ptgGroups, 1024) ;

        bSuccess := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize) ;

        CloseHandle(hAccessToken) ;

        if bSuccess then
        begin
            AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators) ;

            for g := 0 to ptgGroups.GroupCount - 1 do
                if EqualSid(psidAdministrators, ptgGroups.Groups[g].Sid) then
                begin
                    Result := True;
                    Break;
                end;

            FreeSid(psidAdministrators) ;
        end;

        FreeMem(ptgGroups) ;
    end;
end;

end.
 


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

沒有留言:

張貼留言