1 (изменено: Rialto, 2010-12-28 15:59:16)

Тема: VBS: Выбрать и сравнить данные из AD

Добрый день, подскажите пожалуйста.
Задача такая:
Сравнить Logon Name ( sAMAccountName) у всех пользователей определённого OU в AD и название папок на сетевом сервере (папки должны называться так же как и sAMAccountName ).
Недостающие папки (папки нет, пользователь в AD есть) добавить , лишние (пользователья в AD нет, папка есть) папки удалить , причём удалить только пустые.
OU = employees
server = \\server\home$\

Как я вижу задачу.
Выбрать из определённой группы AD всех пользователей, посмотреть у них Logon Name ( sAMAccountName), загнать всё это в массив. Array1
Выбрать из сетевой папки все подпапки, загнать в массив. Array2
Сравнить массивы, загнать результат в третий массив.
В первом случае сравнения (Array1 - Array2) будут недостающие папки, во втором (Array2 - Array1) лишние папки.
Сравнить лишние папки на размер, удалить пустые, добавить недостающие.

Правильно ли я вижу алгоритм и помогите с кодом.

2

Re: VBS: Выбрать и сравнить данные из AD

По поводу алгоритма - я бы сначала одними скриптами/пакетниками сделал бы выборку юзеров и папок в текстовые файлы или эксельные таблицы, а потом уже игрался со скриптом, который будет обрабатывать эти входящие данные и создавать пакетные файлы с удалением и созданием папок, назначением прав и пр.

WBR. Roman

3

Re: VBS: Выбрать и сравнить данные из AD

Rialto пишет:

... Правильно ли я вижу алгоритм и помогите с кодом

Можно проще:
1. С помощью объекта Dictionary составить список всех папок.
2. Подключиться к нужному подразделению AD и просматривая список "учёток":
- помечать в словаре найденные соответствия;
- добавлять в словарь записи для отсутствующих папок и также помечать их (эти метки должны отличаться от меток для предыдущего пункта).
3. Просматривая получившийся словарь:
- создавать отсутствующие папки (нужные записи уже помечены);
- проверять папки, соответствующие не помеченным записям словаря, и удалять пустые.

4 (изменено: Rialto, 2011-01-14 12:06:23)

Re: VBS: Выбрать и сравнить данные из AD

Спасибо большое, всё получилось.
Для выставления прав, я пользовался утилитой fileacl.exe (она должна лежать в папке со скриптом)
Вот код:

'=========Скрипт синхронизирует домашние папки пользователей ============
'=======и учетные записи пользователей, удаляя только пустые папки=======
'================== Настройки скрипта====================================

strHomeFolder = "\\server\folder"
strLDAPBase   = "<LDAP://ou=user,ou=all,DC=Domain,DC=RU>"
LogPath = "C:\user_folder_log.txt"

'========================================================================
'========================================================================


Set Dict = CreateObject("Scripting.Dictionary")
Set fso = CreateObject("Scripting.FileSystemObject")
set WshShell = WScript.CreateObject("WScript.Shell")

' Получаем объектную модель исходного каталога
 
Set FS03 = fso.GetFolder(strHomeFolder)
   For Each Folders In FS03.SubFolders
      Dict.Add LCase(Folders.Name), "Delete"
   Next

' Подключаемся к AD и получаем список пользователей.
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
Set adoCommand.ActiveConnection = adoConnection
Set objRootDSE = GetObject("LDAP://RootDSE")
strFilter = "(&(objectCategory=person)(objectClass=user))"
strAttributes = "sAMAccountName"
strQuery = strLDAPBase & ";" & strFilter & ";" & strAttributes & ";subtree"
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False
Set adoRecordset = adoCommand.Execute
adoRecordset.MoveFirst

' Сравниваем список папкой и список пользователей
Do Until adoRecordset.EOF
    strName = LCase(adoRecordset.Fields("sAMAccountName").Value)

    If Dict.Exists(strName) = True then
    Dict.Item(strName) = "Ok"
    else
    Dict.Add strName, "Add"
    end if
    
adoRecordset.MoveNext
Loop

adoRecordset.Close
adoConnection.Close

ArrI = Dict.Items
ArrK = Dict.Keys

' Добавляем недостающие папки, выставляем права
For i=0 To Dict.Count-1
  if ArrI(i) = "Add" then
    strFullFolderName = FSO.BuildPath(strHomeFolder, ArrK(i))
    FSO.CreateFolder strFullFolderName
    Username = ArrK(i)
    intRun = WshShell.Run("fileacl.exe " & strFullFolderName & " /replace",0,true)
    intRun = WshShell.Run("fileacl.exe " & strFullFolderName & " /G BUILTIN\Administrators:F",0,true)
    intRun = WshShell.Run("fileacl.exe " & strFullFolderName & " /G "& Username & ":C",0,true)
  End If
Next

ArrItems = Dict.Items
ArrKeys = Dict.Keys

' Удаляем пустые ненужные папки
For j=0 To Dict.Count-1
'On Error Resume Next

if ArrItems(j) = "Delete" then 
  
  strFullFolderName = FSO.BuildPath(strHomeFolder, ArrKeys(j))
  Set DelFolder = FSO.GetFolder(strFullFolderName)
   if DelFolder.Size = 0 then
         DelFolder.Delete
    Dict.Item(ArrKeys(j)) = "Удалено успешно"
       else
    Dict.Item(ArrKeys(j)) = "Не удалено (папка не пуста)"
   end if
end if

Next

'Пишем Лог файл
Set TextStream = FSO.OpenTextFile(LogPath, 2, True)
Items = Dict.Items
Keys = Dict.Keys

For g=0 To Dict.Count-1
TextStream.WriteLine Keys(g) &" - "& Items(g)
Next
WScript.Echo "Готово"
WScript.Quit 0

5

Re: VBS: Выбрать и сравнить данные из AD

Rialto пишет:

... Для выставления прав, я пользовался утилитой fileacl.exe (она должна лежать в папке со скриптом)...

Можно и без сторонних утилит, хотя, конечно, и не столь просто.
Пример здесь: http://forum.script-coding.com/viewtopic.php?id=5142