我需要创建一个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中检索我不熟悉的帐户名称。
谢谢!
答案 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()方法。