none
Удаление членства в группах RRS feed

  • Вопрос

  • Есть следующая ситуация: учетные записи уволенных пользователей блокируются и перемещаются в отдельное OU, каким образом можно сделать так, что бы все пользователи, которые содердатся в данном OU принадлежали только группе Domain Users. Т.е. необходимо сбросить членство в группах!
    21 августа 2009 г. 14:46

Ответы

  • Огромное спасибо!! Но к сожалению ошибка в 16 строке  :(

    Вполне возможно. Я надергал этот скрипт из своих разработок, и поскольку сейчас в отпуске - нет возможность проверить его на живом домене (извините, лень на своем ноуте городить подобный огород :) )
    Могу привести свой точно рабочий скрипт удаления пользователя из указанной группы (написал когда-то его, чтобы не запускать всякий раз оснастку AD Users & Computers). Я использовал провайдер WinNT, поскольку у меня группы раскиданы по разным OU
    /**************************************************************************
    Имя: rfgroup.js
    Комментарий: сценарий удаления объекта из группы
    Язык: JScript
    Автор: Андрей Мишечкин
    **************************************************************************/
    
    var Args = WScript.Arguments;	//аргументы командной строки
    var GroupName;		         //Имя группы
    var MemberName;			//имя члена группы (пользователя или дургой группы)
    var objNTMember;			//ссылка на ADSI объект члена группы
    var objNTGroup;			//ссылка на ADSI объект группы
    ///////////////////////////////////////////////
    //  Считывание аргументов командной строки   //
    ///////////////////////////////////////////////
    if(Args.Length == 2)		//два аргумента коммандной строки - операция вполняется на первом доступном
    {				//контроллере домена
    	MemberName = Args(0);
    	GroupName = Args(1);
    	try
    	{						
    		objNTGroup = GetObject("WinNT://Mooncat/" + GroupName +",group"); //Получение ссылки на ADSI-объект группы
    		objNTMember = GetObject("WinNT://Mooncat/" + MemberName);	  //Подучение ссылки на ADSI-объект члена группы
    	}
    	catch(e)								  //Ошибка получения ссылки - вывод сообщения и завершение работы сценария
    	{
    		WScript.Echo("ADSI error. Incorrect group or group member name");
    		WScript.Quit(1);
    	}
    }
    else if(Args.Length == 3)	     //три аргумента коммандной строки - операция выполняется на конкретно указанном
    {			     //контроллера домена (полезно при выполнении операции на контролере, расположенном	
    	MemberName = Args(0);  //в другом сайте - не приходится ждать репликации
    	GroupName = Args(1);
    	var DC = Args(2);	    //Имя контроллера домена
    	try
    	{
    		objNTGroup = GetObject("WinNT://"+ DC +"/" + GroupName +",group"); //Получение ссылки на ADSI-объект группы
    		objNTMember = GetObject("WinNT://" + DC+ "/" + MemberName);	   //Подучение ссылки на ADSI-объект члена группы
    	}
    	catch(e)								   //Ошибка получения ссылки - вывод сообщения и завершение работы сценария
    	{
    		WScript.Echo("ADSI error. Incorrect group, group member or domain controller name");
    		WScript.Quit(1);
    	}
    }
    else	//Неправильные аргументы коммандной строки - вывод подсказки
    {
    	WScript.Echo("Use [cscript/wscript] rfgroup[.js] SourceUserName|SourceGroupName TargetGroupName  [DomainController]");
    	WScript.Quit(1);
    }
    /////////////////////////////////////////////////
    //  Операция удаления объекта из группы 	  //
    /////////////////////////////////////////////////
    try	//Выполнение удаления объекта с обработкий ошибки
    {
    	objNTGroup.Remove(objNTMember.ADsPath);
    }
    catch(e)	 //Ошибка - вывод диагностического сообщения и завершение работы сценария
    {
    	WScript.Echo("Error of removing " + MemberName + " from " + GroupName + ". " + e.description);
    	WScript.Quit(1);
    }
    WScript.Echo("Operation successful");
    WScript.Quit(0);
    Хотя я при увольнении пользователея поступаю несколько по другому - его учетка блокируется и перемещается в специальную ОU. Делается это тоже специальным скриптом. Потом с определенной периодичностью админ с помощью другого скрипта вычищает такие аккаунты.
    Если интересно могу привести и эти скрипты
    Andrew Mishechkin
    • Помечено в качестве ответа Vitaliy Golikov 30 августа 2009 г. 14:44
    22 августа 2009 г. 8:38

Все ответы



  • //Определение полного пути к орг. единце с отключенными учетными записями var DisabledAccountsOU = "LDAP://OU=DisabledAccounts,DC=local,DC=company";
    //Получение объекта орг. единицы и определение коллекции ее членов var objDisabledAccountsOU = GetObject(DisabledAccountsOU); var enumDisabledAccountsOU = new Enumerator(objDisabledAccountsOU); for(;!enumDisabledAccountsOU.atEnd();enumDisabledAccountsOU.moveNext()) { objOUMember = enumDisabledAccountsOU.item(); if(objOUMember.Class == "user") { enumGroups = new Enumerator(objOUMember.Groups()); while(!enumGroups.atEnd()) //Цикл перечисления всех групп, куда входит пользователь { if(enumGroups.item().Name != "Domain Users") { objNTGroup = GetObject("WinNT://NTDomainName/" + enumGroups.item().Name +",group"); objNTGroup.Remove(objOUMember.ADsPath); } enumGroups.moveNext(); } } }

    Andrew Mishechkin
    21 августа 2009 г. 18:57
  • Огромное спасибо!! Но к сожалению ошибка в 16 строке  :(

    //Определение полного пути к орг. единце с отключенными учетными записями
    var DisabledAccountsOU = "LDAP://OU=Users,OU=DisabledAccounts,DC=my,DC=company;
    //Получение объекта орг. единицы и определение коллекции ее членов
    var objDisabledAccountsOU = GetObject(DisabledAccountsOU);
    var enumDisabledAccountsOU = new Enumerator(objDisabledAccountsOU);
    for(;!enumDisabledAccountsOU.atEnd();enumDisabledAccountsOU.moveNext())
    {
        objOUMember = enumDisabledAccountsOU.item();
        if(objOUMember.Class == "user")
        {
         enumGroups = new Enumerator(objOUMember.Groups());
         while(!enumGroups.atEnd())   //Цикл перечисления всех групп, куда входит пользователь
         {
                 if(enumGroups.item().Name != "Domain Users")
                 {
                objNTGroup = GetObject("WinNT://NTDomainName/" + enumGroups.item().Name +",group");
                objNTGroup.Remove(objOUMember.ADsPath);
                 }
                 enumGroups.moveNext();
         }
        }
    } 

     

    21 августа 2009 г. 22:42
  • на самам деле вы не правильно себе задачу поставили. Если сотрудник увольняется, его учетная запись должна блокироваться и ни куда не перемещаться и ни от куда не исключаться. Перемещением и удалением членства вы секюрность не поднимем. А вот если не бай бог человек через неделю вернется. Вы будите судорожно вспоминать, в каком OU он был и на какие ресурсы имел доступ. MS кстати сама рекомендует из AD ни чего не удалять. Максимум отключать. И только когда вышел срок ожидания, при чем он должен быть достаточно продолжительный, можно удалить учетку. При этом она автоматом за собой почистить и членство в группах.
    22 августа 2009 г. 3:32
  • С одной стороны я с вами согласен, но есть иная сторона медали.  А именно: имеется ряд приложений свободнораспространяемых (например jaber), котоорые формируют списки сотрудников по его членству в группе, т.о. получается что если учетная запись пользователя заблокирован и продолжает находится в составе прежних групп, то  этот пользователь будет отображаться в списках контактов. Касаемо хранения пользователя определенном OU и воспоминания принадлежности, тут относительно все просто, каждому департаменту и каждому отделу назначены персональные OU. Зачастую пользователь возвращается в компанию не на преднее место, а в смежный отдел, что приносит (в случаи хранения его той же OU) больше проблем.
    P.S. Учетных записей порядка 1000.

    22 августа 2009 г. 6:25
  • Огромное спасибо!! Но к сожалению ошибка в 16 строке  :(

    Вполне возможно. Я надергал этот скрипт из своих разработок, и поскольку сейчас в отпуске - нет возможность проверить его на живом домене (извините, лень на своем ноуте городить подобный огород :) )
    Могу привести свой точно рабочий скрипт удаления пользователя из указанной группы (написал когда-то его, чтобы не запускать всякий раз оснастку AD Users & Computers). Я использовал провайдер WinNT, поскольку у меня группы раскиданы по разным OU
    /**************************************************************************
    Имя: rfgroup.js
    Комментарий: сценарий удаления объекта из группы
    Язык: JScript
    Автор: Андрей Мишечкин
    **************************************************************************/
    
    var Args = WScript.Arguments;	//аргументы командной строки
    var GroupName;		         //Имя группы
    var MemberName;			//имя члена группы (пользователя или дургой группы)
    var objNTMember;			//ссылка на ADSI объект члена группы
    var objNTGroup;			//ссылка на ADSI объект группы
    ///////////////////////////////////////////////
    //  Считывание аргументов командной строки   //
    ///////////////////////////////////////////////
    if(Args.Length == 2)		//два аргумента коммандной строки - операция вполняется на первом доступном
    {				//контроллере домена
    	MemberName = Args(0);
    	GroupName = Args(1);
    	try
    	{						
    		objNTGroup = GetObject("WinNT://Mooncat/" + GroupName +",group"); //Получение ссылки на ADSI-объект группы
    		objNTMember = GetObject("WinNT://Mooncat/" + MemberName);	  //Подучение ссылки на ADSI-объект члена группы
    	}
    	catch(e)								  //Ошибка получения ссылки - вывод сообщения и завершение работы сценария
    	{
    		WScript.Echo("ADSI error. Incorrect group or group member name");
    		WScript.Quit(1);
    	}
    }
    else if(Args.Length == 3)	     //три аргумента коммандной строки - операция выполняется на конкретно указанном
    {			     //контроллера домена (полезно при выполнении операции на контролере, расположенном	
    	MemberName = Args(0);  //в другом сайте - не приходится ждать репликации
    	GroupName = Args(1);
    	var DC = Args(2);	    //Имя контроллера домена
    	try
    	{
    		objNTGroup = GetObject("WinNT://"+ DC +"/" + GroupName +",group"); //Получение ссылки на ADSI-объект группы
    		objNTMember = GetObject("WinNT://" + DC+ "/" + MemberName);	   //Подучение ссылки на ADSI-объект члена группы
    	}
    	catch(e)								   //Ошибка получения ссылки - вывод сообщения и завершение работы сценария
    	{
    		WScript.Echo("ADSI error. Incorrect group, group member or domain controller name");
    		WScript.Quit(1);
    	}
    }
    else	//Неправильные аргументы коммандной строки - вывод подсказки
    {
    	WScript.Echo("Use [cscript/wscript] rfgroup[.js] SourceUserName|SourceGroupName TargetGroupName  [DomainController]");
    	WScript.Quit(1);
    }
    /////////////////////////////////////////////////
    //  Операция удаления объекта из группы 	  //
    /////////////////////////////////////////////////
    try	//Выполнение удаления объекта с обработкий ошибки
    {
    	objNTGroup.Remove(objNTMember.ADsPath);
    }
    catch(e)	 //Ошибка - вывод диагностического сообщения и завершение работы сценария
    {
    	WScript.Echo("Error of removing " + MemberName + " from " + GroupName + ". " + e.description);
    	WScript.Quit(1);
    }
    WScript.Echo("Operation successful");
    WScript.Quit(0);
    Хотя я при увольнении пользователея поступаю несколько по другому - его учетка блокируется и перемещается в специальную ОU. Делается это тоже специальным скриптом. Потом с определенной периодичностью админ с помощью другого скрипта вычищает такие аккаунты.
    Если интересно могу привести и эти скрипты
    Andrew Mishechkin
    • Помечено в качестве ответа Vitaliy Golikov 30 августа 2009 г. 14:44
    22 августа 2009 г. 8:38
  • Эх... все равно код при опубликовании в форуме выглядит не так как при редактировании - съезжает кое-что. Модератор, возмите на заметку плиз...
    Andrew Mishechkin
    22 августа 2009 г. 8:41
  • Да, очень былобы интересно, комплексную задачу, которую хотелось бы реализовать я описал тут: http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/thread/e4f8ccf9-9ac4-428f-b178-d1958e441fcb
    Хочу так же выслушать Ваше видение!
    22 августа 2009 г. 8:54
  • Эх... все равно код при опубликовании в форуме выглядит не так как при редактировании - съезжает кое-что. Модератор, возмите на заметку плиз...
    Andrew Mishechkin

    А вы попробуйте для размещения кода использовать специальную кнопку (последняя в тулбаре над сообщением). :) Какой язык выбирать неважно - это влияет только на подсветку.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    23 августа 2009 г. 7:13
    Модератор
  • Василий, пробовал и с кнопкой и без кнопки. Последний, между прочим, когда убедился не в слишком хорошей работе "конпки"


    Andrew Mishechkin
    29 августа 2009 г. 5:43
  • Она конечно не слишком хорошо, но работает... Оба... уже нет...
    Сломали, будем жаловаться значит.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    29 августа 2009 г. 5:47
    Модератор