In a complex network with some trusted and untrusted forests, where users can use the accounts of various woods, there are problems with changing the password, the article http://www.kovanev.net/faq/vbs/164-vbs-3 describes a good script to reset your password. In my version redesigned with a request to WINNT LDAP to view subdomains, and adds the ability to work without authentication for users from untrusted forests.
On the Web server, do the following:
1. Create a folder, eg C:\ChangePass
2. In the folder create a file containing index.html (download index.html)
3. Create user for impersonate authentication, add user to NULL group, exclude from Domain Users
4. In the folder create a file containing cp.asp (download cp.asp), add user login, password, domain
5. Download LoginAdmin.dll or create your own article: "How to impersonate a user from Active Server Pages"
6. Register the dll, eg regsvr32.exe C:\ChangePass\LoginAdmin.dll
7. In IIS console to create a website "ChangePass", specify the folder "C:\ChangePass", configure Bindings, configure https, anonymous authentication
8. When you open the page, you will see:
UPD: In some cases, the need to provide for Identity "youruser" application pool
On the Web server, do the following:
1. Create a folder, eg C:\ChangePass
2. In the folder create a file containing index.html (download index.html)
<html> <head> <title>Change User Password</title> <!--BEGIN CALLOUT A--> <HTA:APPLICATION BORDER="thin" BORDERSTYLE="sunken" CAPTION="yes" MAXIMIZEBUTTON="yes" MINIMIZEBUTTON="yes" SCROLL="no" SHOWINTASKBAR="no" SYSMENU="yes" WINDOWSTATE="normal" /> <!--END CALLOUT A--> <script language=javascript> var sampleWidth = 300; var sampleHeight = 420; window.resizeTo(sampleWidth,sampleHeight); var screenPosX = screen.Width/2 - sampleWidth/2; var screenPosY = screen.Height/2 - sampleHeight/2; window.moveTo(800, 300); </script> </head> <body> <form action="cp.asp" method="post"> <!--BEGIN CALLOUT C--> <p><font size="3">Specify your username: </font></p><input type="text" name="T1" size="20"> <!--END CALLOUT C--> <p><font size="3">Enter your current password: </font></p><input type="password" name="T2" size="20"></p> <p><font size="3">Enter a new password: </font></p><input type="password" name="T3" size="20"></p> <p><font size="3">Re-enter new password: </font></p><input type="password" name="T4" size="20"></p> <!--BEGIN CALLOUT D--> <p><input type="Submit" value="Change password" name="B3" > <input type="button" value="Cancel" name="B6" onclick=self.close()></p> <!--END CALLOUT D--> </form> </body> </html>
3. Create user for impersonate authentication, add user to NULL group, exclude from Domain Users
4. In the folder create a file containing cp.asp (download cp.asp), add user login, password, domain
<%@ language="VBScript" %> <% Dim objLogon Set objLogon = Server.CreateObject("LoginAdmin.ImpersonateUser") objLogon.Logon "youruser", "yourpassword", "youruserdomain" Set WShell = CreateObject("WScript.Shell") on error resume next Dim UserName UserName = Request.Form("T1") Const ADS_SCOPE_SUBTREE = 2 Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 10000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.CommandText = _ "SELECT distinguishedName FROM 'LDAP://hq.contoso.com' WHERE objectCategory='user' " & _ "AND samaccountname = '" & username &"'" &"" Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Do Until objRecordSet.EOF strDN = objRecordSet.Fields("distinguishedName").Value objRecordSet.MoveNext Loop Set User = GetObject("LDAP://" & strDN) objLogon.Logoff Set objLogon = Nothing Dim NewPassword Dim NewPassword2 Dim OldPassword OldPassword = Request.Form("T2") NewPassword = Request.Form("T3") NewPassword2 = Request.Form("T4") If Request.Form("T1") = "" Then Response.Write("Username can't be empty!") end if If NewPassword<>NewPassword2 Then Response.Write("ERROR. New passwords do not match.") end if if NewPassword=NewPassword2 then Err.Clear Call user.CHANGEPASSWORD (OldPassword, NewPassword) If err.number = 0 Then Response.Write("SUCCESS. New password has been saved.") end if If err.number = "-2147024810" Then Response.Write("ERROR. Wrong password!") end if If err.number = "-2147022651" Then Response.Write("ERROR. The new password does not meet the policy complexity and frequency of passwords!") end if end if %>
5. Download LoginAdmin.dll or create your own article: "How to impersonate a user from Active Server Pages"
6. Register the dll, eg regsvr32.exe C:\ChangePass\LoginAdmin.dll
7. In IIS console to create a website "ChangePass", specify the folder "C:\ChangePass", configure Bindings, configure https, anonymous authentication
8. When you open the page, you will see:
UPD: In some cases, the need to provide for Identity "youruser" application pool
This comment has been removed by the author.
ReplyDelete