notesuser3 10 Posted August 7, 2006 Report Posted August 7, 2006 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 Quote
notesuser3 10 Posted August 7, 2006 Author Report Posted August 7, 2006 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 Quote
Demon72 10 Posted August 8, 2006 Report Posted August 8, 2006 Hier findest Du bestimmt etwas passendes unter Active Directory - Computer Accounts Microsoft Corporation Quote
notesuser3 10 Posted August 8, 2006 Author Report Posted August 8, 2006 Danke für den Link, ich werde da mal ein bisschen stöbern. Gruß Notesuser Quote
notesuser3 10 Posted August 8, 2006 Author Report Posted August 8, 2006 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 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.