Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Delphi - executar programa como administrador


Bryant

Pergunta

6 respostass a esta questão

Posts Recomendados

  • 0
Galera, como eu forço para um programa sempre executar como administrador?

Preciso fazer isso pelo código, e não pelas propriedades do executável.

Voce deve se logar como administrador

Ou pode ver as dicas da microsoft

http://technet.microsoft.com/pt-br/library...763(WS.10).aspx

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Existe uma maneira de checar internamente se o usuário abriu o programa como administrador?

existe sim...

Crie uma Unit no delphi e salve com o nome de IsAdministrator.pas e salve na pasta Bin do delphi

unit IsAdministrator;

interface

function IsAdmin: Boolean;

implementation

uses
  Windows;
  
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS = $00000220;
  
type
  TOpenThreadToken = function (ThreadHandle: THandle; DesiredAccess: DWORD; OpenAsSelf: BOOL; var TokenHandle: THandle): BOOL; stdcall;
  TGetTokenInformation = function (TokenHandle: THandle; TokenInformationClass: TTokenInformationClass; TokenInformation: Pointer; TokenInformationLength: DWORD; var ReturnLength: DWORD): BOOL; stdcall;
  TOpenProcessToken = function (ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; stdcall;
  TEqualSid = function (pSid1, pSid2: Pointer): BOOL; stdcall;
  TAllocateAndInitializeSid = function (const pIdentifierAuthority: TSIDIdentifierAuthority; nSubAuthorityCount: Byte; nSubAuthority0, nSubAuthority1: DWORD; nSubAuthority2, nSubAuthority3, nSubAuthority4: DWORD; nSubAuthority5, nSubAuthority6, nSubAuthority7: DWORD; var pSid: Pointer): BOOL; stdcall;
  TFreeSid = function (pSid: Pointer): Pointer; stdcall;

function IsAdmin: boolean;
var
  iAccessToken: THandle;
  ptgGroups: PTokenGroups;
  dwInfoBufferSize: DWORD;
  psidAdministrators: PSID;
  iCount: integer;
  fSuccess: BOOL;
  pOpenThreadToken: TOpenThreadToken;
  pOpenProcessToken: TOpenProcessToken;
  pGetTokenInformation: TGetTokenInformation;
  pEqualSid: TEqualSid;
  pAllocateAndInitializeSid: TAllocateAndInitializeSid;
  pFreeSid: TFreeSid;
  iDll: integer;
begin
  Result := false;
  iDll := LoadLibrary(advapi32);
  if iDll = 0 then
    exit;
  try
    pOpenThreadToken := GetProcAddress(iDll, 'OpenThreadToken');
    pOpenProcessToken := GetProcAddress(iDll, 'OpenProcessToken');
    pGetTokenInformation := GetProcAddress(iDll, 'GetTokenInformation');
    pEqualSid := GetProcAddress(iDll, 'EqualSid');
    pAllocateAndInitializeSid := GetProcAddress(iDll, 'AllocateAndInitializeSid');
    pFreeSid := GetProcAddress(iDll, 'FreeSid');
    if not Assigned(pOpenThreadToken) or not Assigned(pOpenProcessToken) or not Assigned(pGetTokenInformation) or not Assigned(pEqualSid) or not Assigned(pFreeSid) or not Assigned(pAllocateAndInitializeSid) then
      exit;
    fSuccess := pOpenThreadToken(GetCurrentThread, TOKEN_QUERY, true, iAccessToken);
    if not fSuccess then
    begin
      if GetLastError = ERROR_NO_TOKEN then
        fSuccess := pOpenProcessToken(GetCurrentProcess, TOKEN_QUERY, iAccessToken);
    end;
    if fSuccess then
    begin
      GetMem(ptgGroups, 1024);
      try
        fSuccess := pGetTokenInformation(iAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize);
        CloseHandle(iAccessToken);
        if fSuccess then
        begin
          pAllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators);
          try
            for iCount := 0 to ptgGroups.GroupCount - 1 do
              if pEqualSid(psidAdministrators, ptgGroups.Groups[iCount].Sid) then
              begin
                Result := true;
                break;
              end;
          finally
            pFreeSid(psidAdministrators);
          end;
        end;
      finally
        FreeMem(ptgGroups);
      end;
    end;
  finally
    FreeLibrary(iDll);
  end;
end;

end.
Depois é só chamar a função
Uses IsAdministrator;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if IsAdmin = true then
   showmessage('O usuário logou como Administrador');
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui verificar e fazer funcionar.... mas por este método não consigo saber se o usuário executou como administrador.

Tipo aquela função do Vista: botão direito - executar como administrador.

Isso é possível?

Vlw mesmo pela ajuda!

Link para o comentário
Compartilhar em outros sites

  • 0
Consegui verificar e fazer funcionar.... mas por este método não consigo saber se o usuário executou como administrador.

Tipo aquela função do Vista: botão direito - executar como administrador.

Isso é possível?

O código acima que te passei fornece a informação se o usuário se logou no windows como administrador ou não, voce pode implementar melhoras para usar no seu sistema

Tipo... se o usuário não se logou como administrador, voce pode bolar alguma coisa para que ele execute o programa como administrador

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...