farelm
Goto Top

AD User anlegen - Passwort wird nicht gesetzt - Visual Studio 2008

Hallo,

für meine Firma schreibe ich ein Programm in Visual Basic (in Visual Studio 2008 auf Windows SBS 2003), welches das anlegen von Usern im Active Directory erleichtern soll.
Allerdings wird dabei nie das Passwort gesetzt -> Man kann sich also mit diesem User OHNE Passwort in der Domäne anmelden.
Dass das absolut ungut ist, ist klar, aber ich schaff es einfach nicht, diesen Fehler zu beheben. Hab schon so ziemlich alles versucht.

Hier mal der Code der das anlegen betrifft:

cname = "CN=" & txt_nachname.Text & " " & txt_vorname.Text  

        Dim objParent As New DirectoryServices.DirectoryEntry(userdestination, "administrator@baierjj.local", "[entfernt]", DirectoryServices.AuthenticationTypes.Secure)  
        Dim thepasswort As String = "[entfernt]2"  

        objChild = objParent.Children.Add(cname, "user")  
        objChild.Password = thepasswort
        objChild.Properties("userPrincipalName").Add(txt_logonname.Text & ouaddition)  
        objChild.Properties("SAMAccountName").Add(txt_logonname.Text)  
        objChild.Properties("givenname").Add(txt_vorname.Text)  
        objChild.Properties("sn").Add(txt_nachname.Text)  
        objChild.Properties("displayname").Add(txt_nachname.Text & " " & txt_vorname.Text)  
        objChild.Properties("profilePath").Add(txt_profilePath.Text)  
        objChild.Properties("homeDirectory").Add(txt_homedirectory.Text)  
        objChild.Properties("homeDrive").Add("U:")  
        objChild.Properties("scriptPath").Add(txt_scriptPath.Text)  
        objChild.Properties("mail").Add(txt_mail.Text)  
        objChild.Properties("l").Add(txt_city.Text)  
        objChild.Properties("st").Add(txt_state.Text)  
        objChild.Properties("postalcode").Add(txt_plz.Text)  
        objChild.Properties("co").Add(txt_country.Text)  
        'objChild.Properties("streetAddress").Add(txt_street.Text)  
        objChild.Properties("extensionAttribute1").Add(extattri1)  
        objChild.CommitChanges()

Ich bin eigentlich noch Anfänger in VB und der Teil da oben ist auch noch nicht ganz fertig, bzw ne Baustelle. Vielleicht weiß auch jemand, warum ich die Eigenschaft "streetAddress" nicht setzen kann...

Content-Key: 82531

Url: https://administrator.de/contentid/82531

Printed on: April 18, 2024 at 13:04 o'clock

Member: SvenGuenter
SvenGuenter Mar 07, 2008 at 10:22:25 (UTC)
Goto Top
Zwei Fragen.

1. Welcher Server
2. Du redest einmal von Passwort und einmal von Streetadress was denn nun?
Member: FarelM
FarelM Mar 07, 2008 at 10:24:24 (UTC)
Goto Top
Als Betriebssystem nutze ich einen Windows Small Business Server 2003 R2 Premium.

Im Prinzip gehts mir ums Passwort. Dass die Eigenschafft "streetAddress" nicht gefunden wird, ist eher nebensächlich.

Vielleicht sollte ich noch hinzufügen, dass beim Passwort keinerlei Fehlermeldung kommt.
Member: SvenGuenter
SvenGuenter Mar 07, 2008 at 12:22:16 (UTC)
Goto Top
japp weil du es nicht ändern oer auslesen kannst per software.


Die ADS blockt jeden zugriff von aussen auf die DB fürs passwort.
Du musst da schon dann einige andere Sachen machen um da was zu ändern. Aber da wirst du hier keine Auskünfte drüber bekommen da diese Infos auch zum Hacken von Passwörtern führen kann.
Habe diese Erfahrung auch gemacht und dann mit viiiiiel Googeln die Antwort gefunden. Kann dir nur den Tip geben das du die MSDN durchforsten solltest. Da findest du Ansätze zu diesem Problem

Gruß

Sven
Member: FarelM
FarelM Mar 07, 2008 at 12:37:53 (UTC)
Goto Top
Okay Danke. Dann werd ich erstmal nen Workaround machen, der einen gleich zum User im ADS bringt, damit man das PW schnell ändern kann.

Schönen Tag noch
Member: SvenGuenter
SvenGuenter Mar 07, 2008 at 12:46:05 (UTC)
Goto Top
Da hast du schlechte karten wenn du nciht die funktionen der ADS nimmst. Du wirst so ohne weiteres nicht das Passwort eines Users ändern oder löschen können.
Mitglied: 60730
60730 Mar 07, 2008 at 13:10:08 (UTC)
Goto Top
Moinsen,

dieses Script stammt nicht von mir, ich habe es lediglich an unsere Bedürfnisse angepasst.
Natürlich habe ich einige Spuren verwischt und es etwas erweitert.

Daher bitte mal genau durchschauen.

Das Script legt nicht nur einen User an, der ein Passwort hat - sondern auch dessen Homeverzeichnis und setzt die rechte für den User und die OU IT.

Ich weiß, das sollte besser dokumentiert sein, aber ich hab grad keine Zeit und dir drängst ja...

Domain.vbs
dim rootDSE
set rootDSE = GetObject("LDAP://RootDSE")  
domainname=rootDSE.Get("defaultnamingcontext")  

set domain = GetObject("LDAP://" & domainname)  

' Popup Benutzername  
Vname = InputBox("Vorname:       ", "    Neuen Benutzer in Domain erstellen")  
NName = InputBox("Nachname:   ", "    Neuen Benutzer in Domain erstellen")  


Name =  Vname & "." & NName  
logon = Name & "@Domain"  
mail = Name & "@administrator.de"  
home ="\\server003\user\" & Name  

' Popup Telefonnummer: 00000000  
intTel = InputBox("Telefondurchwahl:  +49 0000 00", "    Neuen Benutzer in Domain erstellen")  

Telefon = "+49 00 00 00" & intTel  

' Popup Personalnummer in Feld Beschreibung  
Perso = InputBox("Personalnummer", "    Neuen Benutzer in Domain erstellen")  

If MsgBox("Name:                  "&Name& vbCrLf & "Telefon:               " & Telefon & vbCrLf & "Personalnummer: " & Perso&"" ,  VbExclamation or VbYesNo, "    Soll dieser Neue Benutzer in Domain erstellt werden?")= vbYes then  

' Ausgabe in Text  
WScript.Echo "Name" &"," & "Telefon" &"," & "Personalnummer"  
WScript.Echo Name & "," & intTel & "," & Perso  


' Ordner anlegen  
Set WshShell = WScript.CreateObject("WScript.Shell")  
Return = WshShell.Run("cmd /c md \\server003\user\" & Name)  
Return = WshShell.Run("cmd /c md \\server001\profil\" & Name)  
Set WshShell = Nothing 

Set usr = domain.Create("user", "CN=" & Name & ",OU=User ,OU=Domain")  
usr.Put "samAccountName", Name  
usr.Put "givenName", Vname  
usr.Put "sn", Nname  
usr.Put "DisplayName", Name  
usr.Put "homeDirectory", home  
usr.Put "homeDrive", "n:"  
usr.Put "userAccountControl", 512  
usr.Put "profilePath","\\server001\profil\" & Name  
usr.Put "scriptPath", "login.cmd"  
usr.Put "telephoneNumber", Telefon  
usr.Put "description" , Perso  
usr.Put "postalCode", "0815"  
usr.Put "street" , "Lindenstrasse"  
usr.Put "userPrincipalName", logon  
usr.Put "mail", mail  
usr.Put "wWWHomePage", "https://administrator.de"  
usr.SetInfo
usr.SetPassword "xxxxxx"	  

WScript.Sleep 12000
WScript.Sleep 12000

Set WshShell = WScript.CreateObject("WScript.Shell")  
Return = WshShell.Run("%COMSPEC% /c Echo j| cacls \\server001\profil\" & Name & " /t /c /g Domain\" & Name & ":F")  
Return = WshShell.Run("%COMSPEC% /c Echo j| cacls \\server001\profil\" & Name & " /t /c /e /g Domain\g__it:F")  
Return = WshShell.Run("%COMSPEC% /c Echo j| cacls \\server003\user\" & Name & " /t /c /g Domain\" & Name & ":F")  
Return = WshShell.Run("%COMSPEC% /c Echo j| cacls \\server003\user\" & Name & " /t /c /e /g Domain\g__it:F")  
Set WshShell = Nothing

Else
End If
Member: DannyT
DannyT Oct 20, 2008 at 11:21:06 (UTC)
Goto Top
Hi,

Ich hab ne Antwort und ne Frage (weiter unten)

ist zwar schon etwas älter der Beitrag aber ich hab ziemlich das gleiche Problem gehabt (das Passwort betreffend) und so gelöst: Direkt nach dem commit vom User anlegen einfach folgenden Code (angepasst) einfügen:

        Try 'Hier wird das Passwort des Users gesetzt  
            Dim searcher As New System.DirectoryServices.DirectorySearcher() 'Suchfunktion  
            searcher.Filter = "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" & txt_logonname.Text & "))" 'Suchkriterien  
            searcher.PropertiesToLoad.Add("adspath")  
            Dim Result As System.DirectoryServices.SearchResult = searcher.FindOne()
            Dim usr As New DirectoryServices.DirectoryEntry(Result.Path)
            usr.Invoke("SetPassword", password) 'Passwort wird übergeben  
            usr.CommitChanges() 'Änderungen werden gespeichert  
        Catch ex As Exception
            MsgBox("Beim setzen des Passworts ist ein Fehler aufgetreten, bitte setzen Sie es manuell zurück." & Environment.NewLine & Environment.NewLine & ex.Message, MsgBoxStyle.Critical, "Fehler beim Setzen des Passworts")  
        End Try



Nun zu meiner Frage:

Ich mache auch ein Programm zum anlegen eines Users im AD und mein Code sieht ähnlich aus wie der von farelm.
Allerdings muss man dafür ja Admin Username und Passwort eingeben, welche ich aus einer vorher ausgeführten Login-Form auslese.

Nun hab ich aber das Problem, dass ich keine Ahnung habe, wie ich überprüfe ob die Angaben der Loginform auch stimmen.
So wies jetzt steht, merkt man ein falsch eingegebenes Passwort quasi erst dann wenn man den User anlegen will.

Hat vielleicht jemand ne Ahnung wie man das lösen kann?
Oder gibts noch ne besser Methode?

Notfalls könnte man ja beim anmelden irgendwie versuchen, mit den eingegebenen Anmelde-Parametern etwas im AD zu modifizieren - aber keine Ahnung wie, was und ob das überhaupt funktioniert.

Gruß