martes, marzo 20, 2018

VFP: Obtener información del usuario de Directorio Activo

Ese es un ejemplo listo para usar para obtener información del usuario indicado, aunque realmente el mismo ejemplo sirve para obtener otro tipo de información de Directorio Activo.

Solo sirve para máquinas bajo Directorio Activo, no para PC's personales que no están en red y no están conectados a AD.

*-----------------------------------------------
* DEVUELVE UN OBJETO CON INFORMACIÓN DEL USUARIO
* (NOMBRES, APELLIDOS, ETC). FDBOZZO. 10/01/2017
*-----------------------------------------------
* PARÁMETROS:               (v=Pasar por valor | @=Pasar por referencia)
*                           (!=Obligatorio | ?=Opcional) (IN/OUT)
* tcInfo_IN                 (?v IN    ) Valor a buscar (ej: 'NUUMA')
* tcTipoInfo_IN             (?v IN    ) Tipo de valor a buscar (ej: 'mailNickName')
* toInfoUsuario             (!@ IN    ) Variable donde devolver el objeto
*----------------------------------------------------------------------------------
*
* EJEMPLO DE USO:
*
* oInfoUsuario=NULL
* DO user_info.prg WITH '','',oInfoUsuario
* ? oInfoUsuario.fullname
*----------------------------------------------------------------------------------
#DEFINE C_CR CHR(13)
LPARAMETERS tcInfo_IN, tcTipoInfo_IN, toInfoUsuario

LOCAL lcAlias, lcDomainNC, loRootDSE, lcQuery ;
   , loEx as Exception ;
   , loRS as ADODB.Recordset ;
   , loConnection as ADODB.Connection ;
   , loCommand as ADODB.Command

TRY
   toInfoUsuario = .NULL.
   loRootDSE  = .NULL.
   loUser   = .NULL.
   lcAlias   = ''
   lcQuery   = ''
   loRS   = .NULL.
   tcTipoInfo_IN = EVL(tcTipoInfo_IN, 'mailNickName')

   IF EMPTY(tcInfo_IN)
      lcAlias = ALLTRIM(SUBSTR(UPPER(SYS(0)), AT('#', SYS(0)) + 2))
   ELSE
      lcAlias = ALLTRIM(tcInfo_IN)
   ENDIF

   *-- Windows 2000 Attribute (LDAP Name)
   *-------------------------------------
   * description
   * autoReply
   * businessRoles
   * co
   * company
   * delivContLength
   * department
   * displayName
   * displayNamePrintable
   * distinguishedName
   * dnQualifier
   * employeeID
   * extensionAttribute1
   * extensionAttribute2
   * extensionAttribute3
   * extensionAttribute4
   * extensionAttribute5
   * extensionAttribute6
   * extensionAttribute7
   * extensionAttribute8
   * extensionAttribute9
   * extensionAttribute10
   * extensionAttribute11
   * extensionAttribute12
   * extensionAttribute13
   * extensionAttribute14
   * extensionAttribute15
   * facsimileTelephoneNumber
   * generationQualifier
   * homephone
   * homePostalAddress
   * houseIdentifier
   * info
   * initials
   * l
   * Language
   * mail
   * mailnickname
   * mobile
   * otherTelephone
   * otherHomePhone
   * telephoneAssistant
   * pager
   * personalPager
   * personalTitle
   * physicalDeliveryOfficeName
   * postalCode
   * secretary
   * sn
   * st
   * street
   * streetAddress
   * telephoneNumber
   * telexNumber
   * teletexTerminalIdentifier
   * textEncodedORAddress
   * title
   * userCertificate
   * userCert
   * userSMIMECertificate
   * url
   * x121Address
   * autoReplyMessage
   * importedFrom

   loConnection = CREATEOBJECT("ADODB.Connection")
   loCommand  = CREATEOBJECT("ADODB.Command")
   loRootDSE  = GETOBJECT("LDAP://RootDSE")
   lcDomainNC  = loRootDSE.GET("defaultNamingContext")
   loConnection.Provider = "ADsDSOObject"
   loConnection.OPEN("ADs Provider")
   lcQuery   = "<LDAP://" + lcDomainNC + ">;(" ;
     + tcTipoInfo_IN + "=" + lcAlias + ");adspath;subtree"

   loCommand.ActiveConnection = loConnection
   loCommand.CommandText = lcQuery
   loRS = loCommand.Execute

   IF loRS.RecordCount = 0
      ERROR (TEXTMERGE('No se encontró información de "<<lcAlias>>"' ;
       + ' sobre el tipo de dato "<<tcTipoInfo_IN>>"'))
   ELSE
      toInfoUsuario = CREATEOBJECT("EMPTY")
      loAD_User = GETOBJECT(loRS.FIELDS("adspath").VALUE)
      ADDPROPERTY(toInfoUsuario, 'EmailAddress' ;
       , IIF(TYPE('loAD_User.EmailAddress') # 'U' ;
       , NVL(loAD_User.EmailAddress,''),''))
      ADDPROPERTY(toInfoUsuario, 'FirstName' ;
       , IIF(TYPE('loAD_User.FirstName') # 'U' ;
       , NVL(loAD_User.FirstName,''),''))
      ADDPROPERTY(toInfoUsuario, 'FullName' ;
       , IIF(TYPE('loAD_User.FullName') # 'U' ;
       , NVL(loAD_User.FULLNAME,''),''))
      ADDPROPERTY(toInfoUsuario, 'LastName' ;
       , IIF(TYPE('loAD_User.LastName') # 'U' ;
       , NVL(loAD_User.LastName,''),''))

   ENDIF

CATCH TO loEx
   IF _VFP.StartMode=0
      MESSAGEBOX( TEXTMERGE("ERROR <<loEx.ErrorNo>>" ;
        + ", <<loEx.Message>>" + C_CR ;
         + "Proc.<<loEx.Procedure>>" ;
         + ", Line <<loEx.LineNo>>") )
   ENDIF
   THROW

FINALLY
   IF VARTYPE(loConnection) = "O" AND loConnection.State = 1
      loConnection.CLOSE()
   ENDIF

   STORE NULL TO loRS, loConnection, loCommand
ENDTRY


No hay comentarios:

Publicar un comentario