FoxPress – Abril 2000

 

ADSI y VFP en Win2000

 

         

        (2 k) Por la Redacción de FoxPress

http://www.fpress.com/

 

 

Para poder hablar del ADSI(Active Directory Service Interfaces) es necesario primero una pequeña introducción al Directorio Activo (AD) de Microsoft implementado en Win2000. AD y ADSI pueden parecer similares, pero no son lo mismo. AD es el directorio al que se puede acceder utilizando ADSI. El AD es un sistema de mantenimiento e intercambio de información  basado en un sistema de directorios similar al estándar X.500, que permite la sencilla localización de objetos en una red.

 

  La localización de los elementos se realiza dentro de un espacio de nombres, lo que antes de conocía en NT 4.0 como dominios. Hay que tener en cuenta que no es un directorio tradicional sino un directorio de recursos de red (qué ordenadores están en qué dominios, qué impresoras, qué usuarios y qué derechos tienen): en otras palabras un directorio centralizado en el que está todo lo que se necesita de una red. En general se trata de un sistema de base de datos optimizado para operaciones de lectura, ya que las operaciones de escritura son menores.

 

  Por otro lado, ADSI es un conjunto de definiciones cuya finalidad es facilitar el acceso a ese directorio, un conjunto de llamadas a funciones comunes  basado en la implementación COM que permite acceder a toda la información y funcionalidad del AD.

 

 

Elementos

 

  Se compone de tres elementos que son el cliente, el proveedor y el propio Directorio.

 

   El cliente es la aplicación que necesita hacer uso de los datos del directorio, podría ser cualquier aplicación que soporte COM por tanto es independiente del lenguaje y que corre normalmente en un proceso diferente e incluso en una máquina diferente.

 

  Los proveedores de ADI son los componenetes que permiten dialogar al cliente y al directorio. En realidad es una simple DLL

 

  Los Directorios son un almacén de información que está optimizado para lecturas, no tiene un sofisticado monitor de transacciones, es accesible desde múltiples aplicaciones, es escalable(puede haber copias en múltiples servidores y cualquiera de ellos puede responder a las peticiones de los clientes) y posibilita la búsqueda de entradas (puedes no saber su nombre pero sí algo de él y entonces te da opciones de búsqueda para encontrarlo).

 

Los Proveedores

 

ADSI se compone de 4 proveedores:

 

-    WinNT

-    LDAP

-    NDS

-    NWcompat

 

El nombre del proveedor ya nos indica lo que hace:

 

WinNt nos permite trabajar con el Servicio de Directorios de NT.

 

LDAP nos permite usa el protocolo estándar LDAP de acceso a Servicios de Directorio hetereogéneos.

 

NDS nos da soporte para el servicio de directorio de Novell NetWare.

 

NWCOMPAT nos da soporte para el servidor de directorio de Novell NetWare 3.x.

 

La forma de invocarlos es para WinNT:

 

oADSobj =  GetObject("WinNT://<Nombre del Dominio>")

 

por ejemplo:

 

oADSobj =  GetObject("WinNT://Cinco")

 

Aunque también se puede poner:
 

oADSobj =  GetObject("WinNT://Cinco/Pepe"

 

ó

 

oADSobj =  GetObject("WinNT://Cinco/Administrador")

 

Para el proveedor LDAP deberíamos escribir:

 
LDAP://HostName[:PortNumber][/DistinguishedName]
 
o lo que es lo mismo si quieres acceder a un servidor Exchange
 
LDAP://exch01.Microsoft.com

ó si quieres acceder a un servidor host1 con un dominio llamado arcadiayBay.com

Set ou = GetObject(“LDAP://host1/OU=Sales, DC=ArcadiayBay,DC=COM”)

La forma de invocar los diversos proveedores es con

 
"ADs://"
"LDAP://"
"WinNT://"
"NDS://"

 

Los Objetos residen dentro de un espacio que están identificados por un nombre único. Por ejemplo, los archivos guardados en el disco duro de un PC  residen en el  file system namespace. El nombre único del archivo se basa en que está guardado en un file system namespace. Por ejemplo:

 
C:\public\documents\adsi\adsi_spec.doc 

 

Los espacios del Servicio de Directorios también identifican los objetos por un nombre único que se basa en la localización en donde el objeto reside en el directorio. Por ejemplo en un directorio X 500 un objeto podría tener un nombre como este:

 

CN=John,OU=Marketing,O=ArcadiaBay

 

Los diferente servicios de directorio usan formas diferentes de llamar y controlar a sus objetos. Esto hace difícil tratar con diversos servidores de directorio salvo que uses un estándar como es el LDAP.

 

ADSI define una convención de nombres que pueden identificar  a un objeto en un entorno hetereogeneo. Estos nombre son cadenas llamadas AdsPath y pueden tomar las 4 formas anteriores.

De todos estos proveedores el más interesante es el LDAP pues es el más estándar que lo dejaremos para otro artículo pues nos obligaría a tener instalado ese protocolo que sólo viene con el Win2000 Server ó con el Exchange ó con el Outlook.

En nuestro caso nos vamos a centrar en WinNT:

 

Cada uno de los proveedores soporta métodos y propiedades. Los más utiles objetos que incluye el proveedor Winnt son: computer y User

 

La cantidad de cosas que se puede hacer es bastante y bastaría con mirar la ayuda del ADSI para ver todas las opciones pero demos un pequeño adelanto:

 

 

Para poner en marcha un servicio (en este caso el Servicio DDE de red)

 

 

BrowserServiceObj = GetObject("WinNT://ComputerName/netdde")
BrowserServiceObj.start
BrowserServiceObj = NULL


 

Compartir el directorio tmp de la unidad C:

 

FservObj = GetObject("WinNT://Cinco/lanmanserver")
newshare = FservObj.create("fileshare","test")
newshare.path = "C:\temp"
newshare.setinfo
newshare = null

 

 

Para establecer el perfil de un usuario

 

UserObj = GetObject("WinNT://ComputerName/UserName")
UserObj.Profile = "New Profile Path"
UserObj.SetInfo
UserObj = NULL

 

 

 

Para ver todos los grupos de usuarios

 

 

DomainObj = GetObject("WinNT://cinco")

dime group[1]

DomainObj.Filter = group

 

    For Each GroupObj In DomainObj

        If GroupObj.Class = "Group" Then

       ? GroupObj.Name

    EndIf

next

 

 

 

 

Para crear y borrar un usuario

 

 

# DEFINE UF_DONT_EXPIRE_PASSWD    0X10000

 

*- Se crea una instancia del Proveedor

*- WinNT y

*- se crea el usuario llamado Alumno1

oADSobj =  GetObject("WinNT://Cinco")

usr = oADSobj.Create("user","Alumno1")

usr.Setinfo

 

 

*- Completamos la información del Usuario1

*- Establecemos un password y lo cambiamos

oUsr = GetObject("WinNT://Cinco/Alumno1,User")

oUsr.Fullname = "Pepe Pérez"

oUsr.Description = "Alumno Fox"

oUsr.SetPassword("Secreto")

oUsr.ChangePassword("Secreto","mipassword") &&Ojo es sensible a mayúsculas

 

 

*- Especificamos que para ese usuario el

*- password nunca expira

oUsr.Put("userFlags",UF_DONT_EXPIRE_PASSWD)

oUsr.setinfo

 

 

*- Borramos el usuario

oADSobj = GetObject("WinNT://Cinco")

oADSobj.Delete("User","Alumno1")

 

 

 

Para Crear un Grupo de usuarios

 

* Se deben pasar los siguientes

* Parámetros

Parameter pUser, pPassword, pGroup
set step off
clear

#DEFINE thiscomputer "TuDominio"
dom=GetObject("WinNT://"+thiscomputer)
on Error do ErrHand
lErr=0

if parameters()=3
   usr=dom.Create("user",pUser)
   if lErr=0
      usr.SetInfo()
   else
      usr=dom.GetObject("User",pUser)
   endi
   usr.SetPassword(pPassword)
   usr.SetInfo()
   grp=dom.GetObject("Group",pGroup)
   grp.Add("WinNT://"+thiscomputer+;

"/"+pUser)
   cancel

else
   lErr=1


   ? "USUARIOS"
   ? "-----"

   for each usr in dom
   if usr.class="User"
       gpx=usr.Groups
       usrgrp=''
       for each usrx in gpx
          usrgrp=usrgrp+usrx.name+","
       endfor
       ? usr.name+" ("+usrgrp+")"
   endi
   endfor


   ?
   ? "GRUPOS"
   ? "------"

   for each usr in dom
      uMemb=''
      if usr.class="Group"
         grp=dom.GetObject("Group",;

           usr.Name)
         for each Member in grp.Members
             if !isnull(Member) and ;

           Member.Class="User"
                   uMemb=uMemb+Member.;

              name+","

             endi
         endfor
         ? usr.name+" ("+uMemb+")"

       endi
    endfor
   canc

 endif


Procedure ErrHand
   if lErr=0
      lErr=1
      return
   endi
   ? "Error Num:",error()," ;

Message:",Message()
return


 

 

 

 

 

FoxPress – Abril de 2000

© 1993-2000 FoxPress. All rights reserved