2009-05-05 5 views
4

У меня есть более раннее приложение ASP/VBScript, которое я поддерживаю/обновляю, и в настоящее время использует старые/устаревшие средства сбора информации о профиле - например, ниже:Доступ к идентификатору сотрудника через LDAP в классическом приложении ASP/VBScript

strNTUser = Request.ServerVariables("AUTH_USER") 
strNTUser = replace(strNTUser, "\", "/") 
Set strNTUserInfo = GetObject("WinNT://"+strNTUser) 
'You get the idea' 

Когда мне нужно было полное имя и описание, все было в порядке. Теперь мне нужно получить доступ к дополнительной информации о профиле, но мне нужно использовать LDAP вместо WinNT. Я догадался, что до тех пор, пока я не ослеп, но для моей жизни я просто не могу заставить мозг подключиться через LDAP и получить информацию, которая мне нужна.

Что мне нужно сделать, чтобы получить имя, фамилию и идентификатор сотрудника на основе AUTH_USER?

Update: Я понял, с самого начала, что ADSI или какой-либо подобный интерфейс потребовалась бы, но я, видимо, ADIdiot и не подвожу никакой полезной намек - не говоря уже о помощи - от всего, что я нашел на MSDN или TechNet. Более явная помощь будет приятной ...

+0

4GuysFromRolla имеет a pretty good article с несколькими образцами кода для ADSI, LDAP и ASP. – Mxyzptlk

ответ

4

Я уверен, что это, вероятно, немного более эффективный способ сделать это, но вот код, который я закончил с использованием после долгих поисков, пытаясь, и скрежет зубов ...

Dim strNTUser, strUser, strDN, strRootTDSE 
Dim objRootDSE, objConnection, objCommand, objRecordSet, objUser, objNTUserInfo 

strNTUser = Request.ServerVariables("AUTH_USER") 
strUser = Mid(strNTUser,(instr(1,strNTUser,"\")+1),len(strNTUser)) 

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' 
objCommand.Properties("Searchscope") = 2 'ADS_SCOPE_SUBTREE 

Set objRootDSE = GetObject("LDAP://rootDSE") 
strRootTDSE = objRootDSE.Get("defaultNamingContext") 
Set objRootDSE = Nothing 

objCommand.CommandText = _ 
    "SELECT distinguishedName FROM 'LDAP://" & strRootTDSE & "' " & _ 
     "WHERE objectCategory='user' AND sAMAccountName = '" & strUser & "'" 

Set objRecordSet = objCommand.Execute 

If Not objRecordSet.BOF Then objRecordSet.MoveFirst 
If Not objRecordSet.EOF Then 
    strDN = objRecordSet.Fields("distinguishedName").Value 
End If 

Set objConnection = Nothing 
Set objCommand = Nothing 
Set objRecordSet = Nothing 

Set objUser = GetObject("LDAP://" & strDN) 
'I can now use objUser to get the details' 

Я буду с радостью принимаем любой рефакторированный код, и причина, по которой мне теперь нужно снизить сайт до «Базовой аутентификации», чтобы это работало.

В качестве побочного примечания я попытался сделать жесткий код как можно меньше, поэтому я могу отправить его обратно в проект с открытым исходным кодом. Я получил исходный код.

1

В этом случае вы должны использовать ADSI для подключения к провайдеру каталогов (LDAP). Here is an example с классическим ASP.