Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Web na reset hesla uživatele v Active Directory

Chtěl bych všechny programátory poprosit o pomoc s tímto:

Chtěl bych vytvořit webové rozhraní, které bude dostupné jen ve vnitřní síti a administrátorům domény umožní reset hesla u uživatelů, kteří heslo zapomněli. Našel jsem tento kód a ptám se, jestli je správně a funkční s Active Directory (windows server 2003 level) na Windows Serveru 2008 R2. Pokud ano, tak jak bych ho měl zaimplementovat do stránky ASP.

const int ADS_UF_ACCOUNTDISABLE = 0x0002;

string pathname = "WinNT:/zs.slapanov.cz/NetID,user";

DirectoryEntry user = new DirectoryEntry(pathname);

//Optionally provide credentials to connect to SAM

//user.Username = "DOMAIN\\User";

//user.Password = "password";

user.AuthenticationTypes = AuthenticationTypes.Secure;

//Reset Password

user.Invoke("SetPassword", new object[]{"newpassword"});

//Enable account

int flags = user.Properties["userAccountControl"].Value;

user.Properties["userAccountControl"].Value = flags & ~ADS_UF_ACCOUNTDISABLE;

user.CommitChanges();

//Change Password at next logon

user.Properties["passwordExpired"][0] = 1;
Předmět Autor Datum
Nebo by kód mohl vypadat takhle s tím, že by se musel změnit řádek Set objUser? Sub ChangePassword(…
Aleš Pospíchal 07.04.2010 19:41
Aleš Pospíchal
A kompletní a funkční řešení by mělo být toto: <% strUserCN = request.form("cn") strNewPassword = r…
Aleš Pospíchal 07.04.2010 19:45
Aleš Pospíchal
ani jedno řešení IMHO nebude dělat to co po něm chceš. Bude měnit heslo autentikovaného uživatele, n…
touchwood 07.04.2010 21:58
touchwood
Třetí řešení jsem implementoval do vlastního grafického rozhraní a přidal tam formulář na výběr orga…
Aleš Pospíchal 08.04.2010 21:16
Aleš Pospíchal
přiznám se, že to, v jakém kontextu běží ASP jsem dosposud nezkoumal a nejsem si jist, že autentikac…
touchwood 08.04.2010 21:33
touchwood
Během víkendu to tedy vyzkouším a napíšu výsledek, jestli to funguje.
Aleš Pospíchal 08.04.2010 21:39
Aleš Pospíchal
Přímo to nefungovalo. Je nutná např. autorizace na LDAP serveru a aby bylo nastaveno, že si uživatel… poslední
Aleš Pospíchal 10.04.2010 18:21
Aleš Pospíchal
Osobně bych si moc dobře rozmyslel udělat do bezpečnosti a důvěryhodnosti AD taková vrata... obzvášt…
touchwood 07.04.2010 21:57
touchwood

Nebo by kód mohl vypadat takhle s tím, že by se musel změnit řádek Set objUser?

Sub ChangePassword(sNewPassword)
   Set objSysInfo = CreateObject("ADSystemInfo")
   Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
   objUser.Password = sNewPassword
   objUser.SetInfo
   Set objUser = Nothing
   Set objSysInfo = Nothing
End Sub

A kompletní a funkční řešení by mělo být toto:

<%
strUserCN = request.form("cn")
strNewPassword = request.form("newpass")
strPassVerify = request.form("passverify")

if strUserCN="" then
    response.write "<html><head><title>Change Password</title></head><body>"
    response.write "<center><h1>Web Password Reset</h1></center>"
    response.write "<hr><br><br><form method=post action=changepass.asp><table>"
    response.write "<tr><td>CN: </td><td><input type=text name=cn></td><tr>"
    response.write "<tr><td>New Password: </td><td><input type=password name=newpass></td></tr>"
    response.write "<tr><td>Verify Password: </td><td><input type=password name=passverify></td></tr>"
    response.write "<tr><td colspan=2 align=center><input type=submit value='Reset Password'></td></tr>"
    response.write "</table></body></html>"
    response.end
else

if strNewPassword = strPassVerify then

set usr = GetObject("LDAP://CN=" & strUserCN & ",CN=Users,DC=savilltech,DC=com")

usr.put "userPassword", strNewPassword

response.write "<html><head><title>Results</title></head><center><h1>Update Results</h1></center><hr><br><br>"
response.write strUserCN & ": password was successfully updated"
response.end

else

    response.write "<html><head><title>Error!</title></head><body>"
    response.write "<center><h1>An Error Has Occurred!</h1></center>"
    response.write "<hr><br><br>"
    response.write "The password and confirmation do not match. Please go back and try again."
    response.end

end if
end if
%>

Třetí řešení jsem implementoval do vlastního grafického rozhraní a přidal tam formulář na výběr organizační jednotky, protože to mám rozdělené.

Když tam nastavím Basic a Windows Authentication, tak se autorizuje uživatel, aby nedošlo ke zneužití.
Když to bude administrátor, tak může změnit heslo komukoliv. A pokud se autorizuje uživatel, může změnit heslo jen sám sobě (k tomu ale nástroj určený není)
Pak tam je pole na zadání uživatelského jména, takže bych tam mohl zadat uživatele kteréhokoliv.
Zatím jsem to ale nezkoušel.

Ani v tomto případě to nebude fungovat?
Jak bych musel kód změnit, aby administrátor mohl měnit hesla uživatelům?

Přímo to nefungovalo. Je nutná např. autorizace na LDAP serveru a aby bylo nastaveno, že si uživatel musí heslo při příštím přihlášení změnit, je nutné přidat jeden krátký příkaz.

Tento skript už funkční je, který jsem poté implementoval do ASP stránky.

Na stránky se uživatelé zatím autorizují pomocí základního ověřování a tyto údaje jsou pak použity pro připojení k LDAP.

On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
 
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
 
objConnection.Properties("User ID") = "DOMENA\Username"
objConnection.Properties("Password") = "Password"
objConnection.Properties("Encrypt Password") = TRUE
objConnection.Properties("ADSI Flag") = 3
 
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
 
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
 
objCommand.CommandText = _
    "SELECT distinguishedName FROM 'LDAP://dc=test,dc=local' WHERE objectCategory='user' " & _
        "AND sAMAccountName='" & pUsername & "'"
Set objRecordSet = objCommand.Execute
 
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    vOU = objRecordSet.Fields("distinguishedName").Value
    objRecordSet.MoveNext
Loop
 
Set objUser = GetObject ("LDAP://" & vOU)

objUser.SetPassword pPassword
objUser.Put "pwdLastSet", "0"

objUser.SetInfo

Osobně bych si moc dobře rozmyslel udělat do bezpečnosti a důvěryhodnosti AD taková vrata... obzváště ve tvém prostředí, v jakém se dle toho zdrojáku pohybuješ.

Podotázka: co je špatného na MMC snap-inu pro AD Users & Computers? Proč jej adminům nenainstaluješ lokálně?

Zpět do poradny Odpovědět na původní otázku Nahoru