ADSI y VFP en Win2000
(2 k) Por la Redacción de FoxPress
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 ExchangeLDAP://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