none
VBScript как сравнить два списка ? RRS feed

  • Вопрос

  • Добрый день ! есть такая задача: дан список пользователей в виде файла .xls нужно получить список пользователей из AD, сравнить со списком из файла и для тех кто есть в AD и нет в файле выдать lastlogon. Получить список пользователей из AD - не проблема, да и "прочитать" из экселовского файла тоже. Сложность - как сравнить полученное ?

    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCOmmand.ActiveConnection = objConnection
    objCommand.CommandText = _
        "Select Name from 'LDAP://DC=fabrikam,DC=com' " _
            & "Where objectClass='computer'" 
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst
    - здесь можем получить список имен так :

    Do Until objRecordSet.EOF
        Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
    Loop

    Из эксела читаем так:
    objExcel.WorkBooks.Open strExcelPath
    Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)
    intRow = 2
    Do While objSheet.Cells(intRow, 1).Value <> ""
        strUserDN = objSheet.Cells(intRow, 1).Value
        intRow = intRow + 1
    Loop
    Это конечно не полный текст скриптов а только часть - скрипты сами по себе работают, как "слепить " скрипт чтобы брал первое имя из первого скрипта и сравнивал со всеми именами второго, если есть совпадение - то можно удалить имя из списка и в первом и втором скрипте(а можно и ничего не делать), а вот если нет совпадения - выдать для этого имени lastlogon и перейти на след шаг.

    21 октября 2009 г. 6:28

Ответы

  • Загружайте содержимое файла в коллекцию/массив и выполняйте поиск в этой коллекции/массиве.
    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Так же, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    • Помечено в качестве ответа alfadmin 21 октября 2009 г. 6:56
    21 октября 2009 г. 6:46
  • Существуют разные варианты решения данной задачи. Например, с помощью сравнения элементов массива в двух вложенных циклах, либо с использованием объекта Scripting.Dictionary. В последнем случае вы помещаете второй список в Dictionary, а тогда для каждой записи в первом списке легко проверять, есть ли соответствующая запись во втором списке или нет. Иными словами, потребуется только один цикл. 
    • Помечено в качестве ответа alfadmin 21 октября 2009 г. 6:56
    21 октября 2009 г. 6:48
    Модератор
  • Посмотрите эту статью (на русском языке)

    http://www.osp.ru/win2000/2006/07/3643019/

    Если будут вопросы по конкретной реализации - пишите.

    • Помечено в качестве ответа alfadmin 21 октября 2009 г. 12:03
    21 октября 2009 г. 7:04
    Модератор

Все ответы

  • Загружайте содержимое файла в коллекцию/массив и выполняйте поиск в этой коллекции/массиве.
    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Так же, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    • Помечено в качестве ответа alfadmin 21 октября 2009 г. 6:56
    21 октября 2009 г. 6:46
  • Существуют разные варианты решения данной задачи. Например, с помощью сравнения элементов массива в двух вложенных циклах, либо с использованием объекта Scripting.Dictionary. В последнем случае вы помещаете второй список в Dictionary, а тогда для каждой записи в первом списке легко проверять, есть ли соответствующая запись во втором списке или нет. Иными словами, потребуется только один цикл. 
    • Помечено в качестве ответа alfadmin 21 октября 2009 г. 6:56
    21 октября 2009 г. 6:48
    Модератор
  • а можно немного подробнее как его в dictionary поместить и почему тогда один цикл ? и как тогда (с использованием dictionary)проверять, есть ли соответствующая запись во втором списке или нет, дайте хотя бы ссылочку где про это почитать (можно и на английском, но русский - предпочтительнее)
    21 октября 2009 г. 7:00
  • Посмотрите эту статью (на русском языке)

    http://www.osp.ru/win2000/2006/07/3643019/

    Если будут вопросы по конкретной реализации - пишите.

    • Помечено в качестве ответа alfadmin 21 октября 2009 г. 12:03
    21 октября 2009 г. 7:04
    Модератор
  • Возьму на себя смелость выложить текст готового (проверенного и рабочего, по крайней мере в моем домене) скрипта, т.к. скрипта который бы сравнивал два списка и отбирал нужные компьютеры(можно кстати и юзеров тоже, и не только), я в коллекции script center gallery не нашел(может мне просто не повезло). Думаю что кому- нибудь точно будет полезен если не сам скрипт - то хотя бы его фрагменты, алгоритм сортировки и т.п. Напомню - скрипт берет список компьютеров из файла эксел (из первого столбца) сравнивает его с компьютерами домена, и для тех кто есть в домене и нет в списке выдает дату последнего входа в домен.

       Const ADS_SCOPE_SUBTREE = 2
    Dim objExcel, strExcelPath, objSheet, intRow, strCompDN
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"

    Set objCOmmand.ActiveConnection = objConnection
    objCommand.CommandText = _
        "Select Name, ADsPath from 'LDAP://DC=test1,DC=local' " _
            & "Where objectClass='computer'" 
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

         ' Bind to Excel object.
           On Error Resume Next
           Set objExcel = CreateObject("Excel.Application")
            If (Err.Number <> 0) Then
               On Error GoTo 0
               Wscript.Echo "Excel application not found."
               Wscript.Quit
            End If
           On Error GoTo 0

           strExcelPath = "сюда надо ввести путь к файлу, например C:\имя_файла.xls"

           ' Open specified spreadsheet and select the first worksheet.
            objExcel.WorkBooks.Open strExcelPath
            Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)
            intRow = 2

    Do Until objRecordSet.EOF
           strTemp = objRecordSet.Fields("Name").Value
           Do While objSheet.Cells(intRow, 1).Value <> ""
            strCompDN = objSheet.Cells(intRow, 1).Value
             If strTemp = strCompDN  Then
                strTemp = ""
             Else
              intRow = intRow + 1
             End If
           Loop
         If strTemp <> "" then
           WScript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
           Set objPC = GetObject(objRecordSet.Fields("ADsPath"))
           Set objLastLogon = objPC.Get("lastLogon")
           intLastLogonTime = objLastLogon.HighPart * (2^32) + objLastLogon.LowPart
           intLastLogonTime = intLastLogonTime / (60 * 10000000)
           intLastLogonTime = intLastLogonTime / 1440

           StrTime = intLastLogonTime + #1/1/1601#

           dtmEndingDate = strTime
           intDays = DateDiff("d" , dtmEndingDate, now)
           WScript.Echo strTemp & " " & strTime & " " & Intdays
          End If
           objRecordSet.MoveNext
        
    Loop

    ' Close workbook and quit Excel.
    objExcel.ActiveWorkbook.Close 
    objExcel.Application.Quit

    ' Clean up.
    Set objExcel = Nothing
    Set objSheet = Nothing
    Set objConnection = Nothing
    Set objCommand = Nothing
    Set objRecordSet = Nothing
    Set objPC = Nothing
    Set objLastLogon = Nothing
    Wscript.Echo "Done"

    23 октября 2009 г. 5:45
  • Спасибо, что решили поделиться своим решением! Ваш сценарий можно будет найти через поиск, да и мы сможем ссылаться на него, если кто-либо еще обратится с аналогичным вопросом.
    23 октября 2009 г. 9:04
    Модератор