Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - VBS: проверка существует ли OU в AD

Ответить
Настройки темы
VBS/WSH/JS - VBS: проверка существует ли OU в AD

Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток.

прошу помощи:
нужен запрос, который бы возвращал true в случае, если OU (имя задано переменной) существует, или false, если такового нет.

хочу сделать так:
если OU с именем ... нет - создать его, внутри него создать
иначе - внутри него создать

т.е. банальный if ... then ... else ... end if
но не знаю что писать в условии данной конструкции

думаю, что возможен вариант попытки создания OU, но так, чтобы в случае неудачи создания (т.е. если он уже существует) - скрипт не вываливался, а продолжал работать.

не знаю как.
кто-нибудь сталкивался с подобным ?

Отправлено: 14:20, 11-04-2013

 

Старожил


Сообщения: 210
Благодарности: 76

Профиль | Отправить PM | Цитировать


В качестве примера (для режима GUI):
читать дальше »
Код: Выделить весь код
Dim objRoot, strDomain, strOU, objOU, strTemp
Dim objConnection, objCommand, objRSet, strCommandText, strAttributes
Const ADS_SCOPE_SUBTREE = 2

Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
Set objRoot = Nothing
strOU = Trim(InputBox("Имя подразделения:"))
If Len(strOU) > 0 Then
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand = CreateObject("ADODB.Command")
    Set objCommand.ActiveConnection = objConnection
    strAttributes = "distinguishedName"
    strCommandText = "SELECT " & strAttributes & " FROM 'LDAP://" & strDomain & _
            "' WHERE objectCategory='organizationalUnit' AND name='" & strOU & "'"
    objCommand.CommandText = strCommandText
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Timeout") = 30
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    Set objRSet = objCommand.Execute
    If objRSet.RecordCount > 0 Then
        strTemp = objRSet.Fields("distinguishedName").Value
        MsgBox "Объект " & UCase(strOU) & " обнаружен:" & vbNewLine & strTemp, vbInformation
        On Error Resume Next
        Set objOU = GetObject("LDAP://" & strTemp)
        If Err.Number = 0 Then
            MsgBox "Привязка к объекту выполнена.", vbInformation
        Else
            MsgBox "Ошибка привязки с кодом " & Err.Number & vbNewLine & Err.Description, vbCritical
            Err.Clear
        End If
        Set objOU = Nothing
        On Error GoTo 0
    Else
        MsgBox "Объект " & UCase(strOU) & " не обнаружен.", vbExclamation
    End If
    Set objRSet = Nothing
    Set objCommand = Nothing
    objConnection.Close
    Set objConnection = Nothing
End If
WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:01, 11-04-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата:
В качестве примера (для режима GUI):
Извините, я пока ещё "начинающий" в изучении скриптов.
можно ли "разжевать" что и куда ?

Отправлено: 16:15, 11-04-2013 | #3


Старожил


Сообщения: 210
Благодарности: 76

Профиль | Отправить PM | Цитировать


Не пойму вопроса. Вас интересует инструкция по запуску сценария, комментарии к его коду или что-то иное?
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:48, 12-04-2013 | #4


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DmitriiV:
инструкция по запуску сценария, комментарии к его коду или что-то иное? »
комментарии

я не совсем понимаю как в этом коде происходит определение на существование объекта.
и почему вроде "лёгкое и понятное" условие обрастает таким кол-вом строк...

извините за нубизм

Отправлено: 11:42, 12-04-2013 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Условие:
Код: Выделить весь код
    strCommandText = "SELECT " & strAttributes & " FROM 'LDAP://" & strDomain & _
            "' WHERE objectCategory='organizationalUnit' AND name='" & strOU & "'"
    …
    If objRSet.RecordCount > 0 Then
и так простое и понятное.

Отправлено: 13:14, 12-04-2013 | #6


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
strCommandText = "SELECT " & strAttributes & " FROM 'LDAP://" & strDomain & _
"' WHERE objectCategory='organizationalUnit' AND name='" & strOU & "'"

Set objRSet = objCommand.Execute
If objRSet.RecordCount > 0 Then »
это поиск по всему домену или конкретному контейнеру ?

Отправлено: 14:36, 12-04-2013 | #7


Старожил


Сообщения: 210
Благодарности: 76

Профиль | Отправить PM | Цитировать


Цитата Chugun:
не совсем понимаю как в этом коде происходит определение на существование объекта...
С помощью запроса на поиск (SELECT) в базе данных AD (FROM 'LDAP://" & strDomain) объекта заданного типа (objectCategory='organizationalUnit') с заданным именем (name='" & strOU & "'").
Вывод о результативности поиска делается на основе подсчёта найденных в базе данных записей
(If objRSet.RecordCount > 0 Then).

Цитата Chugun:
... почему вроде "лёгкое и понятное" условие обрастает таким кол-вом строк
Потому что таковы правила оформления соответствующего запроса к базе данных.
Можно, конечно, упростить сценарий, отказавшись от использования ADO в пользу попытки прямой привязки к объекту с последующим анализом состояния генератора ошибок. Например:
Код: Выделить весь код
Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
Set objRoot = Nothing
strOU = "ou=Test," & strDomain
On Error Resume Next
Set objOU = GetObject("LDAP://" & strOU)
If Err.Number = 0 Then
    MsgBox "Привязка к объекту выполнена.", vbInformation
Else
    MsgBox "Ошибка привязки с кодом " & Err.Number & vbNewLine & Err.Description, vbCritical
    Err.Clear
End If
Set objOU = Nothing
Можно, наконец, исключить из кода и процедуру определения имени домена:
Код: Выделить весь код
On Error Resume Next
Set objOU = GetObject("LDAP://ou=Test,dc=MDM,dc=COM")
If Err.Number = 0 Then
    MsgBox "Привязка к объекту выполнена.", vbInformation
Else
    MsgBox "Ошибка привязки с кодом " & Err.Number & vbNewLine & Err.Description, vbCritical
    Err.Clear
End If
Set objOU = Nothing
Однако здесь требуется точно знать путь к целевому объекту в структуре "дерева" AD, что не всегда приемлемо. Кстати, ошибка привязки может возникнуть не только из-за того, что искомый объект отсутствует, поэтому, по-хорошему, здесь понадобится знание кода соответствующей ошибки, а также уверенность в том, что путь к объекту указан верно.

Цитата Chugun:
это поиск по всему домену или конкретному контейнеру ?
В данном примере по всему домену.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:07, 12-04-2013 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Chugun:
это поиск по всему домену или конкретному контейнеру ? »
Цитата DmitriiV:
Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")

… FROM 'LDAP://" & strDomain & … »

Отправлено: 15:11, 12-04-2013 | #9


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DmitriiV:
On Error Resume Next
Set objOU = GetObject("LDAP://ou=Test,dc=MDM,dc=COM")
If Err.Number = 0 Then
MsgBox "Привязка к объекту выполнена.", vbInformation
Else
MsgBox "Ошибка привязки с кодом " & Err.Number & vbNewLine & Err.Description, vbCritical
Err.Clear
End If
Set objOU = Nothing »
этот вариант, имхо, будет в моём случае наиболее актуальным.
я знаю полный путь к OU, ведь структуру составляю сам и там всё жестко.

у меня есть сотрудники и ученики.
сотрудники не меняются практически никогда (вот уже 10 с лишним лет)
а ученики - каждые полгода надо создавать новые группы пользователей.
скрипт на создание группы был написан "до меня", предыдущим Одмином, и работает корректно.
одна заковырка - перед созданием группы пользователей надо ручками создать OU для неё.

решил доработать в сторону ещё большей автоматизации.

Спасибо за помощь!

Отправлено: 15:20, 12-04-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - VBS: проверка существует ли OU в AD

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Существует ли программа? Gwai Хочу все знать 6 03-04-2013 09:47
CMD/BAT - [решено] Скрипт для копирования стуктуры AD из одного OU в другой Outlaw_UA Скриптовые языки администрирования Windows 2 21-06-2012 17:59
2008 R2 - [решено] Путь в AD к OU предприятия FASTCHIP Windows Server 2008/2008 R2 4 01-07-2011 22:35
VBS/WSH/JS - [решено] Проверка наличия соединения с интернетом (*.vbs) BadAngel Скриптовые языки администрирования Windows 9 18-04-2011 12:06
Существует-ли прога ... ? Sash Хочу все знать 4 08-11-2002 21:25




 
Переход