none
Crear un ADODB.RecordSet temporal en Memoria RRS feed

  • Pregunta

  •  

    Hola chavales,

     

    Estoy trabajando con AD, dado que tarda mucho en realizar las peticiones que le hago (listado usuarios, equipos, etc..) utilizo ADSI (WinNT://), para consultar a AD; no puedo utilizar LDAP, no he conseguido que las consultas se validen en el AD siempre aparece un error, no sé si es por el Vista, IE7 o algo que lo impida en el servidor, posiblemente tuviera resuelto utilizándolo; pero, por el momento no puedo consultar al AD de Windows 2003 por ADSI por Ado, por lo que me surge el problema.

     

    ¿Se puede crear un tabla en memoria, es decir emular en la memoria un RecordSet, para que al cerrar sesión en el IE se destruya, claro ? ¿Cuál sería el método?

     

        Set conn = Server.CreateObject("ADODB.Connection")
              conn.Open ""
       Set rs =  Server.CreateObject ("ADODB.RecordSet")
              strQuery = "CREATE TABLE tmp;"
              rs.Open strQuery, conn

     

    Resultado: Error!!

     

    Un saludo a todos y gracias por la ayuda.

    jueves, 22 de noviembre de 2007 17:46

Respuestas

  •  

    Guarda el archivo como .asp , alójalo en un website (IIS) con permisos de ejecución de script y prueba. Acuérdate de cambiar la primera variable

     

    Code Snippet

    <%

    strRuta="OU=Enlaquequieresbuscar,DC=TuDominio,DC=deAD"

    On Error Resume Next

    Const ADS_SCOPE_SUBTREE = 2                          'Nivel de búsqueda
    Set objConnection      = Server.CreateObject("ADODB.Connection")
    Set objCommand         = Server.CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open       "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection

    objCommand.Properties("Page Size")   = 100           'Resultados máximos

    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

    objCommand.CommandText = "SELECT Name FROM 'LDAP://"&strRuta&"' WHERE objectCategory='user'" 
    Set objRecordSet       = objCommand.Execute

    objRecordSet.MoveFirst
    Do Until objRecordSet.EOF
        Response.Write objRecordSet.Fields("Name").Value
        objRecordSet.MoveNext
    Loop

    %>

     

     

     

    jueves, 24 de enero de 2008 20:35

Todas las respuestas

  • Hola Jose Luis,

     

    Sí, es posible, pero necesitamos más detalles.

     

    Debemos tener en cuenta la validación. ¿Con qué privilegios se está ejecutando IIS? ¿Has probado a ejecutar el script mediante vbs, sin usar Server.? ¿Qué error devuelve?

     

    Adjunto un script que muestra todos los usuarios del dominio Ejemplo.JL

     

    On Error Resume Next

    Const ADS_SCOPE_SUBTREE = 2                          'Nivel de búsqueda
    Set objConnection      = Server.CreateObject("ADODB.Connection")
    Set objCommand         = Server.CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open       "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection

    objCommand.Properties("Page Size")   = 1000           'Paginación
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

    objCommand.CommandText = "SELECT Name FROM 'LDAP://dc=Ejemplo,dc=JL' WHERE objectCategory='user'" 
    Set objRecordSet       = objCommand.Execute

    objRecordSet.MoveFirst
    Do Until objRecordSet.EOF
        Response.Write objRecordSet.Fields("Name").Value
        objRecordSet.MoveNext
    Loop

     

    Si te fijas puedes utilizar un lenguaje similar al SQL, simplemente debes tener en cuenta el esquema de directorio activo.

     

    Recuerda cambiar la ruta LDAP y de destruir los objetos al final del código.

     

    Si este mensaje te ha resultado útil ruego que marques la respuesta cómo válida.

     

    Un saludo,

    Rafael Valcárcel Lázaro

     

    MCSE

    MCSA

    CCNA

    ITIL Service Foundation

     

    sábado, 24 de noviembre de 2007 2:15
  •  

    Hola Rafael Valcárcel,

     

    En primer lugar gracias por contestar.

     

    Contestándote al tema de permisos, en efecto tengo acceso a AD del Dominio; el acceso a IIS con propiedades administrativas(por si acaso).

     

    En el caso de no poner 'server' en la creación del objeto devuelve un error de imposibilidad de creación de objeto ActiveX. Pero si ejecuto directamente en vbs, sin los ‘server’ funciona correctamente ( la función general tal y como haces referencia en tu contestación ) pero desde IExplore falla. El punto de fallo de las peticiones a AD con LDAP no lo he localizado, si es por el controlador de dominio, red, Vista, fireWall, Iexplore 7 o el conjunto; como no puedo perder tiempo en buscar donde está el fallo; utilizo ‘WinNT:’ que este desde IExplorer me esta funciondo.

     

    Ahora bien, surge el problema, cada vez que consulto AD, las peticiones en la red local a través de IExplore se eternizan (entre 30 y 100 segundos aproximados, ¡como para realizarlo en remoto!), entonces mi idea es cargar los valores en memoria, y trabajar con ella para que la velocidad de acceso no se pronuncie en demasía, por lo tanto cargar en un ‘array’ los valores y trabajar con ellos, ok perfecto funciona; pero voy a más, como utilizar el array para realizar gestiones, filtros, ordenación, etc.., he de crear bastantes funciones y teniendo en cuenta que un recordSet me lo da hecho y que una misma función me sirve para cualquier tipo de consulta(ya sea consulta AD o a Bases de Datos, manteniendo que los esquemas son distintos), sería lo más lógico utilizarlo, y así optimizar el código.

     

    En VBStudio, tengo realizadas funciones que generan un recodSet temporal en memoria (es decir sin tener una BDatos física) se pueden realizar sin problema, pero desde vbs, vbscript o javascript para pág. en ASP, he intentado pero me obliga a realizar una conexión física; es decir: ¡que no tengo ni idea!.

     

    Option Explicit

    Dim rs As ADODB.Recordset

     

        Dim arrayF As Variant

     

        Set rs = New ADODB.Recordset

     

        arrayF= Array("Codigo",  "Nombre", "Direccion")

     

        With rs.Fields

            .Append "Codigo", adVarChar, 20, adFldRowID

            .Append "Nombre", adVarChar, 100, adFldUpdatable + adFldIsNullable

            .Append "Direccion", adVarChar, 100, adFldUpdatable + adFldIsNullable

        End With

     

        rs.Open , , adOpenStatic, adLockOptimistic

     

        rs.AddNew arrayF, Array("A123", "Jose",  "calle abc")

        rs.AddNew arrayF, Array("B456", Luis", "calle xyz")

        rs.Update

       

       

     

    A ver si se os ocurre algo, sobre la creación de un recodSet virtual.

     

    Gracias, un saludo a todos,

    José Luis Cuesta

    martes, 27 de noviembre de 2007 11:32
  •  

    Guarda el archivo como .asp , alójalo en un website (IIS) con permisos de ejecución de script y prueba. Acuérdate de cambiar la primera variable

     

    Code Snippet

    <%

    strRuta="OU=Enlaquequieresbuscar,DC=TuDominio,DC=deAD"

    On Error Resume Next

    Const ADS_SCOPE_SUBTREE = 2                          'Nivel de búsqueda
    Set objConnection      = Server.CreateObject("ADODB.Connection")
    Set objCommand         = Server.CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open       "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection

    objCommand.Properties("Page Size")   = 100           'Resultados máximos

    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

    objCommand.CommandText = "SELECT Name FROM 'LDAP://"&strRuta&"' WHERE objectCategory='user'" 
    Set objRecordSet       = objCommand.Execute

    objRecordSet.MoveFirst
    Do Until objRecordSet.EOF
        Response.Write objRecordSet.Fields("Name").Value
        objRecordSet.MoveNext
    Loop

    %>

     

     

     

    jueves, 24 de enero de 2008 20:35