Jump to content

Abfrage von Objekten der ADS mit einer ADO-Connection


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...