Eu tenho um servidor samba que está usando o LDAP como seu back-end. O PDC está funcionando conforme o esperado, desde que eu crie os usuários manualmente. Isso significa que, se eu usar o seguinte comando para criar um novo usuário, posso fazer login em uma máquina Windows usando o usuário bob e não me pedem para alterar a senha:
sudo smbldap-useradd -a -P bob
Como não tenho acesso a senhas em texto puro dos usuários, uso um arquivo ldif para modificar o atributo sambaNTPassword do usuário. Esta é a única maneira que eu poderia chegar, porque eu sou fornecido apenas com o hash NTLM da senha. No entanto, a senha é atualizada com sucesso e eu posso fazer logon na máquina Windows.
Aqui está o problema:
usuários e seus hash digests são fornecidos para mim em massa. Eles são primeiramente gravados em um banco de dados postgresql. Então eu tenho que executar um script que lê lista de usuários (novos usuários) do banco de dados junto com seu resumo NTLM. Como esse processo deve ser automatizado, tenho que desenvolver um script bash para essa finalidade. Aqui está parte do meu script que executa o comando acima:
#!/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
O usuário foi criado com sucesso e posso fazer logon na máquina com o Windows. O problema é que eu recebo a seguinte mensagem:
your password expires today. do you want to change it?
Alguém de onde vem a diferença? Para mim, os dois métodos parecem idênticos.
Meu servidor:
Ubuntu 12.04 LTS
Samba: 3.6.3
A seguir está a entrada LDAP do usuário bob quando eu o crio manualmente (insira senhas manualmente) e atualizo seu atributo 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
O seguinte é a entrada LDAP do usuário bob quando eu o crio usando o script (eu atualizo o sambaNTPassword neste caso):
# 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