On Wed, Mar 16, 2011 at 11:25 AM, Marcos Douglas <m...@delfire.net> wrote: >> I also had to make sure the code was >> being ran as an administrator. > > That's nice. Can you share the function?
Again, don't remember where I found this, Google or MSDN probably. Only tested in Delphi. function IsAdmin: Boolean; { ------------------------------------------------------------- Returns a boolean indicating whether or not user has admin privileges. (Call only when running under NT.) ------------------------------------------------------------- } var hAccessToken : tHandle; ptgGroups : pTokenGroups; dwInfoBufferSize : DWORD; psidAdministrators : PSID; int : integer; // counter blnResult : boolean; // return flag 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; DOMAIN_ALIAS_RID_USERS : DWORD = $00000221; DOMAIN_ALIAS_RID_GUESTS: DWORD = $00000222; DOMAIN_ALIAS_RID_POWER_: DWORD = $00000223; begin Result := False; ptgGroups := nil; blnResult := OpenThreadToken( GetCurrentThread, TOKEN_QUERY, True, hAccessToken ); if ( not blnResult ) then begin if GetLastError = ERROR_NO_TOKEN then blnResult := OpenProcessToken( GetCurrentProcess, TOKEN_QUERY, hAccessToken ); end; if ( blnResult ) then try GetMem(ptgGroups, 1024); blnResult := GetTokenInformation( hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize ); CloseHandle( hAccessToken ); if ( blnResult ) then begin AllocateAndInitializeSid( SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators ); {$R-} for int := 0 to ptgGroups.GroupCount - 1 do if EqualSid( psidAdministrators, ptgGroups.Groups[ int ].Sid ) then begin Result := True; Break; end; {$R+} FreeSid( psidAdministrators ); end; finally FreeMem( ptgGroups ); end; end; _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal