Hejsan. Jag försöker få gjort en hemsida där användare med rätt behörighet (t.ex. helpdesk) kan resetta andra folks lösenord i ADt. Från min burk fungerar det utmärkt men det beror nog mest på att jag kör IIS själv. Har läst på diverse forum och sidor att min lösning troligtvis inte fungerar när man har hemsidan på en fristående IIS-server i domänen och att jag bör använda impersonation men jag har inte lyckats få ihop detta. Hittills så ser min kod ut såhär: Impersonation är något som du sätter i web.config fil, samt att du på IIS:en skall sätta in att Anynoums user inte har access. Som jag har fattat det så körs applikationen under ASP-process som inte har tillgång till olika funktioner i Active Directory, t.ex. resetta användares lösenord och därför behöver man köra med impersonation. Sen att bara ändra i web.config till <identity impersonation = "true" /> räcker inte förmodar jag? Du skall i din web.config ha följande 2 rader:Impersonation i vb.net/asp.net (hemsida för att resetta lösen)
Imports System
Imports System.DirectoryServices
Imports System.Web.Caching
Partial Class _Default
Inherits System.Web.UI.Page
' Dim UserEntry As New System.DirectoryServices.DirectoryEntry
Dim UserEntry As New DirectoryEntry
'Dim UserPath As String
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearch.Click
Dim AuthUser, AuthPass, Domain As String
'Dim UserEntry As New System.DirectoryServices.DirectoryEntry
' authLDAP(AuthUser, AuthPass)
AuthUser = txtUsername.Text
AuthPass = txtPassword.Text
Domain = txtDomain.Text
Cache("UserName") = AuthUser
Cache("UserPsw") = AuthPass
Dim oOU As New System.DirectoryServices.DirectoryEntry("LDAP://test.hoff.se", AuthUser, AuthPass, AuthenticationTypes.Secure)
UserEntry = searchUser2(oOU)
End Sub
Protected Sub btnChangePsw_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnChangePsw.Click
Dim UserID, UserPassword As String
UserID = Cache.Get("UserName")
UserPassword = Cache.Get("UserPsw")
Dim oOUChange As New System.DirectoryServices.DirectoryEntry("LDAP://test.hoff..se", UserID, UserPassword, AuthenticationTypes.Secure)
ChangeUserPsw(oOUChange)
End Sub
Public Function searchUser2(ByVal myEntry As System.DirectoryServices.DirectoryEntry)
lstResults.Items.Clear()
lblDebug.Text = ""
Try
'skapar en instans av objekten directoryentry för att komma åt LDAP
Dim mySearch As New System.DirectoryServices.DirectorySearcher(myEntry)
Dim UserEntrySearch As New DirectoryEntry
'skapar sökfiltret samt lägger till vilka egenskaper som skall läggas med i sökningen
lblDebug.Text = txtSearch.Text
mySearch.Filter = "(SAMAccountName=" & txtSearch.Text & ")"
mySearch.PropertiesToLoad.Add("cn")
mySearch.PropertiesToLoad.Add("sAMAccountName")
mySearch.PropertiesToLoad.Add("description")
'listar informationen från resultatet från sökningen
Dim result As System.DirectoryServices.SearchResult
For Each result In mySearch.FindAll()
' lblDebug.Text = result.Properties.Count.ToString
If result.Properties.Count = 0 Then
lblDebug.Text = "Användaren hittades ej"
Else
lstResults.Items.Add(result.Properties("cn")(0))
lstResults.Items.Add(result.Properties("sAMAccountName")(0))
lstResults.Items.Add(result.Properties("description")(0))
lstResults.Items.Add(result.Path.ToString)
UserEntrySearch = result.GetDirectoryEntry()
'UserPath = result.Path
End If
Next result
'returnera det aktuella objektets path
Return UserEntrySearch
'Return UserPath
Catch ex As Exception
lblDebug.Text = "fel"
Return Nothing
End Try
End Function
Public Sub ChangeUserPsw(ByVal myEntry As System.DirectoryServices.DirectoryEntry)
lstResults.Items.Clear()
lblDebug.Text = ""
Try
'skapar en instans av objekten directoryentry för att komma åt LDAP
Dim mySearch As New System.DirectoryServices.DirectorySearcher(myEntry)
Dim UserEntryChange As New DirectoryEntry
'skapar sökfiltret samt lägger till vilka egenskaper som skall läggas med i sökningen
lblDebug.Text = txtSearch.Text
mySearch.Filter = "(SAMAccountName=" & txtSearch.Text & ")"
mySearch.PropertiesToLoad.Add("cn")
mySearch.PropertiesToLoad.Add("sAMAccountName")
mySearch.PropertiesToLoad.Add("description")
'listar informationen från resultatet från sökningen
Dim result As System.DirectoryServices.SearchResult
For Each result In mySearch.FindAll()
' lblDebug.Text = result.Properties.Count.ToString
If result.Properties.Count = 0 Then
lblDebug.Text = "Användaren hittades ej"
Else
UserEntryChange = result.GetDirectoryEntry()
UserEntryChange.Invoke("setpassword", "sommar1")
UserEntryChange.CommitChanges()
'Att användaren får byta lösen vid nästa inloggning
UserEntryChange.Properties("pwdLastSet").Item(0) = -1
UserEntryChange.CommitChanges()
UserEntryChange.Close()
End If
Next result
Catch ex As Exception
lblDebug.Text = "fel"
End Try
End Sub
Protected Sub btnReset_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnReset.Click
End Sub
End ClassSv: Impersonation i vb.net/asp.net (hemsida för att resetta lösen)
-MSv:Impersonation i vb.net/asp.net (hemsida för att resetta lösen)
Det jag är ute efter är att den del av koden som ska söka och ändra en användares lösenord körs med det kontot som man loggar in med i applikationen.
Men det kanske inte behövs?
/ChristianSv: Impersonation i vb.net/asp.net (hemsida för att resetta lösen)
<authentication mode="Windows" />
<identity impersonation = "true" />
Dessa 2 rader gör att du nu kommer att exekvera din websida som den användare som loggar in på siten. Som default kommer detta vara IUSR_<<MACHNINE_NAME>> och denna person lär inte ha några rättigheter att göra det du vill. Så det du skall göra är att kryssa ut ruta: Anonumys access i Directory Security i IIS admin.
Då kommer du presenteras för en loggin ruta när du surfar till siten, om du vill slippa logga in, så skall du kryssa i 'Integrated Security'.
Detta skall räcka för att göra det du vill, så länge du har rättigheter att göra det du vill.
- M