Modifica password

giovedì 04 maggio 2006 - 17.56

BiBi Profilo | Junior Member

Sto cercando di modificare le password di un utente di ActiveDirectory tramite un file VBS.
Il comando è il seguente:

Set UserObj = GetObject("WinNT://my domain/my user")
UserObj.ChangePassword "password_old", "password_new"

Quando lancio lo script mi restituisce un errore dicendomi che non sono stati seguiti i criteri di password. In realtà se vado da ActiveDirectory e introduco la password presente nello script, il tutto funziona correttamente.
Lo script viene lanciato direttamente sul SERVER 2003 dall'utente Administrator.
Se provo a modificare delle proprietà dell'utente ad esempio il Nome esteso o la descrizione, questo me lo fa senza problemi.

Cosa sto sbagliando???

Vi prego aiutatemi, sono disperata, devo assolutamente consegnare questo lavoro e mi manca solo questa parte!

Grazie mille!!!

revontulet Profilo | Junior Member

ciao
hai provato a modificare la Set UserObj cosi
Set UserObj = GetObject("WinNT://" & strcomputer & "/" & struser & ",user")
cio' premesso il problema sembra comunque nell' impostazione dei criteri di password ...
hai verificato il codice di ritorno e l'event log su 2003 ? i.e.
err -2147022651 ( hex 800708C5) (old password/new password concidono)

BiBi Profilo | Junior Member

Ho provato a modificare la Set UserObj come mi hai detto, ma ho ancora lo stesso problema.
Sono andata sul visualizzatore eventi e mi mostra tutti gli eventi di accesso ad ActiveDirectory, ma non mi mostra l'errore.
Ho anche provato a modificare la nuova password inserendone una lunga 11 caratteri con al suo interno almeno una maiuscola una minuscola e un numero. Tale password sono sicura che è corretta secondo i criteri di protezione perchè era già stata usata tempo fa per un altro utente che poi è stato cancellato, mentre non è mai stata utilizzata per l'utente che ho creato, anche perchè è un utente nuovo e per ora ho impostato solo la prima password.

Cosa posso verificare?

Grazie.

Ciao!

revontulet Profilo | Junior Member

ciao
vuoi provare questo pezzo di codice (testato a lungo)

(riattiva le msgbox)

SettaPwd computer,struser,prevpass,newpass

Sub SettaPwd (strcomputer,struser,prevpass,newpass)

on error resume next

Dim CodiceRitorno

'msgbox "Setta pWD " & prevpass & " - " & newpass & " su " & strcomputer
Set UserObj = GetObject("WinNT://" & strcomputer & "/" & struser & ",user")
'msgbox "setpwd1 " & err.number & " hex = " & Hex(err.number)

UserObj.ChangePassword prevpass,newpass
CodiceRitorno = err.number
'msgbox "setpwd2 hex = " & Hex(CodiceRitorno)
Select case CodiceRitorno

case 0
' use code 7 for specific event msg
esito = "Regular Change passowrd for " & struser
'msgbox esito
' MyLogHandler strcomputer,7,esito

case -2147022651 ' hex 800708C5
' same old/new pwd
esito = struser
MyLogHandler strcomputer,CodiceRitorno,esito
Err.clear

case -2147024810 ' hex 80070056
'msgbox "chgpwd " & CodiceRitorno & " hex = " & Hex(CodiceRitorno)
esito = "current passwd unexpected for " & struser
'MyLogHandler strcomputer,CodiceRitorno,esito

set container = GetObject("WinNT://" & strcomputer & ",computer" )
'msgbox "setpwd3 " & err.number & " hex = " & Hex(err.number)
set user = Container.Getobject("user",struser)
IF err.number = 0 then
call user.SetPassword(newpass)
IF err.number = 0 then
esito = "Change password successfull " & struser
' use code 7 for specific event msg
' MyLogHandler strcomputer,7,esito
user.setinfo
else
esito = "set pwd " & struser
'MyLogHandler strcomputer,err.number,esito
end if
else
esito = "set user " & struser
'MyLogHandler strcomputer,err.number,esito
end if

case - 2147023569 ' hex 8007052F
esito = "Password already change for today = " & CodiceRitorno & " for " & struser
'MyLogHandler strcomputer,CodiceRitorno,esito

case else
esito = "unpredicted error = " & CodiceRitorno & " for " & struser
msgbox esito
'MyLogHandler strcomputer,CodiceRitorno,esito


End select

End sub

BiBi Profilo | Junior Member

Ho copiato il tuo codice, ma l'errore che mi viene fuori è sempre lo stesso che mi veniva anche con la mia procedura.
L'errore è il n° : 800708C5, ma ho paura che non c'entri nulla, anche perchè la vecchia password e quella nuova sono completamente diverse e la nuova password rispecchia perfettamente i criteri di password impostati sul server.

revontulet Profilo | Junior Member

ciao
hai verificato nei criteri di protezione l' history della password ( ossia quante password diverse sono necessarie per riutilizzare la stessa pwd )? Mi viene in m mente cio poiche' hai detto che hai provato a eseguire il cambio pwd direttamente da sistema..
( Ps. come avrai notato il codice postato si riferiva ad account locale)

BiBi Profilo | Junior Member

La verifica della storia delle password so che va bene, perchè ho impostato una password che per quell'utente non avevo mai utilizzato.

Dato che la password è corretta, il dubbio che mi viene è che il messaggio di errore che ritorna la procedura in realtà non sia corretto, ma sia riferito a un qualche problema sul server.

revontulet Profilo | Junior Member

Ciao
ho provato a simulare l' errore in locale e l'unico modo che ho trovato e' quello di settare la minimun pwd age diversa da zero . Con la minimum pwd age settata a 1 lo script va in errore
800708C5 diversamente lo script cambia le pwd senza problemi.
(N.B da AD piu che un cambio PWd si effettua un reset pwd)

BiBi Profilo | Junior Member

Ho fatto una prova cercando di settare la MinPasswordAge a 0, ma mi dà un altro messaggio di errore: 8000500F.

Ciao!

revontulet Profilo | Junior Member

il codice 8000500F (non documentato i.e in MSDN vedi
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/common_errors.asp

dovrebbe comunque essere riferito a una proprieta' inesistente
( i.e i puo' riprodurre con uno script del tipo :

Set UserObj = GetObject("WinNT://" & strcomputer & "/" & struser & ",user")

UserObj.Put "conigliomannaro",0
CodiceRitorno = err.number
msgbox "prop non esiste hex = " & Hex(CodiceRitorno)
objLastSet = UserObj.Get ("pwdLastSet")
CodiceRitorno = err.number
msgbox "prop dovrebbe esistere hex = " & Hex(CodiceRitorno)
objUserFlags = UserObj.Get("UserFlags")
msgbox "valore flag " & cstr(objUserFlags) & " " & hex(objUserFlags)
Err.clear
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10201
objPasswordExpirationFlag = ADS_UF_DONT_EXPIRE_PASSWD
UserObj.Put "userFlags", objPasswordExpirationFlag

CodiceRitorno = err.number
msgbox "userFlags hex = " & Hex(CodiceRitorno)
UserObj.SetInfo

dove Userflags and PwdLastset ( setttata a -1) si riferiscono al "pwd not expire"

in altri termini potrebbe essere un qualcosa in AD ma io insisterei nel riprovare il codice con un utente nuovo, compresa la prova di connessione effettiva dell 'utente e la verifica dell' applicabilita del "not expire " o di altri valori da script come il
UserObj.Put "PasswordExpired", 1


BiBi Profilo | Junior Member

Ho contattato l'amministratore della rete per fargli modificare il parametro direttamente sulla configurazione di ActiveDirectory.
Ho fatto una prova ed ora funziona tutto meravigliosamente.

Grazie mille per il tuo aiuto, mi hai risolto una bella problematica!!!

Ciao!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5