使用Python win32在Windows LDAP中查找用户电子邮件列表



这个GUI程序允许提供用户名("auser001"(并返回他们的姓名、电子邮件等。我希望能够用Python编写查找数百个用户列表的脚本,比如使用win32win32api,因为这利用了我在域上现有的Windows登录名来向LDAP服务器进行身份验证。也就是说,它不需要我知道LDAP的主机名和登录凭据,就像SO上发布的其他解决方案在使用其他包(python-LDAP等(时所建议的那样

我最接近的是用GetUserName()方法获得我自己的电子邮件:

import win32api
win32api.GetUserNameEx(8)

返回myemail@mydomain.com

TranslateName()方法看起来提供了我所寻求的功能,但据我所知,它不在win32或win32api中。如果win32不是最好的选择,那么我会很感激使用另一个利用我的域身份验证的包来获得一个简单的片段,这样我就不必追踪我的LDAP信用了。谢谢

所有传统的Win32 API函数都可以通过ctypes:调用

import ctypes
from ctypes.wintypes import LPWSTR, ULONG, PULONG, BOOLEAN
_TranslateName = ctypes.windll["secur32"].TranslateNameW
#_TranslateName.argtypes = (LPWSTR, ULONG, ULONG, LPWSTR, PULONG)
_TranslateName.restype = BOOLEAN
def TranslateName(name, from_type, to_type):
buf = ctypes.create_unicode_buffer(256)
bufsz = ULONG(256)
ret = _TranslateName(name,
from_type,
to_type,
buf,
ctypes.byref(bufsz))
if not ret:
raise ctypes.WinError()
# I think I'm supposed to check the returned bufsz? Well, whatever
return ctypes.wstring_at(buf)
name = TranslateName("test", NameUnknown, NameUserPrincipal)
print(f"=> {name!r}")

需要明确的是,GetUserNameEx((和TranslateName((返回的是您的UPN,而不是您的电子邮件地址——在某些AD环境中,这两者可能相同,但在许多其他环境中,它们完全无关。

使用另一个包的简单片段,该包利用了我的域的身份验证,因此我不必追踪我的LDAP信用。谢谢

您可能正在寻找adsi模块,它是AD(和AD之前(目录服务的Win32接口。

(页面上说你需要下载ADSI并提供凭据,但我怀疑这是非常旧的文档,可能是在MS AD成为一种东西之前的文档,因为相同的ADSI接口总是可用的,例如通过PowerShell,并自动使用Kerberos。(


你不需要"知道";只要您的LDAP客户端支持GSSAPI或GSS-SPNEGO身份验证,它就会像实际的Windows工具一样使用您的Kerberos票证。

它可能会更高效,因为你也可以从一个"搜索"操作中批量获得所有结果。

不幸的是,ldap3不进行GSSAPI级别的加密,因此它只有在DC设置了TLS(LDAPS(的情况下才能工作(但如果允许您使用密码身份验证,则TLS可能可用(,而ldap可能根本不会在Windows上构建,因为需要libldap。

serv = ldap3.Server("ldaps://" + host,
tls=ldap3.Tls(validate=ssl.CERT_REQUIRED),
get_info=ldap3.DSA)
conn = ldap3.Connection(serv,
authentication=ldap3.SASL,
sasl_mechanism=ldap3.GSSAPI,
raise_exceptions=True)
with conn:
# base_dn = serv.info.naming_contexts[0]
# filter = "(sAMAccountName=%s)" % ldap3.utils.conv.escape_filter_chars(user)
base_dn = "OU=Staff,O=Contoso Corp"
ok = conn.search(base_dn, filter, ldap3.SUBTREE,
attributes=["userPrincipalName"])
for e in conn.entries:
something

最新更新