跳到主要内容

AD域服务器搭建及python自动化

一、准备工作

  1. 准备好 VM 虚拟机和 windows Server 的安装包。
  2. 安装VM及windows server服务器

二、安装 AD 域服务

  1. 打开服务器管理器 点击添加角色和功能。 1728818569394
  2. 勾选 AD 域服务。 1728818602346
  3. 安装完成后,在右上角有个感叹号,点开点击将此服务器提升为域控制器。 1728818741848
    • 如果是第一台域控制器,要选择添加新林,输入公司的根域名,如xiaobai.cn
    • 功能级别选择 2016。
    • 设置还原密码,然后全部下一步
    • 检查先决条件,只要安装按钮是可点击的,那就没什么问题。
  4. 安装完毕,等待重启。重启后,AD 服务器已经安装完毕了,同时它也是 DNS 服务器。

四、AD 域的基本配置

  1. 固定 IP 地址:
    • 点击本地服务器,点击由 DHCP 分配的 IPv4 地址,查看并记下当前 IP 地址,如192.168.101.37
    • 把 IP 固定,输入之前记下的 IP 地址,子网掩码默认即可。
    • 由于服务器也是 DNS 服务器,所以 DNS 服务器这里填它自己的 IP 地址。
  2. 用户和计算机管理:
    • 点击右上角的工具,点击用户和计算机。可以看到根域名(如cnc.abc)、computers(加入域的计算机)、Domain Controllers(域控制器)。
    • 右键新建组织单位,如新建人事部等部门。
    • 在对应部门,右键新建用户,填写资料,设置密码(如大小写字母组合XMing2024)。
    • 若组织单位创建错误需要删除,可点击查看,开启高级功能,右键组织单位属性容纳后点击对象,取消“防止对象被意外删除”勾选,之后关闭高级功能。

五、加域操作

  1. 新建用户,右键主节点即可新建组织单位和用户 1728831993949
  2. 创建完账户后双击或右键后点击属性打开该页面,将账号添加至Domain Admins即可提升为域管理员 1728832166941
  3. 此时即可使用工具链接该AD域,配置如下 1728832218111

六、使用python添加组织&用户

from ldap3 import Server, Connection, ALL, NTLM, SUBTREE  
from ldap3.core.exceptions import LDAPException

# LDAP 服务器配置
LDAP_SERVER = 'ldap://192.168.20.136'
LDAP_DOMAIN = 'xiaobai.cn'
LDAP_BIND_DN = 'TEST\\DLP'
LDAP_BIND_PASSWORD = '密码'
BASE_DN = 'dc=xiaobai,dc=cn'

# 创建 LDAP 连接
def create_ldap_connection():
server = Server(LDAP_SERVER, get_info=ALL)
conn = Connection(server, user=LDAP_BIND_DN, password=LDAP_BIND_PASSWORD, authentication=NTLM, auto_bind=True)
print("链接成功")
if not conn.bound:
print("链接失败")
return None
return conn

# 新建组织(OU)
def create_organization_unit(conn, ou_name, parent_dn=BASE_DN):
ou_dn = f"ou={ou_name},{parent_dn}"
group_attributes = {
'objectClass': ['top', 'organizationalUnit'],
'ou': [ou_name]
}
try:
conn.add(ou_dn, attributes=group_attributes)
print(f"已创建组织 '{ou_name}'")
except LDAPException as e:
print(f"创建失败 '{ou_name}': {e}")

# 新建用户
# def create_user(conn, user_id, user_pw, first_name, last_name, ou_dn=BASE_DN):
# user_dn = f"cn={first_name} {last_name},ou={ou_name.split('=')[1]},{ou_dn}" # 注意:这里假设ou_dn中包含一个OU的DN,需要提取OU名
# # 注意:这里的user_dn构造可能需要根据实际的OU结构和命名规则进行调整
# # 另外,user_id通常用作sAMAccountName或uid等属性,具体取决于LDAP架构
# attributes = {
# 'objectClass': ['top', 'person', 'organizationalPerson', 'user'],
# 'cn': [f"{first_name} {last_name}"],
# 'sn': [last_name],
# 'givenName': [first_name],
# 'sAMAccountName': [user_id], # 或者使用'uid': [user_id],取决于LDAP架构
# 'userPassword': user_pw, # 注意:密码通常需要以加密形式存储,这里为了简化直接传递明文
# # 'unicodePwd': b'"' + password.encode('utf-16le') + b'"', # Active Directory中的密码加密方式
# }
# try:
# conn.add(user_dn, attributes)
# print(f"已创建 '{user_id}'")
# except LDAPException as e:
# print(f"创建失败 '{user_id}': {e}")

# 使用示例
if __name__ == "__main__":
conn = create_ldap_connection()
if conn:
# 创建组织
create_organization_unit(conn, 'Test')

# # 创建用户(假设用户将被创建在刚才创建的SalesDepartment OU下)
# # 注意:这里的'SalesDepartment'应该与上面创建的OU名称一致,或者你需要从OU的DN中提取它
# create_user(conn, 'johndoe', 'password123', 'John', 'Doe', f"ou=SalesDepartment,{BASE_DN}")

# 关闭连接
conn.unbind()