用于检索sAMAccountName属性值的Jython LDAP脚本

时间:2016-12-16 16:04:23

标签: ldap jython maximo

我需要创建一个jython脚本来从Active Directory检索sAMAccountName属性,并将其存储在数据库表中和/或根据现有数据对其进行评估。目的是评估用户是否已从AD中的组中删除,并在Maximo中将该用户设置为非活动状态。该脚本将返回帐户名,并将Maximo用户设置为对LDAP查询未返回的Maximo用户处于非活动状态。当用户从AD中删除时,Maximo不会删除或以其他方式修改用户。这是我从一个例子中找到的代码。

# Jython LDAP Example

from javax.naming import *
from java.util import *
from javax.naming.directory import *

# Credentials to access LDAP
user = "cn=binduser,dc=domain,dc=com"
passwd = "password"

# Query starting point and query target 
search_start = "dc=domain,dc=com"
search_target = "(&(objectClass=user)(memberof=CN=Maximo,OU=Groups,DC=domain,DC=com))"
#search_attributes = "sAMAccountName"

# Setup LDAP Context Options
settings = Hashtable()
settings.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory")
settings.put(Context.PROVIDER_URL, "ldap://ldapserver:389")
settings.put(Context.SECURITY_PRINCIPAL, user)
settings.put(Context.SECURITY_CREDENTIALS, passwd)

# Connect to LDAP Server
ctx = InitialDirContext(settings)

srch = SearchControls()
srch.setSearchScope(SearchControls.SUBTREE_SCOPE)

# Execute LDAP Search
results = ctx.search(search_start, search_target, srch )

#Display Search`
for result in results:

    attributes = result.getAttributes()
    names = []
    for atr in attributes.getIDs():
        if atr == "sAMAccountName":
            names.append(str(atr))

    for name in names:
        print attributes.get(name)

然而,这会产生结果:" sAMAccountName:userid"。

我如何告诉它只搜索或返回sAMAccountName的值而不是所有其他属性?现在,此脚本返回与用户关联的所有不需要的属性,只需要sAMAccountName。

第一部分是从LDAP中检索我不熟悉的帐户名称。

谢谢!

1 个答案:

答案 0 :(得分:0)

LDAP查询速成课程 括号围绕每个单独的比较或布尔指令。所以,给出你的search_target:

  • (objectClass=user) - 是比较的示例
  • (& ... ) - 是...比较列表或其他说明的布尔“和”指令
  • (| ... ) - 是...比较列表或其他说明的布尔“或”指令
  • (! ... ) - 是...比较列表或其他说明的布尔“非”指令

要根据特定属性进行搜索,只需将条件添加到LDAP查询中,如下所示:

search_target = "(&(objectClass=user)(memberof=CN=Maximo,OU=Groups,DC=domain,DC=com)(sAMAccountName=%s))" % varWithSearchString

关于在输出中获取“sAMAccountName”:

简而言之:将attributes.get(name)更改为attributes.get(name).get()

总之:你的问题是attributes.get(),类型为java.naming.directory.Attributes(复数),返回一个javax.naming.directory.Attribute(单数),而不是java.lang.String 。并且属性的python字符串表示是您正在打印的。要获取Attribute所拥有的java.lang.Object,需要调用其get()方法。