W jaki sposób znaleźć i przenieść konto Active Directory? .png)
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy. |
Cześć Skrypciarze! Muszę przenieść konto z jednej OU (Organizational Unit - jednostka organizacyjna) do innej, niestety nie wiem, w której OU konto aktualnie się znajduje. Jakiś pomysł?
-- AA
Cześć AA. Wielkie rubryki porad - na przykład Zbigniew Lew-Starowicz odpowiada, Przyjaciółka - Między nami, Cześć Skrypciarzu! - wyróżnia to, że zawsze odpowiadają tak samo. Nieważne, jak często ludzie skarżą się w Między nami na wrednego sąsiada – w odpowiedzi nigdy nie pojawi się rada, żeby spalić mu dom. Tak samo jest ze Zbigniewem Lwem-Starowiczem i z Cześć Skrypciarze!.
No dobra, to ze Zbigniewem jest tak samo.
Chodzi o to, że często na pytania czytelników dajemy tę samą odpowiedź. Także tym razem. A zatem: ten problem tak naprawdę składa się z dwóch części. Zajmiemy się nimi osobno. Aha, jeszcze jedno: jedna z części dotyczy wyszukiwania Active Directory. Tak, wiemy: słyszeliście to już setki razy. Ale jak widać ta metoda działa.
Jak już się zapewne domyśliliście, jeśli jedna część dotyczy wyszukiwania Active Directory, to druga musi dotyczyć przenoszenia konta z jednej OU do innej. Jest to bardzo proste, więc pójdzie na pierwszy ogień. Oto przykładowy skrypt, który przenosi konto komputera atl-ws-01 z OU Finance do OU Research:
Set objOU = GetObject("LDAP://OU=Research,DC=fabrikam,DC=com")
intReturn = objOU.MoveHere _
("LDAP://CN=atl-ws-01,OU=Finance,DC=fabrikam,DC=com", vbNullString)
Zgadza się: tylko dwie linie kodu. Najpierw łączymy się z nową OU (tą, do której chcemy przenieść konto komputera). Następnie wywołujemy metodę MoveHere (przenieś tutaj) i przekazujemy jej dwa parametry: ADsPath komputera, który chcemy przenieść, oraz vbNullString – stałą VBScript równą Null, czyli zero. Przekazując Null jako drugiego parametru informujemy metodę MoveHere, że chcemy, żeby obiekt zachował bieżącą CN (Common Name – nazwa pospolita), czyli atl-ws-01. Gdybyśmy przekazali inną CN, to komputer nie tylko zostałby przeniesiony, ale zmieniona zostałaby też jego nazwa.
Przy okazji, tak naprawdę parametr Null nie jest absolutnie konieczny; jeśli w skrypcie nie określicie innego parametru, MoveHere uzna, że drugim parametrem jest Null. Opisaliśmy go tu tylko po to, żebyście wiedzieli, że MoveHere akceptuje dwa parametry.
Specjalny skrypt bonusowy: załóżmy, że jednak chcielibyście zmienić nazwę konta Active Directory. Cóż, w takim razie łączymy się z OU, w której aktualnie znajduje się konto, wywołujemy metodę MoveHere i nadajemy nową CN. Ten skrypt zmienia nazwę komputera z atl-ws-01 na finance-ws-01:
Set objOU = GetObject("LDAP://OU=Finance,DC=fabrikam,DC=com")
intReturn = objOU.MoveHere _
("LDAP://CN=atl-ws-01,OU=Finance,DC=fabrikam,DC=com", "cn=finance-ws-01")
Powinniśmy chyba pobierać opłaty za te bonusowe skrypty, nie uważacie?
Teraz kiedy już wiemy, jak przenieść konto, pozostaje nam tylko kwestia jak znaleźć to konto. W tym właśnie miejscu użyjemy skryptu wyszukiwania Active Directory. Ten przykładowy skrypt sprawdza, czy w Active Directory znajduje się konto komputera o nazwie atl-ws-01:
On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = _
"SELECT ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer' " & _
"AND name='atl-ws-01'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("ADsPath").Value
objRecordSet.MoveNext
Loop
Ten skrypt po prostu wywołuje echo ADsPath komputera. A skoro mamy już ADsPath, możemy zrobić następny krok i przenieść konto komputera do innej OU. (Pamiętajcie, że jeżeli nie zmieniamy nazwy komputera, ADsPath jest jedynym parametrem, który musimy przekazać do MoveHere). Poniżej macie ostateczny skrypt, który wyszukuje komputer atl-ws-01 i przenosi go z OU Research do OU Finance:
On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = _
"SELECT ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer' " & _
"AND name='atl-ws-01'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
strADsPath = objRecordSet.Fields("ADsPath").Value
Set objOU = GetObject("LDAP://OU=Research,DC=fabrikam,DC=com")
intReturn = objOU.MoveHere(strADsPath, vbNullString)
objRecordSet.MoveNext
Loop
Lekkie, łatwe i przyjemne.
Nie wyjaśniliśmy tu, jak działa wyszukiwanie Active Directory - zainteresowanych użyciem skryptów do wyszukiwania Active Directory odsyłamy do tego webcastu Skrypciarzy.
W następnym odcinku: spalcie dom sąsiada.
Nie, moment, nie róbcie tego! Żartowaliśmy! Hm, może jednak lepiej będzie, jak będziemy się trzymali tylko skryptów...
Do początku strony