Bryant Postado Outubro 28, 2009 Denunciar Share Postado Outubro 28, 2009 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.Vlw! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 28, 2009 Denunciar Share Postado Outubro 28, 2009 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 microsofthttp://technet.microsoft.com/pt-br/library...763(WS.10).aspxabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Bryant Postado Outubro 30, 2009 Autor Denunciar Share Postado Outubro 30, 2009 Existe uma maneira de checar internamente se o usuário abriu o programa como administrador?Vlw pelo help! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 30, 2009 Denunciar Share Postado Outubro 30, 2009 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 delphiunit 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Bryant Postado Outubro 30, 2009 Autor Denunciar Share Postado Outubro 30, 2009 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Outubro 30, 2009 Denunciar Share Postado Outubro 30, 2009 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 sistemaTipo... se o usuário não se logou como administrador, voce pode bolar alguma coisa para que ele execute o programa como administradorabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Bryant Postado Outubro 30, 2009 Autor Denunciar Share Postado Outubro 30, 2009 No caso eu tenho que verificar se ele executou como administrador sempre, pois senão ele não tem acesso ao registro.Não seria nem executar como administrador... apenas verificar se ele executou como tal mesmo.Vlw mesmo!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Bryant
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.
Vlw!
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
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.