2017-10-08 15 views
0

在下面的示例中使用外部函數CheckTokenMembership從SO中獲得訪問錯誤函數IsUserAdmin返回到IsUserAdminStr。使用本地var的API調用會導致fn返回後的訪問錯誤(CheckTokenMembership)

當b是局部var到n時,IsUserAdmin之後會立即出現訪問衝突。如果b是全局變量,那麼它工作。

刪除CheckTokenMembership停止錯誤。 FreeSid(AdministratorsGroup)沒有效果。 Changing to Result := true;已無效

請指出我明顯缺少的東西。

//from https://stackoverflow.com/questions/6261865/looking-for-delphi-7-code-to-detect-if-a-program-is-started-with-administrator-r 

//var b:boolean; // <------ Works if b is here 
function IsUserAdminStr(SingleChar:boolean=false):string; 
begin 
    if IsUserAdmin 
     then result:='Admin' 
     else result:='User'; //<----------- throws access error here 
end; 
function CheckTokenMembership(TokenHandle: THandle; SIdToCheck: PSID; var IsMember: Boolean): BOOL; StdCall; External AdvApi32; 
function IsUserAdmin: Boolean; 
var 
    b: boolean;  // <-----------Fails if b is here 
    b: BOOL;  // <------- this works 
    AdministratorsGroup: PSID; 

const 
    SECURITY_NT_AUTHORITY: SID_IDENTIFIER_AUTHORITY = 
    (Value: (0,0,0,0,0,5)); // ntifs 
    SECURITY_BUILTIN_DOMAIN_RID: DWORD = $00000020; 
    DOMAIN_ALIAS_RID_ADMINS: DWORD = $00000220; 
begin 
    b := AllocateAndInitializeSid(
     SECURITY_NT_AUTHORITY, 
     2, //2 sub-authorities 
     SECURITY_BUILTIN_DOMAIN_RID, //sub-authority 0 
     DOMAIN_ALIAS_RID_ADMINS,  //sub-authority 1 
     0, 0, 0, 0, 0, 0,    //sub-authorities 2-7 not passed 
     AdministratorsGroup); 
    if (b) then 
    begin 
    if not CheckTokenMembership(0, AdministratorsGroup, b) then 
     b := False; 
    FreeSid(AdministratorsGroup); 
    end; 
    Result := b; 
end; 
+0

這是一個輸出'BOOL'參數。定義它('out IsMember:BOOL')。我不是說這是你報告的問題的根源,因爲我手上沒有德爾菲(除了一些神祕的力量解釋:)做更多的調試是我的建議。 – Victoria

+0

沒有。但是var b:BOOL;而不是布爾使它工作。爲什麼? –

+0

不是嗎?看看Windows SDK如何聲明'[CheckTokenMembership'(這應該工作)(https://pastebin.com/MvJ9vwJw))。 – Victoria

回答

0

如果b BOOL不是布爾值,它的工作原理``變種B:BOOL;`

還是不明白爲什麼,或爲什麼它顯然奏效了原來那麼海報。 (使用D10.1)

+0

Win32 API沒有Delphi的'Boolean'類型的概念,只有它自己的'BOOL'類型。它們是不同大小的不同類型('Boolean' = 1個字節,'BOOL' = 4個字節)。 'BOOL'等價於Delphi的'LongBool'。當變量是'Boolean'時,API函數正在嘗試寫入4個字節,其中只分配了1個字節。 –

相關問題