Hej! inparametern på directoryentry bör vara en sökväg. Sökvägen får du nog enklast ut om du gör en search först och directorysearcher.path skickas in till directoryentryt. Tack, Användarkontot du skickar in, har den rätt att se / ändra dessa uppgifter på andras konton? Användarkontot är samma som jag använder när jag resettar lösenord och låser upp konton direkt på dc:n. Länken med koden från codeproject har tagits bort och jag har inte inte hittat någon som använder hela koden (lösenordskoden finns) vid googling, så mitt nästa försök blir med e-boken. I korta drag hade jag inte varit uppmärksam på result som enskild företeelse och som collection (results). Verkar också som att PropertiesToLoad måste finnas med, dvs den egenskap man vill titta på för kontot.Credentials med DirectoryServices
Vill göra en webbsida för upplåsning av konton.
Denna kod har jag bl.a. provat:
Try
Dim uEntry As New DirectoryEntry("kontot")
With uEntry
uEntry.Properties("LockOutTime").Value = 0
End With
uEntry.CommitChanges()
uEntry.Close()
'uEntry.Invoke("ChangePassword", New Object() {"old", "new"})
'uEntry.CommitChanges()
Catch ex As Exception
End Try
Som synes så ligger även ett lösenordsbyte med och är utremmat. Det fungerar fint.
Att ett utlåst konto inte kan låsa upp sig själv är jag på det klara med.
Vad jag inte har listat ut är hur jag skickar med vilket konto som utför sökningen. Är inloggad med tillräckliga rättigheter när jag kör koden och har även provat impersonate=true.
Försökt googla mig till det och en del anser att unlock inte ligger i AD utan i flaggor, blir inte riktigt klok på det och all hjälp mottages tacksamt för jag blir mest förvirrad av den information jag tar till mig.
Den kod jag lagt här förstår jag men inte hur jag får tillräckligt med rättigheter.
//Ann
Sv: Credentials med DirectoryServices
Sv:Credentials med DirectoryServices
Sökvägen har jag. Det fungerar att hitta kontot men jag får inte låsa upp det.
Här är en function jag inte får att fungera. Googling ger vid handen att anledningen till att den returerar samma oavsett om kontot är låst eller inte beror på att jag söker med det kontot som inte kan ge uppgiften för att det är låst.
Function GetIfLockedUser(ByVal path As String) As Boolean
Dim strError As String
Try
Dim child As New System.DirectoryServices.DirectoryEntry(path)
Dim searcher As New DirectorySearcher(child)
Dim result As SearchResult
Dim userEntry As DirectoryEntry
searcher.Filter = "(SAMAccountname="låstakontot")"
searcher.CacheResults = False
result = searcher.FindOne
userEntry = result.GetDirectoryEntry
With userEntry
If userEntry.Properties("LockOutTime").Value = 0 Then
Return False
Else
Return True
End If
End With
Catch ex As Exception
strError = ex.ToString
End Try
End Function
Autentiseringen i koden som anropar funktionen:
rootDSE = New DirectoryEntry(String.Format("LDAP://{0}/rootDSE", _
dcDNS), Username, Password, AuthenticationTypes.Secure Or _
AuthenticationTypes.Sealing Or AuthenticationTypes.ServerBind)
Där ser variabeln för path ut så här:
Dim path As String = "LDAP://vårdomän"
//Ann
Sv: Credentials med DirectoryServices
Sv:Credentials med DirectoryServices
Har hittat en e-bok som tydligen beskriver ämnet i kapitel 10. :) http://www.directoryprogramming.net
Googlade vidare och hittade ett foruminlägg där de skriver att boken beskriver bra men att det är knepigt, vilket är den allmänna uppfattningen verkar det som när jag googlar. Det finns ett annat angreppssätt som handlar om att titta på flaggor i stället men jag är inte beredd att byta infallsvinkel riktigt ännu, ska bli spännande att läsa bokens exempel med andra ord LOL.
Tänkte också koppla upp mig och leta rätt på länken till koden jag utgick från i början och posta här. Har inte fått den att spela rakt av och det kanske är lätt för ett tränat öga att se varför.
Så får jag se vad det blir utav det. Hursomhelst så är jag tacksam för hjälp och kommer posta vidare om hur det fortlöper.
//AnnSv: Credentials med DirectoryServices
Så här såg koden ut före jag tog bort var funktionen GetIfLockedUser anropades - jag kan inte för mitt liv komma ihåg var. Tog bort den då jag bara gjorde för lösenord initialt och sidan finns ju kvar (ack vad jag bedrog mig LOL).
Någon som direkt ser hur det ska göras? dying to know :).
Det jag vill göra är alltså att låsa upp ett låst konto via ett webbgränssnitt. I den här koden nöjer jag mig med att få rätt svar, dvs om kontot är låst eller inte.
Imports System.DirectoryServices
Partial Class _Default
Inherits System.Web.UI.Page
Function GetIfLockedUser(ByVal path As String) As Boolean
Dim strError As String
Try
Dim child As New System.DirectoryServices.DirectoryEntry(path)
Dim searcher As New DirectorySearcher(child)
Dim result As SearchResult
Dim userEntry As DirectoryEntry
searcher.Filter = "(SAMAccountname=Username)"
searcher.CacheResults = False
result = searcher.FindOne
userEntry = result.GetDirectoryEntry
With userEntry
If userEntry.Properties("LockOutTime").Value = 0 Then
Return False
Else
Return True
End If
End With
Catch ex As Exception
strError = ex.ToString
End Try
End Function
Function AuthenticateUser(ByVal path As String, ByVal Username As String, ByVal oldPassword As String) As Boolean
Dim direntry As New DirectoryEntry(path, Username, oldPassword)
Try
Dim nat As Object
'if the NativeObject can be created using those credentials
'then they are valid
nat = direntry.NativeObject
Return True
Catch
Return False
End Try
End Function
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdPass.Click
Dim dcDNS As String = "SERVER-NAMN"
Dim rootDN As String
Dim rootDSE As DirectoryEntry
Dim searchRoot As DirectoryEntry
Dim userEntry As DirectoryEntry
Dim searcher As DirectorySearcher
Dim results As SearchResultCollection
Dim result As SearchResult
Dim oldPassword As String = txtOldPass.Text
Dim newPassword As String = txtNewPass.Text
Dim Username As String = txtUser.Text
Dim path As String = "LDAP://DOMÄN"
Try
'=========================================================================
'Here I am binding the directory to the root with the current
'users name and password instead of using an admin login to authenticate
'The reason for this is that the users are not admin and only admin
'can use the setpassword invoke method. thus, authenticated users will
'use the change password method
'note the authenicationtypes here
'you need to either use SecureSocketsLayer or Kerberos (Secure + Sealing)
result = Nothing
rootDSE = New DirectoryEntry(String.Format("LDAP://{0}/rootDSE", _
dcDNS), Username, oldPassword, AuthenticationTypes.Secure Or _
AuthenticationTypes.Sealing Or AuthenticationTypes.ServerBind)
rootDN = DirectCast(rootDSE.Properties("defaultNamingContext").Value, String)
searchRoot = New DirectoryEntry(String.Format("LDAP://{0}/{1}", _
dcDNS, rootDN), Username, oldPassword, AuthenticationTypes.Secure Or _
AuthenticationTypes.Sealing Or AuthenticationTypes.ServerBind)
'==================================================================
'------------------------------------------------------------------------
'Find the user by their username in the directory using the
'DirectorySearcher()
searcher = New DirectorySearcher(searchRoot)
searcher.Filter = String.Format("sAMAccountName={0}", Username)
searcher.SearchScope = SearchScope.Subtree
searcher.CacheResults = False
results = searcher.FindAll
'-------------------------------------------------------------------------
'*****************************************************
For Each result In results
'only use this method on .NET 1.1 or higher
'otherwise, get the adsPath value and build a new
'DirectoryEntry with the supplied credentials
userEntry = result.GetDirectoryEntry()
Exit For
'this is redundant because sAMAccountName is unique
'in the domain, but it is done for clarity
'Bind the user's DirectoryEntry (found from result search)
Next
result = Nothing
userEntry = result.GetDirectoryEntry()
If userEntry Is Nothing Then
lblInfo.Text = "Ogiltigt användarnamn!"
Exit Sub
End If
'Invoke the ChangePassword method (not the SetPassword method, since that
'is used by admins to reset a password)
userEntry.Invoke("ChangePassword", New Object() {oldPassword, newPassword})
userEntry.CommitChanges()
'****************************************************
lblInfo.Text = "<b>SUCCESS</b>"
'If Not Session("User") Is Nothing Then
' txtuser.Text = CStr(Session("User"))
' GetUserPasswordADInfo(CStr(Session("User")))
'Else
' GetUserPasswordADInfo(Trim(txtuser.Text))
'End If
Catch ex As Exception 'System.Reflection.TargetInvocationException
If AuthenticateUser(path, Username, oldPassword) = True Then
lblInfo.Text = "TRYCKFELSNISSE"
Else
lblInfo.Text = "AD FÖRHINDRAR"
End If
Finally 'these prevent other memory leaks
userEntry = Nothing
If Not userEntry Is Nothing Then userEntry.Dispose()
results = Nothing
If Not results Is Nothing Then results.Dispose()
searcher = Nothing
If Not searcher Is Nothing Then searcher.Dispose()
searchRoot = Nothing
If Not searchRoot Is Nothing Then searchRoot.Dispose()
rootDSE = Nothing
If Not rootDSE Is Nothing Then rootDSE.Dispose()
End Try
End Sub
End Class
Sv:Credentials med DirectoryServices
Fick ordning på det till sist:
<code:asp.net>
Imports System.DirectoryServices
Partial Class upplas
Inherits System.Web.UI.Page
Function AuthenticateUser(ByVal path As String, ByVal Username As String, ByVal Password As String) As Boolean
Dim direntry As New DirectoryEntry(path, Username, Password)
Try
Dim nat As Object
'if the NativeObject can be created using those credentials
'then they are valid
nat = direntry.NativeObject
Return True
Catch
Return False
End Try
End Function
Protected Sub cmdPass_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdPass.Click
Dim dcDNS As String = "DC"
Dim rootDN As String
Dim rootDSE As DirectoryEntry
Dim searchRoot As DirectoryEntry
Dim userEntry As DirectoryEntry
Dim searcher As DirectorySearcher
Dim results As SearchResultCollection
Dim result As SearchResult
Dim Password As String = txtPass.Text
Dim Username As String = txtUser.Text
Dim path As String = "LDAP://domain"
Dim AccountLocked As String = "låstakontot" 't'nkte delegera via comboboxar till olika konton.
Dim FilterStart As String = "(SAMAccountName="
Dim FilterSlut As String = ")"
Dim Filtering As String = FilterStart + AccountLocked + FilterSlut
Try
result = Nothing
rootDSE = New DirectoryEntry(String.Format("LDAP://{0}/rootDSE", _
dcDNS), Username, Password, AuthenticationTypes.Secure Or _
AuthenticationTypes.Sealing Or AuthenticationTypes.ServerBind)
rootDN = DirectCast(rootDSE.Properties("defaultNamingContext").Value, String)
searchRoot = New DirectoryEntry(String.Format("LDAP://{0}/{1}", _
dcDNS, rootDN), Username, Password, AuthenticationTypes.Secure Or _
AuthenticationTypes.Sealing Or AuthenticationTypes.ServerBind)
searcher = New DirectorySearcher(searchRoot)
searcher.Filter = Filtering
searcher.SearchScope = SearchScope.Subtree
searcher.CacheResults = False
searcher.PropertiesToLoad.Add("LockOutTime")
searcher.PropertiesToLoad.Add("cn") 'kan användas för ett bättre meddelande vid resultat
result = searcher.FindOne
userEntry = result.GetDirectoryEntry()
If userEntry Is Nothing Then
lblInfo.Text = "Kontot du vill låsa upp verkar inte finnas!" 'detta bör inte kunna hända om de läggs i combobox, hämtade från AD eller inlagda via kod
Exit Sub
End If
If result.Properties("LockOutTime").Item(0) > 0 Then
userEntry.Properties("LockOutTime").Value = 0
userEntry.CommitChanges()
End If
lblInfo.Text = result.Properties("cn").Item(0) & " är upplåst"
Catch ex As Exception
If AuthenticateUser(path, Username, Password) = True Then
lblInfo.Text = "Detta är ett felmeddelande." 'bör inte bli detta fel
Else
lblInfo.Text = "Din inloggning lyckades inte!"
End If
userEntry = Nothing
If Not userEntry Is Nothing Then userEntry.Dispose()
results = Nothing
If Not results Is Nothing Then results.Dispose()
searcher = Nothing
If Not searcher Is Nothing Then searcher.Dispose()
searchRoot = Nothing
If Not searchRoot Is Nothing Then searchRoot.Dispose()
rootDSE = Nothing
If Not rootDSE Is Nothing Then rootDSE.Dispose()
End Try
End Sub
End Class
</code>
Så långt är jag glad, nu gäller det att få detta http://support.microsoft.com/?kbid=294952 att fungera också.
//Ann