Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Enumerar los grupos con ADSI y WinNT (https://www.clubdelphi.com/foros/showthread.php?t=73305)

fide_uci 13-04-2011 21:18:26

Enumerar los grupos con ADSI y WinNT
 
Hola amigos. Estoy realizando una aplicacion en la cual busco un usuario y despues de haberlo encontrado tengo que darle la posibilidad al administrador de la aplicacion de agregar grupos a dicho usuario y tambien eliminarle grupos a dicho usuario. El problema es que no se como enumerar los grupos, como agregarlo al usuario o como eliminarle uno que ya tenga. Si me pueden ayudar con esto gracias desde ya. Uso Delphi 7.

fide_uci 13-04-2011 23:26:25

Bueno amigos, ya logro enumerar los grupos. Aca les dejo el codigo por si le hace falta a alguien. Ahora lo que no se es como agregarle un grupo a un usuario seleccionado.

Código Delphi [-]
//Enumerando los grupos
procedure ....
var
  dominio : string;
begin

  dominio := frmSessionInit.edt_domain.Text;

  if not frmSessionInit.chk_another_user.Checked then
    ADsOpenObject('WinNT://' + dominio,
        frmSessionInit.cbb_username.Text,
        frmSessionInit.edtPassword.Text, 1, IADsContainer,
        dom)
  else
    ADsGetObject('WinNT://' + dominio, IADsContainer, dom);

  dom.Filter := VarArrayOf(['group']);

  box_grupos.Clear;

  ADsEnumerateObjects(dom, insertar_grupos);
end;

Aca la funcion CallBack que se usa para procesar cada uno de los grupos por separado

Código Delphi [-]
var
  vItem: TListItem;
  groupType: OleVariant;
  tipoGrupo: string;
begin

  vItem := box_grupos.Items.Add;
  vItem.ImageIndex := 2;
  vItem.Caption := disp.Name;

  groupType := disp.Get('groupType');
  
  if (groupType = ADS_GROUP_TYPE_GLOBAL_GROUP) then
    tipoGrupo := 'Grupo Global'
  Else If (groupType = ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP) Then
    tipoGrupo := 'Grupo Local'
  else
    tipoGrupo := 'Desconocido';

  vItem.SubItems.Add(tipoGrupo);

  vItem.SubItems.Add(IADsGroup(disp).Description);
end;

fide_uci 14-04-2011 23:36:41

Ya he logrado enumerar los grupos. Agregar un usuario a un grupo, eliminar un usuario de un grupo y hasta cambiarle la contraseña. Aca les dejo la documentacion.

Primero que todo aca les dejo dos excelentes articulos de como trabajar con ADSI usando Visual Basic pero esta muy facil de traducir.

http://www.15seconds.com/issue/011005.htm
http://www.15seconds.com/issue/011127.htm

Ahora bien, aca tienen el codigo que he utilizado para hacer estas tareas. Tengan en cuenta que hay mucha referencia a componentes. Cualquier duda me escriben un mensaje o la plantean aca.

Código Delphi [-]
//Cambiando el password de un usuario
procedure ...
var
  Usr: IADsUser;
  dominio: string;
begin
    //Es aca donde se obtiene si esta marcado o no, justo cuando el mouse se levanta

    dominio := frmSessionInit.edt_domain.Text;
    //edt_searchcrit.Text es un Edit con el usuario buscado
  try
    if not frmSessionInit.chk_another_user.Checked then
      ADsOpenObject('WinNT://' + dominio + '/' +
          edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
          frmSessionInit.edtPassword.Text, 1,
          IADsUser, usr)
    else
      ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usr);

    Assert(usr <> nil);

      if edt_new_pass.Text = edt_new_pass_confirm.Text then
        begin
          Usr.SetPassword(edt_new_pass.Text);
          Application.MessageBox(PChar('Se ha cambiado la contraseña de forma satisfactória para "' + edt_searchcrit.Text + '"'), 'Cambiar Contraseña !', MB_OK + MB_ICONINFORMATION);
          edt_new_pass.Clear;
          edt_new_pass_confirm.Clear;
        end
      else
        begin
          Application.MessageBox('Las contraseñas no coinciden. Verifique sus datos antes de continuar.', 'Cambiar Contraseña !', MB_OK + MB_ICONINFORMATION);
        end;

    Usr.SetInfo;
  except
    on E: EOleException do begin
      Application.MessageBox(PChar(E.Message), 'Error', MB_OK + MB_ICONERROR);
    end;
  end;

Esto es para por ejemplo activar o desactivar el atributo de "No expira la contraseña".
Código Delphi [-]
procedure ...
var
  Usr: IADsUser;
  dominio: string;
begin
    dominio := frmSessionInit.edt_domain.Text;

  try
    if not frmSessionInit.chk_another_user.Checked then
      ADsOpenObject('WinNT://' + dominio + '/' +
          edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
          frmSessionInit.edtPassword.Text, 1,
          IADsUser, usr)
    else
      ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usr);

    Assert(usr <> nil);

    if chk_no_pass_expire.Checked then
      Usr.Put('UserFlags', Usr.Get('UserFlags') OR ADS_UF_DONT_EXPIRE_PASSWD)
    else
      Usr.Put('UserFlags', Usr.Get('UserFlags') XOR ADS_UF_DONT_EXPIRE_PASSWD);
      Usr.SetInfo;
  except
    on E: EOleException do begin
      ShowMessage(E.Message);
    end;
  end;

Agregarle el usuario a uno o mas grupos.
Código Delphi [-]
procedure ....
var
  vNombreGrupo, dominio: string;
  usuario : IADsUser;
  grupo: IADsGroup;
  vX: Integer;
  //flags : integer;
begin

  dominio := frmSessionInit.edt_domain.Text;
  
  if frmGroupsEnum.ShowModal = mrOk then
    begin

        //Sacamos el usuario que vamos a agregar al grupo
        if not frmSessionInit.chk_another_user.Checked then
          ADsOpenObject('WinNT://' + dominio + '/' +
              edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
              frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
        else
          ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);

        Assert(usuario <> nil);
        //flags := usuario.Get('userFlags');
        //chk_changuePasswordProx.Checked := (flags and ADS_UF_PASSWD_CANT_CHANGE) <>0;

      if frmGroupsEnum.box_grupos.Items.Count > 0 then
        begin

          if frmGroupsEnum.box_grupos.SelCount = 1 then // Hay uno solo selecioando
            begin

              vNombreGrupo := frmGroupsEnum.box_grupos.Selected.Caption;

              //Sacamos el grupo para agregarle el usuario
              if not frmSessionInit.chk_another_user.Checked then
                ADsOpenObject('WinNT://' + dominio + '/' +
                    vNombreGrupo, frmSessionInit.cbb_username.Text,
                    frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
              else
                ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);

              Assert(grupo <> nil);

              try
                grupo.Add(usuario.ADsPath); // Agregamos finalmente el usuario a dicho grupo
                grupo.SetInfo; // Para que se actualice de forma correcta
                actualizar_datos_usuario();
              except
              end;
            end
          else  // Hay más de 1 seleccionado
            begin
              //Sacamos el usuario que vamos a agregar al grupo
              if not frmSessionInit.chk_another_user.Checked then
                ADsOpenObject('WinNT://' + dominio + '/' +
                    edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
                    frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
              else
                ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);

              for vX := 0 to frmGroupsEnum.box_grupos.Items.Count -1 do
                begin
                  if frmGroupsEnum.box_grupos.Items.Item[vX].Selected then
                    begin
                      vNombreGrupo := frmGroupsEnum.box_grupos.Items.Item[vX].Caption;

                      //Sacamos el grupo para agregarle el usuario
                      if not frmSessionInit.chk_another_user.Checked then
                        ADsOpenObject('WinNT://' + dominio + '/' +
                            vNombreGrupo, frmSessionInit.cbb_username.Text,
                            frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
                      else
                        ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);

                      Assert(grupo <> nil);
                      try  //Esto es para protejer de si ya esta actualmente en este grupo
                        grupo.Add(usuario.ADsPath); 
                        grupo.SetInfo;
                      except
                      end;
                    end;
                end;
              actualizar_datos_usuario ();    
            end;
        end;
    end;

end;

y Aca es para eliminar al usuario de uno o mas grupos.
Código Delphi [-]
procedure ...
var
  vNombreGrupo, dominio: string;
  usuario : IADsUser;
  grupo: IADsGroup;
  vX: Integer;
  //flags : integer;
begin

  dominio := frmSessionInit.edt_domain.Text;
  
  if box_grupos.SelCount > 0 then
    begin
      if Application.MessageBox('¿En verdad deseas quitar a este usuario del grupo o conjunto de grupos seleccionado?', 'Quitar usuario de grupo', MB_YESNO + MB_ICONEXCLAMATION) = ID_YES then
        begin
            //Sacamos el usuario que vamos a eliminar del grupo
            if not frmSessionInit.chk_another_user.Checked then
              ADsOpenObject('WinNT://' + dominio + '/' +
                  edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
                  frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
            else
              ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);

            Assert(usuario <> nil);

          if frmGroupsEnum.box_grupos.Items.Count > 0 then
            begin

              if frmGroupsEnum.box_grupos.SelCount = 1 then // Hay uno solo selecioando
                begin

                  vNombreGrupo := box_grupos.Selected.Caption;

                  //Sacamos el grupo para agregarle el usuario
                  if not frmSessionInit.chk_another_user.Checked then
                    ADsOpenObject('WinNT://' + dominio + '/' +
                        vNombreGrupo, frmSessionInit.cbb_username.Text,
                        frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
                  else
                    ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);

                  Assert(grupo <> nil);

                  try
                    grupo.Remove(usuario.ADsPath); // Removemos el usuario de dicho grupo
                    grupo.SetInfo; // Para que se actualice de forma correcta
                    actualizar_datos_usuario();
                  finally
                  end;
                end
              else  // Hay más de 1 seleccionado
                begin
                  //Sacamos el usuario que vamos a agregar al grupo
                  if not frmSessionInit.chk_another_user.Checked then
                    ADsOpenObject('WinNT://' + dominio + '/' +
                        edt_searchcrit.Text, frmSessionInit.cbb_username.Text,
                        frmSessionInit.edtPassword.Text, 1, IADsUser, usuario)
                  else
                    ADsGetObject('WinNT://' + dominio + '/' + edt_searchcrit.Text, IADsUser, usuario);

                  for vX := 0 to box_grupos.Items.Count -1 do
                    begin
                      if box_grupos.Items.Item[vX].Selected then
                        begin
                          vNombreGrupo := box_grupos.Items.Item[vX].Caption;

                          //Sacamos el grupo para agregarle el usuario
                          if not frmSessionInit.chk_another_user.Checked then
                            ADsOpenObject('WinNT://' + dominio + '/' +
                                vNombreGrupo, frmSessionInit.cbb_username.Text,
                                frmSessionInit.edtPassword.Text, 1, IADsGroup, grupo)
                          else
                            ADsGetObject('WinNT://' + dominio + '/' + vNombreGrupo, IADsGroup, grupo);

                          Assert(grupo <> nil);
                          try  //Esto es para protejer de si no se puede quitar de este grupo
                            grupo.Remove(usuario.ADsPath);
                            grupo.SetInfo;
                          except
                          end;
                        end;
                    end;
                  actualizar_datos_usuario ();
                end;
            end;
        end;
    end
  else
    Application.MessageBox('Debes seleccionar uno o más grupos de este usuario para poder realizar esta operación.', 'Quitar usuario de grupo', MB_OK + MB_ICONINFORMATION);

end;

fide_uci 14-04-2011 23:43:40

Comparto los codigos para que alguien que este vuelto loco como yo o mas le saque probecho por que bastante trabajo que me costo hacer todo eso. Aunque lo hice rapido gg lol !

Fat 07-06-2018 11:26:45

Gracias, ha sido de mucha ayuda.

Un saludo.


La franja horaria es GMT +2. Ahora son las 07:32:17.

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