Войти

Показать полную графическую версию : Перемещение компьютеров из одного 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, либо изменение имени на унифицированное) и их необходимо перезаводить в домен, а поскольку система на новые компы ставится в головном офисе, неизвестно, в какой филиал попадет та или иная машина (в домен вводят непосредственно в филиале). Жду помощи!

Iska
12-02-2014, 09:01
проверяет 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)

Iska
15-02-2014, 17:30
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