Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2011
Avatar de fide_uci
fide_uci fide_uci is offline
Miembro
 
Registrado: Jan 2009
Ubicación: Cuba - La Habana
Posts: 226
Poder: 10
fide_uci Va por buen camino
Exclamation 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.
Responder Con Cita
  #2  
Antiguo 13-04-2011
Avatar de fide_uci
fide_uci fide_uci is offline
Miembro
 
Registrado: Jan 2009
Ubicación: Cuba - La Habana
Posts: 226
Poder: 10
fide_uci Va por buen camino
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;
Responder Con Cita
  #3  
Antiguo 14-04-2011
Avatar de fide_uci
fide_uci fide_uci is offline
Miembro
 
Registrado: Jan 2009
Ubicación: Cuba - La Habana
Posts: 226
Poder: 10
fide_uci Va por buen camino
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;

Última edición por fide_uci fecha: 14-04-2011 a las 23:42:48. Razón: Actualizacion...
Responder Con Cita
  #4  
Antiguo 14-04-2011
Avatar de fide_uci
fide_uci fide_uci is offline
Miembro
 
Registrado: Jan 2009
Ubicación: Cuba - La Habana
Posts: 226
Poder: 10
fide_uci Va por buen camino
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 !
Responder Con Cita
  #5  
Antiguo 07-06-2018
Fat Fat is offline
Miembro
 
Registrado: Jul 2006
Posts: 72
Poder: 13
Fat Va por buen camino
Gracias, ha sido de mucha ayuda.

Un saludo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas con ADSI y Atributos fide_uci API de Windows 0 12-04-2011 18:47:16
Enumerar las Pc's en una LAN Saindoft Redes 1 02-06-2008 22:48:24
Enumerar con Letras torito Varios 4 20-07-2005 14:57:23
Conexión BDE con DB2 en winnt mateamargo Conexión con bases de datos 3 01-08-2003 19:22:46
Scheduled Task perdido (WinNT) Sóstrato Windows 0 21-05-2003 16:09:43


La franja horaria es GMT +2. Ahora son las 05:41:22.


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