Меню

Active directory windows vbscript

Active directory windows vbscript

Нужно получить список пользователей домена AD второго и третьего уровня (назовем их domain.com и sub.domain.com) из VBS-скрипта. Как я понял, для этих целей можно использовать 2 провайдера: WinNT и LDAP. Для домена второго уровня использовал WinNT-провайдер — все получилось. Но не получилось для домена третьего уровня, поэтому стал пробывать использовать LDAP-провайдер (рекомендуется использовать именно его) — получилось, но возникла другая проблема.

1) Используя провайдер WinNT удалось получить список пользователей домена второго уровня domain.com, но не получилось проделать то же самое для домена третьего уровня sub.domain.com. Ругается, что путь не найден. Пробовал локализовать проблему и попробовать получить какое-нибудь свойтсо домена:
Dim oDomain
Set oDomain = GetObject(«WinNT://domain.com»)
Wscript.Echo oDomain.MinPasswordLength
Работает!

Dim oDomain
Set oDomain = GetObject(«WinNT://sub.domain.com»)
Wscript.Echo oDomain.MinPasswordLength
Не работает, вылетает ошибка.

Может быть с доменами третьего уровня и нельзя работать через провайдер WinNT?

2) Используя провайдер LDAP удалось получить список пользователей обоих доменов, но даже после фильтрации по пользователям в списке остаются обыкновенные компьютеры. Т.е. получаю все OU, потом получаю содержимое каждой OU (компьютеры и пользователи), фильтрую по пользователям objOU.Filter = Array(«user»), но фильтр не срабатывает!

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

Заранее БОЛЬШОЕ спасибо!

Всего записей: 4 | Зарегистр. 27-03-2010 | Отправлено: 11:47 27-03-2010
dmka

Advanced Member

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Поробуй такой код

Код:

‘Setup ADO objects
Set adoCommand = CreateObject(«ADODB.Command»)
Set adoConnection = CreateObject(«ADODB.Connection»)
adoConnection.Provider = «ADsDSOObject»
adoConnection.Open «Active Directory Provider»
adoCommand.ActiveConnection = adoConnection

‘Search Entire Active Direcotry domain
Set objRootDSE = GetObject(«LDAP://RootDSE»)
strDNSDomain = objRootDSE.Get(«DefaultNamingContext»)
strBase = » «

‘Filter on user objects
strFilter = «(&(objectClass=user)(objectCategory=person))»

‘Comma delimited list of attribute values to retrieve
strAttributes = «sAMAccountName»

Active directory windows vbscript

This forum is closed. Thank you for your contributions.

Answered by:

Question

I have an old vbscript and i want to add the SID extra in it.

If you right click on an username in Active directory it gives you information this script. I would like to add the SID but no idea how to add it.

Can anyone help me out?

Answers

THat is easy. THer are many ways to do it. One esy ay is with WMI.

«SELECT * FROM Win32_Account WHERE Name=’userid’ and domain=’MyDomain'»»

The returned object has the SID property.

You can also use the NameTranslate object.

All replies

I tried this but didn’t work 🙁

Perhaps you should try one of the forums in this search?

You’ve taught me everything I know but not everything you know.

THat is easy. THer are many ways to do it. One esy ay is with WMI.

«SELECT * FROM Win32_Account WHERE Name=’userid’ and domain=’MyDomain'»»

The returned object has the SID property.

You can also use the NameTranslate object.

The problem is that the objecSID attribute in AD is a byte array. In VBScript you must convert the array of bytes first into a hex string. Then you must convert this into the standard decimal format. I use functions to do this, which are not pretty, but work. For example:

Set objUser = GetObject( «LDAP://cn=Jim Smith,ou=West,dc=MyDomain,dc=com» )

strHexSID = OctetToHexStr(objUser.objectSID)
strDecSID = HexSIDToDec(strHexSID)
Wscript.Echo strDecSID

Function OctetToHexStr(ByVal arrbytOctet)
‘ Function to convert OctetString (Byte Array) to a hex string.

OctetToHexStr = «»
For k = 1 To Lenb(arrbytOctet)
OctetToHexStr = OctetToHexStr _
& Right( «0» & Hex(Ascb(Midb(arrbytOctet, k, 1))), 2)
Next

Function HexSIDToDec(ByVal strSID)
‘ Function to convert most hex SID values to decimal format.

Dim arrbytSID, lngTemp, j

ReDim arrbytSID(Len(strSID)/2 — 1)
For j = 0 To UBound(arrbytSID)
arrbytSID(j) = CInt( «&H» & Mid(strSID, 2*j + 1, 2))
Next

If (UBound(arrbytSID) = 11) Then
HexSIDToDec = «S-» & arrbytSID(0) & «-» _
& arrbytSID(1) & «-» & arrbytSID(8)

Exit Function
End If

If (UBound(arrbytSID) = 15) Then
HexSIDToDec = «S-» & arrbytSID(0) & «-» _
& arrbytSID(1) & «-» & arrbytSID(8)

lngTemp = arrbytSID(15)
lngTemp = lngTemp * 256 + arrbytSID(14)
lngTemp = lngTemp * 256 + arrbytSID(13)
lngTemp = lngTemp * 256 + arrbytSID(12)

HexSIDToDec = HexSIDToDec & «-» & CStr(lngTemp)

Exit Function
End If

HexSIDToDec = «S-» & arrbytSID(0) & «-» _
& arrbytSID(1) & «-» & arrbytSID(8)

lngTemp = arrbytSID(15)
lngTemp = lngTemp * 256 + arrbytSID(14)
lngTemp = lngTemp * 256 + arrbytSID(13)
lngTemp = lngTemp * 256 + arrbytSID(12)

HexSIDToDec = HexSIDToDec & «-» & CStr(lngTemp)

lngTemp = arrbytSID(19)
lngTemp = lngTemp * 256 + arrbytSID(18)
lngTemp = lngTemp * 256 + arrbytSID(17)
lngTemp = lngTemp * 256 + arrbytSID(16)

HexSIDToDec = HexSIDToDec & «-» & CStr(lngTemp)

lngTemp = arrbytSID(23)
lngTemp = lngTemp * 256 + arrbytSID(22)
lngTemp = lngTemp * 256 + arrbytSID(21)
lngTemp = lngTemp * 256 + arrbytSID(20)

HexSIDToDec = HexSIDToDec & «-» & CStr(lngTemp)

If (UBound(arrbytSID) > 23) Then
lngTemp = arrbytSID(25)
lngTemp = lngTemp * 256 + arrbytSID(24)

HexSIDToDec = HexSIDToDec & «-» & CStr(lngTemp)
End If

Richard Mueller — MVP Directory Services

Richard — boy is that ugly.

Why not just use NameTranslate? It is much shorter. YOur page on NameTranslateis missing only that conversion.

hmm. I certainly would not have developed the function to convert hex SID values to decimal if it could be done with NameTranslate. The function took some work to handle the various possible formats. I notice that this link documents a SID name enumeration constant called ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME, with a value of 12:

I wonder if this constant was added after I did the testing for my web page. It is the last constant in the enumeration, and I would certainly have used it if I had seen it. I just tried it, but the Get method of NameTranslate raised the error «Generic processing error» when I passed the constant (12) to it. Now I see a note in this documentation for the Get method:

saying it does not support the ADS_NAME_TYPE_SID_OR_SID_HISTORY_NAME constant. I just tried using the constant with the Set method of NameTranslate, where you specify the SID of an object. I was able to then retrieve the corresponding distinguished name. I guess you can use NameTranslate to convert a SID into another name format, but not the reverse.

I note you can use the Translate method in PowerShell to convert names into SID values, but this must not be related to the NameTranslate com object.

Active directory windows vbscript

Question

Господа есть скрипт info.vbs который получает информацию о пользователях по описанию указнных в файле: Имя, Полное имя, Номер телефона, E-Mail после чего вся информация записывается в файл.

Как доработать скрипт что бы он добисывал туда же и описание (поле description)

Что бы примерно выглядело так:
Иванов Михаил Иванович MIvanov +81234567890 MIvanov@mydomen.ru Бухгалтерия;
Петров Петр Петрович PPetrov +83214569870 PPetrov@mydomen.ru Отдел продаж;
и.т.д.

на данный момент выглядет так:
Иванов Михаил Иванович MIvanov +81234567890 MIvanov@mydomen.ru
Петров Петр Петрович PPetrov +83214569870 PPetrov@mydomen.ru
и.т.д.

Файл с описанием содержит следующее:
Бухгалтерия;
Отдел продаж;
и.т.д.

запуск скрипта происходит через батник который содержит следующее:
@echo off
CScript.exe //nologo «info.vbs» «домен_контроллер» %1
exit /b

Answers

Сделайте, как Геннадий советовал.
description — действительно атрибут со многими значениями.
Или есть еще вариант такой:

Wscript.Echo objRecordSet.Fields(«displayname»).Value & » » & objRecordSet.Fields(«name»).Value & » » & objRecordSet.Fields(«telephoneNumber»).Value & » » & objRecordSet.Fields(«mail»).Value & » » & Strdesk(0) Если ответ Вам помог, нажмите на изображение зеленой галочки — «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку «проголосовать за полезное сообщение» в правом верхнем углу сообщения.

All replies

Так читайте из AD атрибут «description» и добавляйте вывод в файл.
Или я чего-то не понял в Вашем вопросе?

Вот эти строчки поменяйте.

Если ответ Вам помог, нажмите на изображение зеленой галочки — «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку «проголосовать за полезное сообщение» в правом верхнем углу сообщения.

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

необходимо сделать так:

mcp, mcdba, mcsa, mcse, ccna

Так читайте из AD атрибут «description» и добавляйте вывод в файл.
Или я чего-то не понял в Вашем вопросе?

Вот эти строчки поменяйте.

Если ответ Вам помог, нажмите на изображение зеленой галочки — «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку «проголосовать за полезное сообщение» в правом верхнем углу сообщения.

как ни странно, но если я добавляю desription то скрипт вообще ничего не выдает. 🙁 Так я уже пробывал.

Сделайте, как Геннадий советовал.
description — действительно атрибут со многими значениями.
Или есть еще вариант такой:

Wscript.Echo objRecordSet.Fields(«displayname»).Value & » » & objRecordSet.Fields(«name»).Value & » » & objRecordSet.Fields(«telephoneNumber»).Value & » » & objRecordSet.Fields(«mail»).Value & » » & Strdesk(0) Если ответ Вам помог, нажмите на изображение зеленой галочки — «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку «проголосовать за полезное сообщение» в правом верхнем углу сообщения.

А зачем скрипт, если все что вам нужно можно вывести стандартной утилитой dsget ?

Сазонов Илья http://www.itcommunity.ru/blogs/sie/

А зачем скрипт, если все что вам нужно можно вывести стандартной утилитой dsget ?

Сазонов Илья http://www.itcommunity.ru/blogs/sie/

Уважаемый Генадий!
Если написать вот так:

Dim DescrValues
DIM DescrValuesStr

Do Until objRecordSet.EOF
DescrValues = objRecordSet.Fields(«description»).Value
for each DescrValue in DescrValues
DescrValuesStr = DescrValuesStr & DescrValue & » »
Next
Wscript.Echo objRecordSet.Fields(«displayname»).Value & » » & objRecordSet.Fields(«name»).Value & » » & _
objRecordSet.Fields(«telephoneNumber»).Value & » » & objRecordSet.Fields(«mail»).Value & _
» » & DescrValuesStr
objRecordSet.MoveNext
Loop

Так уже близко, так уже выдает атрибут description но что то чуть не так, на выходе получается вот что:

Иванова Юлия Ивановна YuIvanova YuIvanova@mydomen.ru 71124;
Петрова Галина Игоревна GPetrova GPetrova@mydomen.ru 71124; 62376;
Сидорова Ольга Николаевна OSidorova OSidorova@mydomen.ru 71124; 62376; 73435;
Гончарова Татьяна Петровна TGoncharova +78030001122 TGoncharova@mydomen.ru 71124; 62376; 73435; 45463;

а нужно что бы вот так:

Иванова Юлия Ивановна YuIvanova YuIvanova@mydomen.ru 73435;
Петрова Галина Игоревна GPetrova GPetrova@mydomen.ru 62376;
Сидорова Ольга Николаевна OSidorova OSidorova@mydomen.ru 71124;
Гончарова Татьяна Петровна TGoncharova +78030001122 TGoncharova@mydomen.ru 45463;

при этом конечный код выглядит вот так:

Через dsget много лишней информации выводится и расположение не так как тут. Через PowerShell все проще конечно, но он не увсех установлен он у нас в отделе.

Читайте также:  Msdart инструменты для восстановления windows

Советы по настройке компьютера © 2021
Внимание! Информация, опубликованная на сайте, носит исключительно ознакомительный характер и не является рекомендацией к применению.

Adblock
detector