本例是VBA代码,通过LDAP协议提取域内任意用户的信息,如:姓名,职务,部门,公司,电话,邮箱,地址等等。
前提条件:1. 公司的电脑已加域管理,2.人员相关信息已登记在域目录中
名词解释:
域管理 - 企业标准化应用,对在加域计算上登陆的用户作身份检验。
活动目录 - 域能作身份验证的基础,是域控服务器上有用户的数据库,此数据库叫活动目录。
LDAP - 轻量级目录访问协议,通过它可以访问域活动目录中的信息。所有加域的计算机默认支持LDAP协议
怎么知道计算机是否已加域?
简单地说,在计算机属性中查看,如果计算机名称和全名一模一样,则未加域。如果在全名中多了一些".XXX.XXX"的后缀,则是加域计算机。
怎么使用?
一.先用VBA写个自定义函数,如下
Function GetUserInfo(ByVal SearchField As String, ByVal SearchString As String, ByVal ReturnField As String) As String
Set Conn = CreateObject("ADODB.Connection")
Conn.Open "Provider=ADsDSOObject;"
DM = GetObject("LDAP://rootDSE").Get("defaultNamingContext")
Set CMD = CreateObject("ADODB.Command")
CMD.ActiveConnection = Conn
CMD.CommandText = "<LDAP://" & DM & ">;(&(objectCategory=User)" & "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree"
Set rs = CMD.Execute
If rs.RecordCount = 0 Then
GetUserInfo = "查无此人"
Else
GetUserInfo = rs.Fields(ReturnField)
End If
Conn.Close: Set rs = Nothing: Set CMD = Nothing: Set Conn = Nothing
End Function
二.在Excel单元格公式中调用上述函数,例如:
=GetUserInfo("sAMAccountName",A2,"name") - 意思是在域目录中查找sAMAccountName 等于A2单元格的值, 返回目录中它的Name,本例A2单元格内容是用户的ID
*** sAMAccountName, Name 都是目录中固定名称,不可改。sAMAccountName相当于用户ID, Name即名字
=GetUserInfo("sAMAccountName",A2,"title") - 根据ID查职务,A2是具体用户的ID
=GetUserInfo("sAMAccountName",A2,"company") - 根据ID查职务,A2是具体用户的ID
=GetUserInfo("sAMAccountName",A2,"department")- 根据ID查部门
=GetUserInfo("sAMAccountName",A2,"telephonenumber")- 根据ID查电话号码
=GetUserInfo("sAMAccountName",A2,"mail") - 根据ID查职务邮箱地址
=GetUserInfo("sAMAccountName",A2,"manager") - 根据ID查直属经理名字
=GetUserInfo("sAMAccountName",A2,"streetAddress")- 根据ID查住址
注:并不是一定要根据sAMAccountName去查人员的其他信息,原则上可以根据目录已有任意字段,去查其他任意字段。
更多LDAP可查阅的域用户信息字段,请参阅下贴的第133楼:
#EXCEL VBA对象的常用操作方法c# https://tieba.baidu.com/p/8848588841
前提条件:1. 公司的电脑已加域管理,2.人员相关信息已登记在域目录中
名词解释:
域管理 - 企业标准化应用,对在加域计算上登陆的用户作身份检验。
活动目录 - 域能作身份验证的基础,是域控服务器上有用户的数据库,此数据库叫活动目录。
LDAP - 轻量级目录访问协议,通过它可以访问域活动目录中的信息。所有加域的计算机默认支持LDAP协议
怎么知道计算机是否已加域?
简单地说,在计算机属性中查看,如果计算机名称和全名一模一样,则未加域。如果在全名中多了一些".XXX.XXX"的后缀,则是加域计算机。
怎么使用?
一.先用VBA写个自定义函数,如下
Function GetUserInfo(ByVal SearchField As String, ByVal SearchString As String, ByVal ReturnField As String) As String
Set Conn = CreateObject("ADODB.Connection")
Conn.Open "Provider=ADsDSOObject;"
DM = GetObject("LDAP://rootDSE").Get("defaultNamingContext")
Set CMD = CreateObject("ADODB.Command")
CMD.ActiveConnection = Conn
CMD.CommandText = "<LDAP://" & DM & ">;(&(objectCategory=User)" & "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree"
Set rs = CMD.Execute
If rs.RecordCount = 0 Then
GetUserInfo = "查无此人"
Else
GetUserInfo = rs.Fields(ReturnField)
End If
Conn.Close: Set rs = Nothing: Set CMD = Nothing: Set Conn = Nothing
End Function
二.在Excel单元格公式中调用上述函数,例如:
=GetUserInfo("sAMAccountName",A2,"name") - 意思是在域目录中查找sAMAccountName 等于A2单元格的值, 返回目录中它的Name,本例A2单元格内容是用户的ID
*** sAMAccountName, Name 都是目录中固定名称,不可改。sAMAccountName相当于用户ID, Name即名字
=GetUserInfo("sAMAccountName",A2,"title") - 根据ID查职务,A2是具体用户的ID
=GetUserInfo("sAMAccountName",A2,"company") - 根据ID查职务,A2是具体用户的ID
=GetUserInfo("sAMAccountName",A2,"department")- 根据ID查部门
=GetUserInfo("sAMAccountName",A2,"telephonenumber")- 根据ID查电话号码
=GetUserInfo("sAMAccountName",A2,"mail") - 根据ID查职务邮箱地址
=GetUserInfo("sAMAccountName",A2,"manager") - 根据ID查直属经理名字
=GetUserInfo("sAMAccountName",A2,"streetAddress")- 根据ID查住址
注:并不是一定要根据sAMAccountName去查人员的其他信息,原则上可以根据目录已有任意字段,去查其他任意字段。
更多LDAP可查阅的域用户信息字段,请参阅下贴的第133楼:
#EXCEL VBA对象的常用操作方法c# https://tieba.baidu.com/p/8848588841