2009-08-04 13 views
1

Wir durchlaufen eine Migration von mehreren Domänen in eine einzige Domäne. Im Rahmen dieses Prozesses werden Benutzerkonten um die verschiedenen ADs herum verschoben. Dies hat dazu geführt, dass einige Skripts beschädigt wurden, weil sie versuchen, die Benutzerobjekte von einem bestimmten Speicherort in AD abzurufen.Bindung an AD-Objekte (mit unterschiedlichen Standorten)

Wie würde ich das Folgende ändern, um nicht AD-spezifisch zu sein?

Set objBlahUser = GetObject("LDAP://CN=" & objNetwork.UserName & ",OU=ADMigration,OU=Blah Users,DC=blah,DC=loc")              

Vielen Dank im Voraus

Antwort

3

Der einfachste Weg, dies zu tun ist, um das NameTranslate Objekt zu verwenden, die auf Windows-eingebaut sind

Const ADS_NAME_INITTYPE_GC = 3 
Const ADS_NAME_TYPE_NT4 = 3 
Const ADS_NAME_TYPE_1779 = 1 

strNTName = "MyDomain\TestUser" 
Set objTrans = CreateObject("NameTranslate") 
objTrans.Init ADS_NAME_INITTYPE_GC, "" 
objTrans.Set ADS_NAME_TYPE_NT4, strNTName 
strUserDN = objTrans.Get(ADS_NAME_TYPE_1779) 

Es gibt eine große Schreib hier auf dieses Objekt nach oben:

http://www.rlmueller.net/NameTranslateFAQ.htm

+0

Das ist großartig - danke für das Heads-up! Wird auf jeden Fall größere Teile meines zukünftigen Codes aussparen! – Izzy

0

Haben Sie den Hostnamen nur angeben? Unter der Annahme, dass der Rest der AD-Struktur identisch ist, dann können Sie nur die Servernamen in Ihrem verbindlichen string:

Set objBlahUser = GetObject("LDAP://yourserver.com/CN=" & objNetwork.UserName & ",OU=ADMigration,OU=Blah Users,DC=blah,DC=loc") 
+0

Nein - das Problem liegt in jeder Domäne. Domain Blah hat einige Benutzer in OU Blah-Benutzern und anderen Benutzern in BlahBlah-Benutzern. – Izzy

+0

Wissen Sie im Voraus, welche Nutzer an welchen Ort gezogen sind? Wenn dies der Fall ist, können Sie den Binding-String noch dynamischer konstruieren als Sie jetzt sind (die Organisationseinheit, DC-Informationen usw. anhängen, basierend auf einigen Ihnen bekannten Kriterien). Wenn Sie die potenziellen OUs kennen, in denen sich der Benutzer befinden kann, und Sie wissen, dass es keine doppelten CNs über die OUs gibt, kann eine andere Alternative sein, an eine OU zu binden, aber wenn dies fehlschlägt, versuchen Sie, eine Bindung an die andere OU herzustellen. Aber das ist hässlich und ein Performance-Hit. –

0

Also, es gibt keine Möglichkeit in mich suchen und das Objekt aus dem Verzeichnis auswählen. Ich musste eine separate Funktion verwenden, um den DN des Objekts für die spätere Verwendung zu suchen und zurückzugeben.

userDN = GetUserDN(objNetwork.UserName,"server001","blah.loc") 
If Not userDN = "Error" Then 
    Set objBlahUser = GetObject("LDAP://" & userDN) 
End if             



Function GetUserDN(strUserName, strServer, strDomain) 
    On Error Resume Next 

    Set objConnection = CreateObject("ADODB.Connection") 
     objConnection.Provider = "ADsDSOObject" 
     objConnection.Properties("User ID") = strDomain & "\ReadADAccount" 
     objConnection.Properties("Password") = "ReadADAccountPwd" 
     objConnection.Open "Active Directory Provider" 


    Set objCommand = CreateObject("ADODB.Command") 
    objCommand.ActiveConnection = objConnection 

    objCommand.CommandText = _ 
     "<LDAP://" & strServer & ">;(&(objectCategory=User)" & _ 
      "(samAccountName=" & strUserName & "));distinguishedname;subtree" 

    Set objRecordSet = objCommand.Execute 

    If objRecordset.RecordCount = 0 Then 
     GetUserDN = "Error" 
    Else 
     GetUserDN = objRecordSet(0).value 
    End If 

    objConnection.Close 
End Function