Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=26)
-   -   Atributos de usuario (https://www.clubdelphi.com/foros/showthread.php?t=42128)

yarielrs 04-04-2007 20:53:44

Atributos de usuario
 
Hola a todos:

Necesito saber como desde mi programa Delphi puedo saber cual es el atributo (me refiero a lo de si es administrado, usuario, usuario avanzado, etc.) del usuario activo o de un determinado usuario. Si alguien sabe como hacerlo o donde puedo encontrar información sobre el tema hágamelo saber.


Gracias de antemano...

ArdiIIa 04-04-2007 21:07:14

Hola yarielrs, bienvenido
Aquí seguro lo que encuentras.

PD: Lee las normas del foro.

yarielrs 04-04-2007 22:39:37

Cita:

Empezado por ArdiIIa
Hola yarielrs, bienvenido
Aquí seguro lo que encuentras.

PD: Lee las normas del foro.

Hola ArdiIIa:
Gracias por tu mensaje pero todo lo que sale es sobre la API GetUserName, lo que me devuelve es el nombre del usuario pero lo que yo busco es que cuando yo ejecute mi aplicación esta sepa si se esta ejecutando en un usuario con privilegios de administrador o no, en otra palabras, que me diga si el usuario activo pertenece o no al grupo de usuario administradores esto corriedo mi programa en WinXP...

ArdiIIa 04-04-2007 23:26:14

Cita:

Empezado por yarielrs
Hola ArdiIIa:
lo que yo busco es que cuando yo ejecute mi aplicación esta sepa si se esta ejecutando en un usuario con privilegios de administrador o no, en otra palabras, que me diga si el usuario activo pertenece o no al grupo de usuario administradores esto corriedo mi programa en WinXP...


Te recomendé primero buscar, pensando que alguno de los genios que tenemos en el foro ya habían puesto su pedazo de código, pero lo cierto es que he buscado sobre el asunto y no he visto nada, así que lo pongo yo....
Código Delphi [-]
var
  Form1: TForm1;
  hShell32: HMODULE;
 _IsUserAnAdmin: function(): BOOL; stdcall;

implementation

{$R *.dfm}


function IsUserAnAdmin: Boolean;
const
ModName = 'shell32.dll';
begin
  if Assigned(_IsUserAnAdmin) then
    Result := _IsUserAnAdmin()
  else
  begin
    Result := True;
    if hShell32 = 0 then
      hShell32 := LoadLibrary(ModName);
    if hShell32 <> 0 then
    begin
      _IsUserAnAdmin := GetProcAddress(hShell32, 'IsUserAnAdmin'); 
      if Assigned(_IsUserAnAdmin) then
        Result := _IsUserAnAdmin();
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if isUserAnAdmin then
  ShowMessage('Administrador')
  Else
  ShowMessage('Usuario normal');


end;

Espero que te sea de utilidad.
Fuente CodeGear

dec 04-04-2007 23:50:35

Hola,

Mis dos céntimos, como suele decirse:

Código Delphi [-]
function IsUserAnAdmin(): boolean;
var
  hShell32: HMODULE;
  _IsUserAnAdmin: function(): bool; stdcall;
begin
  result := false;
  hShell32 := LoadLibrary('shell32.dll');
  if (hShell32 <> 0) then
  begin
    try
      _IsUserAnAdmin := GetProcAddress(hShell32, 'IsUserAnAdmin');
      if Assigned(_IsUserAnAdmin) then result := _IsUserAnAdmin();
    finally
      FreeLibrary(hShell32);
    end;
  end;
end;

La idea principal es que la función retorne "false" en lugar de "true" si no consigue cargar la librería o al cabo no consigue obtener un puntero a la función que nos interesa de la librería. También, como puede verse, liberamos en la propia función la librería que previamente cargamos. Y, como también puede verse, todo queda reducido a una función, sin necesidad de variables globales. :)

dec 04-04-2007 23:59:27

Hola,

Por cierto,... revisando la ayuda de la función IsUserAnAdmin() puede verse que sólo está disponible a partir de Windows XP con el Service Pack 2.

Cita:

Note This function is available through Microsoft Windows XP Service Pack 2 (SP2) and Windows Server 2003. It might be altered or unavailable in subsequent versions of Windows.

ArdiIIa 05-04-2007 13:45:45

Código Delphi [-]
function IsAdmin: Boolean;
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
    (Value: (0, 0, 0, 0, 0, 5));
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS = $00000220;
var
  hAccessToken: THandle;
  ptgGroups: PTokenGroups;
  dwInfoBufferSize: DWORD;
  psidAdministrators: PSID;
  x: Integer;
  bSuccess: BOOL;
begin
  Result   := False;
  bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
    hAccessToken);
  if not bSuccess then
  begin
    if GetLastError = ERROR_NO_TOKEN then
      bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
        hAccessToken);
  end;
  if bSuccess then
  begin
    GetMem(ptgGroups, 1024);
    bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
      ptgGroups, 1024, dwInfoBufferSize);
    CloseHandle(hAccessToken);
    if bSuccess then
    begin
      AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
        SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0, psidAdministrators);
      {$R-}
      for x := 0 to ptgGroups.GroupCount - 1 do
        if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
        begin
          Result := True;
          Break;
        end;
      {$R+}
      FreeSid(psidAdministrators);
    end;
    FreeMem(ptgGroups);
  end;
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
   if isAdmin then
    ShowMessage('Es Administrador');
end;
Adicionalmente, tenemos este otro procedimiento en el que hemos omitido las variables globales, y seguramente no necesitemos el SP2. :rolleyes:

Fuente Torry's

yarielrs 05-04-2007 21:39:42

Hola ArdiIIa, ya probé tu código y me funciona a las mil maravillas, por lo que te doy las gracias a ti y dec que también puso su granito de arena.


La franja horaria es GMT +2. Ahora son las 11:06:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi