Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

ASP: cn = oRS.Fields("cn") --> Type Mismatch

Yves3 / 5 Antworten / Baumansicht Nickles

Hallo

Ich bin langsam am verzweifeln :(

Ich bekomme immer folgende Meldung:


Response object error 'ASP 0106 : 80020005'

Type Mismatch

user_informationen.asp, line 0

An unhandled data type was encountered.


Hier der Code dazu:


If UCase(Request("Search")) = "TRUE" Then
userid=Request.Form("userid")
If userid"" Then
set oConn = CreateObject("ADODB.Connection")
set oCommand = CreateObject("ADODB.Command")
set oRS = CreateObject("ADODB.Recordset")

oConn.Provider = "ADsDSOObject"
oConn.Properties("User ID") = "cn=deruser,ou=administrators,cn=users,cn=irgendwas"
oConn.Properties("Password") = "******"
oConn.Open "Ads Provider"

set oCommand.ActiveConnection = oConn 'set the active connection
strQuery= "


Die fett markierte Zeile verursacht den Fehler.
Typenkonvertierung mit CString() oder CInt() funktioniert nicht.

Hat jemand eine Idee?


bei Antwort benachrichtigen
T-Rex Yves3 „ASP: cn = oRS.Fields("cn") --> Type Mismatch“
Optionen

Mach mal Word (oder Excel) auf, drücke STRG+F11, füge dem Projekt ein neues Modul hinzu und schreibe in dieses Modul folgende Zeilen:

Private Sub TestMe
    Dim oConn As Object
    Dim oCommand As Object
    Dim oRS As Object
    Dim i As Long

    set oConn = CreateObject("ADODB.Connection")
    With oConn
        .Provider = "ADsDSOObject"
        .Properties("User ID") = "cn=deruser,ou=administrators,cn=users,cn=irgendwas"
        .Properties("Password") = "******"
        .Open "Ads Provider"
    End With

    set oCommand = CreateObject("ADODB.Command")
    With oCommand
        Set .ActiveConnection = oConn
        .CommandText = ";(cn=" & userid & ");cn;subtree"
        .Properties("Page Size") = 99
    End With

    set oRS = oCommand.Execute

    With RS
        For i = 0 To .Fields.Count - 1
            Debug.Print "Feld " & CStr(i) & _
                ": [" & .Fields(i).Name & "] " & TypeName$(.Fields(i).Value)
        Next i
        .Close
    End With

    Set oRS = Nothing
    Set oCommand = Nothing
    oConn.Close
    Set oConn = Nothing
End Sub

Starte diese Methode mit F8 und drücke dann F5.

Im Direktfenster stehen nun die Feldnamen und ihre Typen. Was steht dort bei cn und was sollte dort stehen?

 GrüßeT-Rex 
bei Antwort benachrichtigen
Yves3 T-Rex „Mach mal Word oder Excel auf, drücke STRG F11, füge dem Projekt ein neues...“
Optionen

Variant steht dort... sollte mir das etwas sagen?
Das ist leider das erste mal, dass ich richtig etwas mit vbscript/asp mache.

EDIT: Wobei ich es nicht mit Word gemacht habe... würde ich so die genauen Typen sehen? (Das Problem ist, dass auf meinem Testrechner kein Office installiert ist und der andere Rechner nicht in der richtigen Domäne ist)

bei Antwort benachrichtigen
T-Rex Yves3 „Variant steht dort... sollte mir das etwas sagen? Das ist leider das erste mal,...“
Optionen

Das Problem ist: VBScript kennt nur Variant als Datentyp, IIRC ergeht es ASP nicht besser. Und der Datentyp Variant kann so ziemlich alles beherbergen. Es wäre gut zu wissen, was da rauskommt.

 GrüßeT-Rex 
bei Antwort benachrichtigen
Yves3 T-Rex „Das Problem ist: VBScript kennt nur Variant als Datentyp, IIRC ergeht es ASP...“
Optionen

Ich habe jetzt noch etwas interessantes herausgefunden.
Der Code funktioniert beim Zugriff auf ActiveDirectory, nicht aber bei dem LDAP-Server, auf den ich zugreifen soll.
Wo das Problem liegt ist mir aber immer noch ein Rätsel, weil:

1. der Zugriff zu funktionieren scheint, da erkannt wird, ob ein User vorhanden ist
2. ich über das Tool ldp der Microsoft Support Tools und dem im Script verwendeten Benutzer das abfragen kann, was ich will --> Rechte sollten reichen
3. ich beim Verwenden eines falschen Kennworts eine "Permission denied"-Meldung bekomme, die Authentifizierung also mit dem richtigen Kennwort zu funktonieren scheint

Ich fragte mich noch, ob ich eventuell den falschen Provider verwende (ADsDSOObject), weil ich ja eigentlich auf Meta Directory zugreifen muss und nicht auf Active Directory. Im Grunde genommen handelt es sich aber immer um LDAP Abfrage und einen passenderen Provider scheint es nicht zu geben.

Im Moment bin ich wieder ideenlos :(

bei Antwort benachrichtigen
Yves3 T-Rex „Das Problem ist: VBScript kennt nur Variant als Datentyp, IIRC ergeht es ASP...“
Optionen

Ich habe jetzt noch eine andere Möglichkeit gefunden.

So kann ich die Eigenschaften des Users ausgeben:


If UCase(Request("Search")) = "TRUE" Then
userid=Request.Form("userid")
If userid"" Then
Response.Write("Userid angegeben")
Set oDSP = GetObject("LDAP:")
Set oUser = oDSP.OpenDSObject("LDAP://SERVER/cn=ZU_SUCHENDER_USER,ou=externals,cn=users,cn=OBERSTE_STUFE","cn=LESEBERECHTIGTER_USER,ou=administrators,cn=users,cn=OBERSTE_STUFE","DAS_PASSWORT ",0)
If Err.Number 0 Then
If Err.Number = "-2147023570" Then
Response.Write("**** ERROR: Authentication failed. Check username, password and search base.")
ElseIf Err.Number = "-2147016646" Then
Response.Write("**** ERROR: LDAP server not found.")
Else
Response.Write("**** ERROR: Unable to bind to LDAP server. " & Err.Number)
End If
End If
Response.Write(oUser.cn)
Else
Response.Write("Bitte eine UserID zum suchen angeben!")
End If
End If


Das Problem ist nur, dass es so keine vordefinierten Funktionen zum Suchen zu geben scheint.
Ich müsste also den Benutzernamen anschauen und gemäss der Namenskonvention in den richtigen OU's schauen, ob der User existiert.
Es gibt aber noch User, deren CommonName in der Form NACHNAME.VORNAME ist. Für diese müsste ich jede ou einzeln überprüfen.

Falls jemand eine bessere Idee hat, ist die willkommen ;)

EDIT: Das funktioniert wunderbar so :)
Ich denke das ist auch performancemässig nich unbedingt schlechter.
Setzte den Thread mal auf gelöst, wenn jemand aber noch etwas interessantes dazu beizusteuern hätte, wäre das natürlich super :)
bei Antwort benachrichtigen