在下面的示例中使用外部函數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;
這是一個輸出'BOOL'參數。定義它('out IsMember:BOOL')。我不是說這是你報告的問題的根源,因爲我手上沒有德爾菲(除了一些神祕的力量解釋:)做更多的調試是我的建議。 – Victoria
沒有。但是var b:BOOL;而不是布爾使它工作。爲什麼? –
不是嗎?看看Windows SDK如何聲明'[CheckTokenMembership'(這應該工作)(https://pastebin.com/MvJ9vwJw))。 – Victoria