Показать полную графическую версию : Перемещение компьютеров из одного OU в другой, в зависимости от имени
PAlkovnic
12-02-2014, 08:44
Доброго времени суток! Жизненно необходим vbs скрипт, перемещающий компы из одного OU в другой следующим образом: проверяет OU domain.com/Computers и смотрит, если первые 4 буквы в имени - ABCD (name или CN, не принципиально) то перемещает в domain.com/ABCD, если первые 4 буквы EFGH, то соответственно в domain.com/EFGH. И так 22 раза))) Так нужно будет раскидывать компы по контейнерам филиалов (в каждом филиале уникальное GPO, так что все в одном OU держать - не вариант). Запускаться будет периодически на основном контроллере домена (скажем, раз в час или два). Нужно это для того, что сейчас идет массовое обновление парка машин (а кое где просто переустановка с XP на 7, либо изменение имени на унифицированное) и их необходимо перезаводить в домен, а поскольку система на новые компы ставится в головном офисе, неизвестно, в какой филиал попадет та или иная машина (в домен вводят непосредственно в филиале). Жду помощи!
проверяет OU domain.com/Computers »
Нет такого OU. Может быть «OU=Computers,DC=domain,DC=com».
И так 22 раза »
Почему не 21 или 23? Я полагаю, что достаточно просто перебрать существующие аккаунты компьютеров в «OU=Computers,DC=domain,DC=com», так?
PAlkovnic
12-02-2014, 11:29
Нет такого OU. Может быть «OU=Computers,DC=domain,DC=com». »
Каюсь, мне было проще написать canonicalName
Почему не 21 или 23? Я полагаю, что достаточно просто перебрать существующие аккаунты компьютеров в «OU=Computers,DC=domain,DC=com», так? »
Не совсем так. Именно 22 потому, что именно 22 филиала с уникальным префиксом по названию города. А перебирать существующие аккаунты можно, но они там появляются регулярно, и регулярно их оттуда руками перемещают по своим местам. К тому же, в этом контейнере есть машины, которые должны оставаться там и только там (некоторые финансовые службы завязаны на DN)
PAlkovnic, примерно так:
Option Explicit
Const ADS_SCOPE_ONELEVEL = 1
Dim objDictionary
Dim strDomain
Dim objConnection
Dim strKey
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
With objDictionary
.Add "ABCD", "OU=ABCD"
.Add "EFGH", "OU=EFGH"
' … И так 22 раза)))
End With
strDomain = GetObject("LDAP://RootDSE").Get("DefaultNamingContext")
Set objConnection = WScript.CreateObject("ADODB.Connection")
With objConnection
.Provider = "ADsDSOObject"
.Open "Active Directory Provider"
End With
With WScript.CreateObject("ADODB.Command")
Set .ActiveConnection = objConnection
.CommandText = _
"SELECT Name, distinguishedName " & _
"FROM 'LDAP://CN=Computers," & strDomain & "' " & _
"WHERE objectClass='computer'"
With .Properties
.Item("Searchscope") = ADS_SCOPE_ONELEVEL
.Item("Page Size") = 1000
.Item("Timeout") = 60
.Item("Sort On") = "Name"
End With
With .Execute()
.MoveFirst
Do Until .EOF
For Each strKey In objDictionary.Keys
If StrComp(Left(.Fields.Item("Name").Value, 4), strKey, vbTextCompare) = 0 Then
WScript.Echo .Fields.Item("Name").Value
GetObject("LDAP://" & objDictionary.Item(strKey) & "," & strDomain).MoveHere "LDAP://" & .Fields.Item("distinguishedName").Value, vbNullString
End If
Next
.MoveNext
Loop
.Close
End With
Set .ActiveConnection = Nothing
End With
objConnection.Close
Set objConnection = Nothing
objDictionary.RemoveAll
Set objDictionary = Nothing
WScript.Quit 0
Кстати, я неглядючи ненароком соврал Вам выше — не «OU=Computers», а «CN=Computers».
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.