У меня есть сервер Samba, который использует LDAP в качестве бэкэнда. PDC работает должным образом, пока я создаю пользователей вручную. Это означает, что если я использую следующую команду для создания нового пользователя, я могу войти в систему на машине Windows, используя пользователя bob, и меня не попросят изменить пароль:
sudo smbldap-useradd -a -P bob
Поскольку у меня нет доступа к паролям пользователей в открытом виде, я использую файл ldif для изменения атрибута sambaNTPassword пользователя. Это единственный способ, который я мог придумать, потому что мне предоставляется только NTLM-хэш пароля. Тем не менее, пароль будет успешно обновлен, и я могу войти в систему Windows.
Вот в чем проблема: пользователи и их хеш-дайджесты предоставляются мне массово. Сначала они записываются в базу данных postgresql. Затем мне нужно запустить сценарий, который считывает список пользователей (новых пользователей) из базы данных вместе с дайджестом NTLM. Поскольку этот процесс должен быть автоматизирован, я должен разработать для этой цели сценарий bash. Вот часть моего сценария, который выполняет указанную выше команду:
#!/bin/bash
/usr/bin/expect <<EOD
spawn smbldap-useradd -a -P $username
expect "New password:" { send -- "$tot\n" }
expect "Retype new password:" { send -- "$toto\n" }
EOD
Пользователь успешно создан, и я могу войти с ним в систему Windows. Проблема в том, что я получаю следующее сообщение:
срок действия вашего пароля истекает сегодня. ты хочешь это изменить?
Кто-нибудь откуда разница? Мне оба метода кажутся идентичными.
Мой сервер: Ubuntu 12.04 LTS Samba: 3.6.3
Ниже приводится запись LDAP пользователя bob, когда я создаю ее вручную (вводите пароли вручную), а затем обновляю ее атрибут sambaNTPasssword:
$ ldapsearch -x uid=bob
# extended LDIF
#
# LDAPv3
# base <dc=mydomain,dc=com> (default) with scope subtree
# filter: uid=bob
# requesting: ALL
#
# bob, Users, mydomain.com
dn: uid=bob,ou=Users,dc=mydomain,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: sambaSamAccount
cn: bob
sn: bob
uid: bob
uidNumber: 1166
gidNumber: 513
homeDirectory: /home/bob
loginShell: /bin/bash
gecos: System User
givenName: bob
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
displayName: bob
sambaSID: S-1-5-21-343724861-3572058179-3643679278-3332
sambaLMPassword: B267DF22CB945E3EAAD3B435B51404EE
sambaAcctFlags: [U]
sambaPwdLastSet: 1402503403
sambaPwdMustChange: 1488903403
shadowLastChange: 16232
shadowMax: 1000
sambaNTPassword: FCFC9A2A1E3F4F9F5E1EBA9A4592507E
И ниже приводится запись LDAP пользователя bob, когда я создаю ее с помощью скрипта (в данном случае я обновляю sambaNTPassword):
# bob, Users, mydomain.com
dn: uid=bob,ou=Users,dc=mydomain,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: sambaSamAccount
cn: bob
sn: bob
uid: bob
uidNumber: 1168
gidNumber: 513
homeDirectory: /home/bob
loginShell: /bin/bash
gecos: System User
givenName: bob
sambaPwdLastSet: 0
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaPwdMustChange: 2147483647
displayName: bob
sambaAcctFlags: [UX]
sambaSID: S-1-5-21-343724861-3572058179-3643679278-3336
sambaNTPassword: FCFC9A2A1E3F4F9F5E1EBA9A4592507E
Проверьте страницу руководства для smbldap-useradd
, похоже, вам нужно установить -B 0
в вашем сценарии. Согласно к этому, он снимет флажок «Пользователь должен сменить пароль» в учетной записи.
Вы можете просмотреть свой smb.conf, чтобы убедиться, что у вас нет неожиданных smbldap-useradd
настройки.