skid
Goto Top

User im AD suchen

Hallo,

bin auf der Suche nach einer Möglichkeit mit VB im AD einen User zu finden wenn ich vorher den Anmeldenamen mitgebe.

Das ganze soll dazu dienen die Terminal Server Eigenschaften eines Benutzers auszulesen.

Ich gebe dazu den Anmeldenamen ein und das Skript soll mir den User im gesamten AD suchen und die TS-Eigenschaften ausgeben.

Habe es bisher geschafft mit:

Set objUser = GetObject("LDAP://cn=" & struser &" ,ou=Useranlage,ou=Anwender,dc=meine,dc=domaene,dc=de")  

struser = Username

Wobei bei der Lösung der Pfad zum User bereits vorgegeben ist.
Gibt es da evtl. eine Möglichkeit mit subtree oder so ?

Gruss
SKID

Content-ID: 40814

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

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

Biber
Biber 25.09.2006 um 22:11:02 Uhr
Goto Top
Moin skid,
ich bin da auch nur Laie, aber IMHO geht es nur über ADO-Datenbankabfrage.
Aber ich lasse mir gern einen kürzeren Weg zeigen..

Wenn Du den Accountnamen kennst, dann sollte es so gehen:
'---------snipp GetAnUser.vbs  
Set objConnection = CreateObject("ADODB.Connection")  
Set objCommand    = CreateObject("ADODB.Command")  
Set objRootDSE = GetObject("LDAP://RootDSE")  
strDNSDomain = objRootDSE.Get("defaultNamingContext")  
objConnection.Open "Provider=ADsDSOObject;"  
samAccountname = wscript.arguments(0)
objCommand.ActiveConnection = objConnection
objCommand.CommandText = "<LDAP://" & strDNSDomain & ">;(&(objectCategory=User)(samAccountName=" & samAccountName & "));distinguishedName;subtree"  
                         
Set objRecordset = objCommand.Execute
If objRecordset.RecordCount = 1 Then    
    wscript.echo objRecordSet.fields("distinguishedName")  
end if
'---------snipp GetAnUser.vbs  

...wobei ich alle Schnörkel weggelassen habe.
Ein Accountname als Argument wird erwartet. Keine Fehlerbehandlung.
Beispiel:
>cscript //nologo getAnUser.vbs Biber03
CN=BIBER03,CN=Users,DC=bla,DC=blubb

Gruß
Biber
skid
skid 26.09.2006 um 09:02:54 Uhr
Goto Top
Moin Biber,

dank Dir für die schnelle Antwort und Lösung.

ich bekomme jetzt zwar den distinguishedName ausgegeben aber wie kann ich jetzt auf einzelne Objekte des Users zugreifen ?

So wie ich es eigentlich vorhatte mit

Set objUser = GetObject("LDAP://cn=" & struser &" ,ou=Useranlage,ou=Anwender,dc=meine,dc=domaene,dc=de")  

hätte ich hergehen können und mit

MsgBox "Terminal Services Home Drive: " & _  
    objUser.TerminalServicesHomeDrive
MsgBox "Terminal Services Profile Path: " & _  
    objUser.TerminalServicesProfilePath

mir die einzelnen Objekte einzeln anzeigen können.

Aber wie funktioniert das mit der ADO-Datenbankabfrage ?

Gruss
SKID
Biber
Biber 26.09.2006 um 09:44:10 Uhr
Goto Top
Tja, skid,
reicht es dafür nicht, wenn Du die Properties, die Du abfragen/auswerten willst, in die Command.Text-Anweisung mit einbaust?

objCommand.CommandText = "<LDAP://" & strDNSDomain & ">;_
(&(objectCategory=User)(samAccountName=" & samAccountName & ")); _
distinguishedName,TerminalServicesHomeDrive, TerminalServicesProfilePath;subtree"

Wie gesagt, ich bin da auch Laie und was ich wirklich gut kann, ist Kochen...

Gruß
Biber
skid
skid 26.09.2006 um 10:24:05 Uhr
Goto Top
Nun ja......

Das habe ich schon probiert - funktioniert aber nur zum Teil.

Ich kann mir z.B. so den normalen Profilpfad anzeigen lassen aber
nicht die TerminalServer Einträge.

Warum das nicht geht weiß ich aber auch nicht.
Bekomme die Fehlermeldung

Provider: Unbekannter Fehler

Diese Einträge müssen im System wohl irgendwie anders Behandelt werden als die anderen ?!

Wie - Kochen kannst Du auch ?? face-wink

Gruss
SKID
Biber
Biber 26.09.2006 um 19:01:26 Uhr
Goto Top
Hmm, skid,

so was lässt mir ja auch keine Ruhe... habe mich da ein wenig eingelesen.

Es ist in der Tat so, dass unterschiedliche Informationen über die unterschiedlichen ADS-Interfaces bzw. Provider sicht- und bearbeitbar sind.

Punkt.

Heißt zum Beispiel: Die Antwort auf Deine Teilfrage: "Kann ich irgendwie an den Pfad des Users kommen, wenn ich nur den Accountnamen weiß?" ...
diese Frage war schon von mir richtig beantwortet (allerdings ohne selbst alle Hintergründe zu kennen).

Für diesen Zweck kann ich mir ein objUser über den Provider ADsDSOObject holen. Dieses Object hat auch Eigenschaften, die ich auswerten und auch neu setzen kann - aber ist nicht identisch mit dem objUser, das ich über das andere Interface, über den vollständigen Userpfad mit OU und DC bekomme.
Diesen Unterschied kannst Du auch über GUI-Tools nachvollziehen.

Das "schmalbrüstigere" M$-Tool nennt sich auf ausländisch "Active Directory Users and Computers" und das umfassendere "ADSIEdit.exe". Sollten beide beim 2003Server dabei sein.

Der langen Schreibe kurzer Sinn:
-Wenn Du "nur" den Account weißt: der ist in der Domäne eindeutig. Also lässt der sich wie oben von mir skizziert als ein Datensatz rausfieseln - so dass Du den DistinguishedName rauslutschen kannst.

Mit diesem wiederum musst Du dann Dein "vollständiges" User-Object holen, also mit frisch gelesenen OU und DC-Infos nochmal
Set objUser = GetObject("LDAP://cn=" & struser &" ,ou=" & TeilstringAusDistinguishedName, x, y) & ", dc=" & _   
TeilstringAusDistinguishedName, i, j) & ", dc=" .....)  

Nur bei diesem UserObject kannst Du diese TerminalServices-Attribute oder auch den DisplayName ändern (das zweite war auch neulich hier gefragt worden).

Gruß
Biber
P.S. Ja, kochen kann ich auch. Dauert aber meist genauso lange...
skid
skid 27.09.2006 um 09:28:11 Uhr
Goto Top
Moin Biber,

ja, das ist schon Übel mit den verschiedenen Providern und dem ganzen hin und her.

Werde es mal mit dem Bsp. von oben versuchen meine Daten rauszubekommen.

Nur weiß ich im Moment noch nicht was Du meinst mit:
ou=" & TeilstringAusDistinguishedName, x, y  
und
ou=" TeilstringAusDistinguishedName, i, j  

Gruss
SKID
Biber
Biber 27.09.2006 um 09:39:24 Uhr
Goto Top
Moin skid,
ich meinte, dass Du Dir die Infos aus
.distinguishedName = CN=BIBER03,CN=Users,DC=bla,DC=blubb
per Substring-Funktion ausliest und für die "zweite" UserObject-Abfrage benutzt.

Gruß
Biber
skid
skid 27.09.2006 um 11:10:02 Uhr
Goto Top
Hi Biber,

kaum zu glauben aber es funktioniert face-smile

Naja, da muss man halt zwischen den unterschiedlichen ADS-Interfaces bzw. Provider hin und her springen.

Jetzt haben wir wieder mal was dazugelernt face-wink

Danke für die Hilfe !


Gruss
SKID
Biber
Biber 27.09.2006 um 17:14:29 Uhr
Goto Top
Jetzt haben wir wieder mal was dazugelernt..
Jepp, skid,
ich jedenfalls auch face-wink

Gruß
Biber