Jump to content
Sign in to follow this  
notesuser3

Abfrage von Objekten der ADS mit einer ADO-Connection

Recommended Posts

Hallo Leute,

 

ich bin inzwischen etwas verwirrt. Folgendes Problem möchte ich lösen:

 

Ich möchte eine Abfrage innerhalb der ADS durchführen, bei der nach einem bestimmten Computer gesucht wird. Nach dem ich mir die TechNet Artikel von WMI und ADSI angesehen habe stehe ich vor der ersten Frage, mit welchem der beiden Techniken solle ich den arbeiten? Ich wollte es zunächst mit ADSI versuchen und das LDAP-Verzeichnis abfragen. Nun habe ich die Frage wie gehe ich vor, wenn ich es mit einer ADO-Connection mit Hilfe von SQL-Statements machen will.

 

Hat hier jemand ein Beispiel? Ich habe nur Bespiele bei denen der LDAP-Dialekt verwendet wird, den möchte ich nicht verwenden. Sicherlich wird gefragt warum, daher gleich die Antwort: Mit SQL-Statements kenne ich mich besser aus. Nur weiß ich noch nicht, wie ich den an das LDAP übergebe.

 

 

Hier ein Beispiel

 

Set objConnection = CreateObject('ADODB.Connection')

objConnection.Open 'Provider=ADsDSOObject;'

Set objCommand = CreateObject('ADODB.Command')

objCommand.ActiveConnection = objConnection

objCommand.CommandText = _

'<LDAP://dc=NA,dc=fabrikam,dc=com>;objectCategory=computer)' & _

';distinguishedName,name;subtree'

Set objRecordSet = objCommand.Execute

While Not objRecordSet.EOF

Wscript.Echo objRecordSet.Fields('Name')

Wscript.Echo '[' & _

objRecordSet.Fields('distinguishedName') & ']'

objRecordSet.MoveNext

Wend

objConnection.Close

 

 

Wie wird der Teil:

 

objCommand.CommandText = '<LDAP://dc=NA,dc=fabrikam,dc=com>;objectCategory=computer)' & ';distinguishedName,name;subtree'

 

mit einem SQL-Statement gehändelt.

 

Gruß

 

Notesuser3

Share this post


Link to post

Diese erweiterte Fragestellung hat sich ergeben, da ich ein Skript weiterentwickle welches Computer in die Domäne aufnehmen soll. Da bei einem bereits vorhandenen Computerkonto diese übernommen werden soll, möchte ich zuerst prüfen, ob bereits ein Konto für diesen Computer exisitert. Dazu müsste ich aber die Domäne abfragen. Ein passende Funktion habe ich zwar geschrieben, die funktioniert aber nur wenn der Computer bereits in der Domäne ist, da sollte er aber eigentlich erst hin. War mein Gedankenfehler. Hat jemand eine Idee?

 

Hier ist schon mal der erste Code:

 

'Skript zum hinzufügen von Computern in die Domäne,

'1. Es wird geprüft, ob bereits ein Computerkonto für diesen Computer in der Domäne

' existiert.

'2. Falls ja, wird diese Computerkonto verwendet, falls nein wird ein neues angelegt.

'3. Das Skript Frage nach dem gewünschten Computernamen, Benutzernamen und Passwort,

' eines Benutzers mit mindestens Kontenoperatorrechten.

 

'3 - computerkonto wird neu angelegt

'1 - joindomain bei vorhandenem Computerkonto

Option Explicit

'on Error Resume next

Const JOIN_DOMAIN = 1

Const DOMAIN_JOIN_IF_JOINED = 32

dim glStrErrNumber

dim glStrErrDescription

dim strComName

strComName = "firma4711"

If checkIfComputerAccountExist(strComName) = false then

' Das Computerkonto muss neuangelegt werden

Call cmdJoinToDomain(strComName,JOIN_DOMAIN,"password","username")

else

' Das Computerkonto exisitert bereits

Call cmdJoinToDomain(strComName,JOIN_DOMAIN,"password","username")

end if

 

 

function checkIfComputerAccountExist(strComputerName)

checkIfComputerAccountExist = false

Dim objConnection

Dim objCommand

Dim objRecordSet

 

Set objConnection = CreateObject("ADODB.Connection")

objConnection.Open "Provider=ADsDSOObject;"

 

Set objCommand = CreateObject("ADODB.Command")

objCommand.ActiveConnection = objConnection

 

objCommand.CommandText = "<LDAP://dc=Firma,dc=de>;" & "(&(objectCategory=Computer) (cn=" & strComputerName & ")); " & "ADsPath,name;subtree"

Set objRecordSet = objCommand.Execute

If Err.Number <> 0 then

Wscript.echo(Err.number)

'lStrErrNumber = Err.Number

'glStrErrDescription = Err.Description

call errBearbeitung(Err.Number, Err.Description)

Err.Clear

Exit function

 

end if

 

if Not objRecordSet.Eof or objRecordSet.Bof then

' Das Computerkonto exisitert!

checkIfComputerAccountExist = true

'~ While Not objRecordSet.EOF

'~ Wscript.Echo objRecordSet.Fields("name")

'~ 'Wscript.Echo "[" & objRecordSet.Fields("distinguishedName") & "]"

'~ objRecordSet.MoveNext

'~ Wend

end if

objConnection.Close

end function

 

function cmdJoinToDomain(strComputerName,strOption,strPassword,strUsername)

'strcomputer="member1"

'strOption=3

'3 - computerkonto wird neu angelegt

'1 - joindomain bei vorhandenem Computerkonto

'strDomain="pta.de"

'strPassword="password"

'strUsername="administrator"

Dim objswebemservices

dim colInstances

 

Set objswbemservices=getobject("winmgmts:{authenticationlevel=pktprivacy}!\\"&strcomputer)

Set colInstances = objSWbemServices.ExecQuery _

("SELECT caption FROM win32_computersystem")

For Each objInstance In colInstances

WScript.Echo "Caption " & objInstance.Caption

rv=objInstance.joindomainorworkgroup(strDomain,strPassword,strUsername,NULL,strOption)

If rv=0 Then

WScript.Echo strcomputer & " wurde erfolgeich in die Domain "& strDomain & " aufgenommen"

Else

WScript.echo strcomputer & " konnte nicht in die Domain "& strDomain & " aufgenommen werden. Fehlercode: "&rv

End If

Next

end function

 

 

 

Function errBearbeitung(glStrErrNumber, glStrErrDescription)

MsgBox "Es ist eine Fehler aufgetreten Fehlernummer: " & glStrErrNumber & vbCRLF & "Fehlerbeschreibung: " & glStrErrDescription

glstrErrNumber = ""

glStrErrDescription = ""

end function

 

 

Gruß

Notesuser3

Share this post


Link to post

Ok, ich habe mir die Skripte kurz angesehen, das Problem ist die gehen entweder davon aus, dass ein Computer bereits in der Domäne ist und damit Zugriff auf das LDAP hat, oder sie fügen den Computer der Domäne mit einem Create hinzu, bzw. die Option ist auf verwenden des bereits existierenden Computerkonto eingestellt. Ich möchte aber, dass geprüft wird ob das Konto bereits existiert und wenn ja soll er es nehmen, falls nein soll ein neues angelegt werden.

 

Gruß

 

Notesuser3

Share this post


Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...