vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
AD per LDAP (SetPassword) 
Autor: kugel
Datum: 11.03.06 18:03

Hallo,
ich arbeite zur Zeit an einem etwas aufwändigerem Programm zur Benutzerverwaltung an unserer Schule. Unter anderem möchte ich per LDAP auf unseren DC (W2K-AS) connecten, und fuer einen User ein neues Passwort setzen. Ansich ja nicht sonderlich spektakulär ...allerdings funktioniert das ganze nur, wenn ich das Programm lokal auf dem DC ausführe, was ja nicht Sinn der Sache ist...

Ich halte mich eigentlich streng an das Codebeispiel in der msdn zum 'IADsUser::SetPasswordadsi.iadsuser_setpassword-Methode' unter http://msdn2.microsoft.com/de-de/library/ms180915.aspx

Dim entry As DirectoryEntry = New DirectoryEntry( _
                                   "LDAP://" & My.Settings.provider, _
                                   "myadminuser", "myadminpass")
Dim search As DirectorySearcher = New DirectorySearcher(entry)
search.Filter = "(SAMAccountName=" & userarray(1) & ")" ' userarray(1) enthält 
' einen definitiv existenten SAMAccountName
Dim result As SearchResult = search.FindOne()
Dim user As DirectoryEntry = result.GetDirectoryEntry()
 
'Dim objUser = GetObject(result.Path)              
'objUser.Setpassword("123")
'objUser.Setinfo()
 
user.Invoke("SetPassword", New Object() {PassAll.Text})
user.CommitChanges()
System.Reflection.TargetInvocationException wurde nicht behandelt.
Message="Ein Aufrufziel hat einen Ausnahmefehler verursacht."
Source="System.DirectoryServices"
StackTrace:
bei System.DirectoryServices.DirectoryEntry.Invoke(String methodName, Object[] args)

Jetzt das interessante, die InnerException:
{System.IO.FileNotFoundException}
{"Der Netzwerkpfad wurde nicht gefunden. (Ausnahme von HRESULT: 0x80070035)":Nothing}

Da der Code allerdings lokal am DC wie erwähnt problemlos funktioniert, und ich ebenso von Extern über selbigen DirectoryEntry (user) den Account z.b. durch Neusetzen von user.Properties("useraccountcontrol").Value mithilfe der Flag ADS_UF_ACCOUNT_DISABLED völlig problemlos deaktivieren kann, will ichs irgendwie auf irgendwelche Sicherheitsvorkehrungen schieben...

der DirectoryEntry user hat auch ne Option PasswordEncoding, die kann man auf PasswordEncodingMethod.PasswordEncodingClear setzten, per default ist sie auf PasswordEncodingMethod.PasswordEncodingSsl; dementsprechend wird auch user.PasswordPort auf 389 gesetzt, wenn Encoding auf Clear steht (sonst 636 fuer SSL). Allerdings hat das Setzen von PasswordEncoding auf Clear folgenes gebracht:

Am DC:
System.Runtime.InteropServices.COMException (0x80005008): Exception from HRESULT: 0x80005008 at System.DirectoryServices.Interop.UnsafeNativeMethods.IAdsObjectOptions.SetOption(Int32 flag, Object varValue) at System.DirectoryServices.DirectoryEntryConfiguration.set_PasswordEncoding(PasswordEncodingMethod value)
.. das deutet doch darauf hin, dass fuer Setpassword eine Verbindung über SSL verpflichtend ist?

Von Remote: TargetInvocationException bleibt, InnerException: {"Der Server kann die Anforderung nicht ausführen. (Ausnahme von HRESULT: 0x80072035)"}

Hab das ganze auch nochmal über ADSi probiert:
Dim objUser = GetObject(result.Path)
objUser.Setpassword("123")
objUser.Setinfo()
selbes Ergebnis (läuft vom DC, aber nicht von Remote)

Und schließlich hab ich noch mit den AuthenticationType rumgespielt (DirectoryServices.DirectoryEntry.AuthenticationType) .. d.h. mal vom Default (Dezimal 129) auf AuthenticationType.Secure gesetzt... auch ohne Erfolg.

Langsam glaube ich, dass es am DC liegt. Muss ich da vorher n SSL-Zertifikat o.ä. erstellen, bevor das funktioniert? Kann ich am DC nicht abstellen, dass ich SetPassword nur über SSL machen darf? Zumindestens am TCP-Zeug kanns mE nach nicht liegen, also dass der PasswordPort 636 nicht erreichbar waere. Hab mal versucht mir den Traffic mit Ethereal anzugucken... (liegt bei einer "Netzwerkpfad wurde nicht gefunden"-Exception ja nahe), hab allerdings nichts 'auffälliges' finden koennen.

Ich hoffe dass noch irgendwer ne' Idee hat...
denn ohne, dass ich Passwörter setzten koennte, waere das ganze Programm ziemlich sinnlos, bzw nur über RDP auf den DC sinnvoll nutzbar.

Vielen Dank und einen schoenen Samstagabend / Sonntag,
kugel

PS: ich arbeite am DC Lokal mit demselben Account, der sonst auch als "myadminuser" dem DirectoryEntry übergeben wird [Domänen-Admin] .. somit lässt sich eine Rechte-Geschichte auch ausschließen...
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
AD per LDAP (SetPassword)5.798kugel11.03.06 18:03
Re: AD per LDAP (SetPassword)4.051ModeratorDaveS12.03.06 09:04
Re: AD per LDAP (SetPassword)4.016kugel13.03.06 23:59
Re: AD per LDAP (SetPassword)3.885ModeratorDaveS14.03.06 09:18
Re: AD per LDAP (SetPassword)4.125kugel14.03.06 23:02

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel