Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

//Load routine address into EDX

mov edx, [GetFSR]

//Call routine

call QT_Thunk

//Assign result to the function

mov @Result, ax

end

 else raise EFOpenError.Create('GetProcAddress16 failed!');

end;

initialization

 //Check Platform for Windows 9x

 if Win32Platform <> VER_PLATFORM_WIN32_WINDOWS then raise EThunkError.Create('Flat thunks only supported under Windows 9x');

 //Load 16-bit DLL (USER.EXE)

 User16Handle:= LoadLibrary16(PChar('User.exe'));

 if User16Handle < 32 then raise EFOpenError.Create('LoadLibrary16 failed!');

finalization

 //Release 16-bit DLL when done

 if User16Handle <> 0 then FreeLibrary16(User16Handle);

end.

Как

проверить, имеем ли мы административные привилегии в системе?

Nomadic пишет:

// Routine: check if the user has administrator provileges

// Was converted from C source by Akzhan Abdulin. Not properly tested.

type PTOKEN_GROUPS = TOKEN_GROUPS^;

function RunningAsAdministrator: Boolean;

var

 SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;

 psidAdmin: PSID;

 ptg: PTOKEN_GROUPS = nil;

 htkThread: Integer; { HANDLE }

 cbTokenGroups: Longint; { DWORD }

 iGroup: Longint; { DWORD }

 bAdmin: Boolean;

begin

 Result := false;

 if not OpenThreadToken(GetCurrentThread, // get security token

TOKEN_QUERY, FALSE, htkThread) then

if GetLastError = ERROR_NO_TOKEN then begin

if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, htkThread) then Exit;

end else Exit;

if GetTokenInformation(htkThread, // get #of groups

TokenGroups, nil, 0, cbTokenGroups) then Exit;

if GetLastError <> ERROR_INSUFFICIENT_BUFFER then Exit;

ptg := PTOKEN_GROUPS(getmem(cbTokenGroups));

if not Assigned(ptg) then Exit;

if not GetTokenInformation(htkThread, // get groups

TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then Exit;

if not AllocateAndInitializeSid(SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin) then Exit;

iGroup := 0;

while iGroup < ptg^.GroupCount do // check administrator group

begin

if EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then begin

Result := TRUE;

break;

end;

Inc(iGroup);

 end;

 FreeSid(psidAdmin);

end;

Два

метода в одном флаконе:

#include

#include

#include

#pragma hdrstop

#pragma comment(lib, "netapi32.lib")

// My thanks to Jerry Coffin (jcoffin@taeus.com)

// for this much simpler method.

bool jerry_coffin_method {

 bool result;

 DWORD rc;

 wchar_t user_name[256];

 USER_INFO_1 *info;

 DWORD size = sizeof(user_name);

 GetUserNameW(user_name, &size);

 rc = NetUserGetInfo(NULL, user_name, 1, (byte **)&info);

 if (rc != NERR_Success) return false;

 result = info->usri1_priv == USER_PRIV_ADMIN;

 NetApiBufferFree(info);

 return result;

}

bool look_at_token_method {

 int found;

 DWORD i, l;

 HANDLE hTok;

 PSID pAdminSid;

 SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;

 byte rawGroupList[4096];

 TOKEN_GROUPS& groupList = *((TOKEN_GROUPS *)rawGroupList);

 if (!OpenThreadToken(GetCurrentThread, TOKEN_QUERY, FALSE, &hTok)) {

printf( "Cannot open thread token, trying process token [%lu].\n", GetLastError);

if (!OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, &hTok)) {

Поделиться с друзьями: