1 (изменено: im2002, 2013-06-20 16:04:55)

Тема: JS: определение админов и тем кому разрешён удалённый вход в домене

проблема такая: есть домен (server 2003), у него 1 контроллер,  в AD есть несколько десятков пользователей, разбросаны по разным контейнерам. мне необходимо выяснить кто из пользователей входит в группы: Администраторы, Администраторы домена, Администраторы предприятия и далее у кого на вкладке "входящие звонки" отмечена галочка "разрешить доступ".  руками долго, да и пропустить можно...  список пользователей конечно я "вывел", но вот с группами и разрешением на удалённый доступ как быть - ума не приложу...

var str = "server2003";                    
var objComputer = GetObject("WinNT://server2003, computer");    
var coll = new Enumerator(objComputer);         
var str = "";
    
while(!coll.atEnd())                        
    {
    j = coll.item();                    
    if(j.Class == "User" || j.Class == "InetOrgPerson")
        {
        str += j.Name + "\n";
             }
    coll.moveNext();                    
    }
WScript.Echo("Пользователи = " + "\n" + str);    

2 (изменено: im2002, 2013-06-23 14:46:03)

Re: JS: определение админов и тем кому разрешён удалённый вход в домене

принадлежность пользователя к интересующим группам написал, пользуясь получением объекта AD типа user, через провайдера LDAP:

var str1 = "dc = butyrki", str2 = "dc = local";                    
                   // описание домена 
var objUser = GetObject("LDAP://cn=im2002, cn=users, " + str1 + ", " + str2);    
               
try
    {
    var usrArr = objUser.memberOf.toArray(), lst = "";            
                 // если пользователь является членом БОЛЕЕ 1-й группы (НЕ считая группу
                 // "пользователи домена" (основную группу))

    for(i = 0; i < usrArr.length; i++)                    
        {
        var sbStr = usrArr[i].substring(3, usrArr[i].indexOf(","));
        if((sbStr == "Администраторы") || (sbStr == "Администраторы домена") || (sbStr == "Администраторы предприятия"))
            { 
            lst += sbStr + "\n";
            }
        else
            {
            continue;
            }

        }
    if(lst == "")
        {
        WScript.Echo("Пользователь не входит ни в одну из перечисленных групп");
        }
    else
        {
        WScript.Echo("Пользователь входит в следующие из перечисленных групп:\n--------------------------------\n" + lst);
        }
    }
catch(err)
    {
    try
        {
        usrArr = objUser.memberOf;                    
                                      // если пользователь является членом ТОЛЬКО 1-й группы (НЕ считая группу
                                      // "пользователи домена" (основную группу))
        var sbStr = usrArr.substring(3, usrArr.indexOf(","));        
        if((sbStr == "Администраторы") || (sbStr == "Администраторы домена") || (sbStr == "Администраторы предприятия"))
            {
            WScript.Echo("Пользователь входит в группу:\n--------------------------------\n" + sbStr);
            }
        else
            {
            WScript.Echo("Пользователь не входит ни в одну из перечисленных групп");    
            }
        }
    catch(err1)
        {
        WScript.Echo("пользователь является членом только одной группы");
        }
    }

при этом не представляется возможным КАК передать пользователей домена, имена которых получены через провайдера WinNT в кусок скрипта, который для определения принадлежности к интересующей группе, использует
провайдера LDAP? просто как имя пользователя + домен - не проходит... "контейнеров в пути" я не знаю и через WinNT получить их не могу...
а если начинать сразу с LDAP и искать пользователей, как объекты, свойство "Class" у которых имеет значение "User",
то непонятно как организовать поиск во всех контейнерах (в том числе и вложенных) в существующей AD-структуре...

можно покопать конечно в сторону получения объекта AD типа group, через провайдера WinNT, затем методом Members() получить список пользователей. таким подходом "от группы" можно получить пользователей, отсортировать, и наверное решить задачу...
но неужели невозможно решить методом "от пользователя" как я и начал было делать...

что делать с "разрешением входящих вызовов" даже не знаю как поступиться...

3

Re: JS: определение админов и тем кому разрешён удалённый вход в домене

при этом не представляется возможным КАК передать пользователей домена, имена которых получены через провайдера WinNT

NameTranslate FAQ --> How do I convert an NT name to a Distinguished Name?.

4

Re: JS: определение админов и тем кому разрешён удалённый вход в домене

Бесспорно полезная ссылка, спасибо.  Есть одно "НО". Скопировал по ссылке скрипт, заменив в нём переменные strNetBIOSDomain и strNTName на "свои" значения. добавил код : WScript.Echo strUserDN, который, думал даст что-то вроде: cn=im2002, cn=users, dc=dutyrki, dc=local, но при выполнении:

' Constants for the NameTranslate object.
Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1

' Specify the NetBIOS name of the domain.
strNetBIOSDomain = "server2003"

' Specify the NT name of the user.
strNTName = "im2002"

' Use the NameTranslate object to convert the NT user name to the
' Distinguished Name required for the LDAP provider.
Set objTrans = CreateObject("NameTranslate")
' Initialize NameTranslate by locating the Global Catalog.
objTrans.Init ADS_NAME_INITTYPE_GC, ""
' Use the Set method to specify the NT format of the object name.
objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strNTName
' Use the Get method to retrieve the RFC 1779 Distinguished Name.
strUserDN = objTrans.Get(ADS_NAME_TYPE_1779)

' Escape any "/" characters with backslash escape character.
' All other characters that need to be escaped will be escaped.
strUserDN = Replace(strUserDN, "/", "\/")

' Bind to the user object in Active Directory with the LDAP provider.
WScript.Echo strUserDN
Set objUser = GetObject("LDAP://" & strUserDN)

вылазит ошибка: Преобразование имён: не удаётся найти имя или права на чтение имени недостаточны
ошибка в строке:

objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strNTName

не подскажите как с этим быть?

5

Re: JS: определение админов и тем кому разрешён удалённый вход в домене

im2002, у Вас действительно домен (плоский) зовётся «server2003»?

6

Re: JS: определение админов и тем кому разрешён удалённый вход в домене

alexii пишет:

im2002, у Вас действительно домен (плоский) зовётся «server2003»?

Ох, и притормозил я!!! Блин, невнимательно прочел...
server2003.butyrki.local это FQDN - имя контроллера, соответственно NETBIOS контроллера server2003.
NETBIOS домена butyrki, подставил всё заработало как надо.

Всё, буду пробовать "переводить" на JS. Ещё раз спасибо. А на JS такого материала нету нигде?

7

Re: JS: определение админов и тем кому разрешён удалённый вход в домене

А на JS такого материала нету нигде?

im2002, собранного воедино — не встречал. На MSDN, как правило, используется VBScript — из-за возможности прямо использовать перечисление коллекций («For Each … In … Next»), возврат значений через параметры, передаваемые по ссылке и т.п.

Так что — терзайте Google с ключевым словом «JScript», наподобие: JScript NameTranslate - Поиск в Google.