【问题标题】:PyAD AD Query check if user exists if not create itPyAD AD 查询检查用户是否存在,如果不创建它
【发布时间】:2017-03-18 15:30:04
【问题描述】:

我对 Python 还很陌生,我正在尝试查询 AD 服务器并根据某些属性(用户名、名字、姓氏)检查用户是否存在,如果该用户存在,请查询他们的组以查看他们是否存在属于特定组,如果不是,则将它们添加到该组。我有一个 YAML 文件,其中存储了用户的信息,以及我想要添加它们的组:

ADUser:
    firstName: <value>
    lastName: <value>
    username: <value>
    email: <value>
    group: <value of group I want them to join>

下面是解析yaml文件的代码:

with open("AD.yaml", 'r') as stream:
    try:
        print(yaml.load(stream))
    except yaml.YAMLError as exc:
        print(exc)

我正在使用 PyAD 库来访问 AD 并运行我的搜索以及用户创建和组设置。这是文档的链接:https://zakird.com/pyad/index.html

这是我开始写的:

    q = pyad.adquery.ADQuery()
    q.execute_query(
        attributes = (["firstName", <value>],["lastName", <value>],["username", <value>],["email", <value>])
        where_clause = "objectClass = '*'",
        base_dn = "OU=users, DC=domain, DC=com"
    )

这些是我想用于用户创建、组添加和查询的方法(我试图弄清楚这些看起来是否不错,以及如何将它们与我目前拥有的 YAML 一起使用):

#User Creation
create_user(name, password=None, upn_suffix=None, enable=True, optional_attributes={})
#Find Members of a group
get_memberOfs(recursive=False, scope='all')¶
#Add an object to a group
add_to_group(group)
#Query AD
q = pyad.adquery.ADQuery()
q.execute_query(
    attributes = ["distinguishedName", "description"],
    where_clause = "objectClass = '*'",
    base_dn = "OU=users, DC=domain, DC=com"
)

我只是想知道是否有人可以帮助我指出应该如何设置。不要担心访问我只是想象从盒子本身运行它的实际 AD 服务器。

这是我到目前为止所做的:

with open("AD.yaml", 'r') as stream:
    try:
        print(yaml.load(stream))
    except yaml.YAMLError as exc:
        print(exc)

def create_User(new_user, group, ):

    q = pyad.adquery.ADQuery()
    user = q.execute_query(
              attributes = ["firstName", "description"],
              where_clause = "objectClass = '*'",
              base_dn = "OU=users, DC=domain, DC=com"
           )
    if user == true:
        if user.is_member_of(group, "")
            logging.info('User is already created and is member of Specified AD Group')
        else
            user.add_to_group(user, group)
    else
        new_user = ADUser.create("%firstName", "%lastname", "" )
        group = ADGroup.from_dn(group)
        group.add_member(new_user)

【问题讨论】:

  • 您发布的 Python 不正确,with 语句都没有缩进块。我认为这是因为您不熟悉本网站上的格式并试图纠正它。如果结果不是您计算机上的结果,请回滚编辑和/或在此处输入正确的代码。

标签: python python-2.7 active-directory yaml pyad


【解决方案1】:

您正在加载用户的信息,但您只是打印它。你至少应该把它储存起来以备将来使用。除此之外绝对没有必要使用不安全的yaml.load()

from ruamel import yaml

with open("AD.yaml", 'r') as stream:
    try:
        data = yaml.load(stream)
        print(data)
    except yaml.YAMLError as exc:
        print(exc)

你可以调用你的方法:

 user = data['AdUser']
 create_User(user['username'], user['group'])

除了不使用yaml.load()之外,还有一些事情需要考虑:

  • 在 Python 中,您不应在自己编写的方法中使用 camel_case(某些库符合非 Pythonesc 特定的大小写),因此将 create_User 更改为 create_user
  • 将参数添加到create_user 以获取您想要注册的其他内容(电子邮件等)
  • 考虑将文件的顶层设为序列,以便您可以遍历从 YAML 加载的数据并一次性注册多个用户

    - firstName: <value>
      lastName: <value>
      username: <value>
      email: <value>
      group: <value>
    - firstName: <value>
      lastName: <value>
      username: <value>
      email: <value>
      group: <value>
    

    然后做:

    for user in data:
        create_user(user['username'], user['group'])
    

【讨论】:

  • 非常感谢您的回复!我将您的一些更改合并到我的代码库中。您对我设置的 if 语句或 AD 查询有任何 cmets 吗?我不确定您是否也对如何调整其中一些有任何建议。
  • 抱歉,我对使用 ActiveDirectory 不太熟悉,所以对此我没有太多评论。这行if user == true 需要定义/导入true,这看起来有点奇怪。 Python 有True,但你不会用==(或is)测试,然后只做if user:
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2019-04-21
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多