none
Перемещение каталога пользователя после его блокировки или удаления RRS feed

Ответы

  • Комплексно я вижу задачу так:
    1. Периодически запускается скрипт, который проверяет lastlogontime, если это значение больше 60 дней, то учетная запись должна заблокироваться и переместиться в другой OU


    Рискуете заблокировать аккаунты действующих сотрудников. ИМХО определить техническими средствами увольнение сотрудника - задача очень нетривиальная. Тут надо действовать не технически а организационно.
    У нас реализовано следующим образом: при увольнении в обходном листе обязательная подпись сисадмина. Админ перед тем как подписать запускает специальный скрипт, который отключает  учетку, перемещает ее в спец. ОУ, удаляет пользователя джаббер и рассылает оповещения необходимым сотрудникам, например админу почтовой системы (почта у нас крутится на UNIX-системе). Раз в неделю админ специальным скриптом проходит по отключенным аккаунтам, и те у которых истек срок давности - удаляет. Чистка личных каталогов пользователей тоже производится специальным скриптом, периодически запускаемым на файловом сервере.
    Ниже коды приведенных скриптов:
    //////////////////////////////////////////////////////////
    // Скрипт отключения пользователя			//
    // Язык: JScript	  	                          //
    // Автор: Андрей Мишечкин		                 //
    //////////////////////////////////////////////////////////
    var objLDAPUser;
    var objRootDSE = GetObject("LDAP://rootDSE");
    var Args = WScript.Arguments;			//Аргументы коммандной строки
    var WshShell = WScript.CreateObject("WScript.Shell");
    
    ////////////////////////////////////////////////////////////////
    //   Создание ADSI объектов пользователя		      //
    ////////////////////////////////////////////////////////////////
    if(Args.length == 1)				//Указано только имя пользователя
    {
       var LoginUserName = Args(0);
    }
    else 						//Неправильные аргументы коммандной строки
    {
       WScript.Echo("Usage: disable[.js] LoginUserName");
       WScript.Quit()
    }
    ////////////////////////////////////////////////////////
    //   	Создание ADO-подключения		       //
    ////////////////////////////////////////////////////////
    var objConnection = WScript.CreateObject("ADODB.Connection");	//объект ADO-соединения
    var objCommand = WScript.CreateObject("ADODB.Command");         //объект запроса
    objConnection.Provider = "ADsDSOObject";
    objConnection.Open("Active Directory Provider");
    objCommand.ActiveConnection = objConnection;
    
    objCommand.Properties("Page Size")=1000;
    
    ////////////////////////////////////////////////////////////////////////
    //   	Выбор всех имен пользователей из AD c обработкой ошибок     //
    ////////////////////////////////////////////////////////////////////////
    try
    {
    	 objCommand.CommandText = "SELECT sAMAccountName,distinguishedName from 'LDAP://DC=local,DC=polad,DC=ru' Where objectClass='user' and objectClass<>'computer'";
    	 var objADCRes = objCommand.Execute;
    }
    catch(e)
    {
    	 WScript.Echo("ADODB error. " + e.description);
    	 WScript.Quit(1);
    }
    var IsUserFound = false;			//Флаг "Пользователь найден/не найден"
    objADCRes.MoveFirst;			//Переход к первому элементу коллекции выборки учетных записей пользователей
    while(!objADCRes.EOF)			//Цикл перебора всех учетных записей пользователей
    {
    	//Получение LDAP-объекта пользователя
    	if(objADCRes.Fields("sAMAccountName").Value == LoginUserName)
    	{
         	   objLDAPUser = GetObject("LDAP://" + objADCRes.Fields("distinguishedName").Value);
         	   IsUserFound = true;
         	   break;
      	}
      	else
      	  objADCRes.MoveNext;
    }
    if(!IsUserFound)
    {
      WScript.Echo("No user found");
      WScript.Quit();
    }
      
    /////////////////////////////////////////////////
    //   Отключение пользователя			            //
    ////////////////////////////////////////////////
    var intUAC = objLDAPUser.Get("userAccountControl");
    if(!(intUAC & 2))
    {
        objLDAPUser.Put("userAccountControl", intUAC | 2);
        objLDAPUser.SetInfo();
        WScript.Echo("User "+ LoginUserName +" is disabled");
        Information(LoginUserName);
    }
    else
        WScript.Echo("User " + LoginUserName + " is already disabled");
    ////////////////////////////////////////////////////////////////////////
    //   	Перемещение отключенной учетной записи в OU=DisabledAccounts    //
    ////////////////////////////////////////////////////////////////////////
    var strDN = new String(objADCRes.Fields("distinguishedName").Value);
    var reDisabledAccounts = new RegExp("DisabledAccounts","i");
    var MatchResult = strDN.match(reDisabledAccounts);
    //WScript.Echo(MatchResult);
    if(!MatchResult)
    {
      objOU = GetObject("LDAP://OU=DisabledAccounts," + objRootDSE.Get("defaultNamingContext"));
      objOU.MoveHere("LDAP://" + objADCRes.Fields("distinguishedName").Value, "CN="+LoginUserName);
      WScript.Echo("User " + LoginUserName + " is moved to OU=DisabledAccounts");
    }
    else
      WScript.Echo("User " + LoginUserName + " is already present in OU=DisabledAccounts");
    
    if(WshShell.Popup("Удалить пользователя Jabber?",0,"",4)==6)
    {
    	try
    	{
    		var objOUICQ = GetObject("LDAP://OU=IcqUsers,OU=UsersOfPolad,DC=local,DC=polad,DC=ru");
    		objOUICQ.Delete("user", "cn="+LoginUserName+"_icq");
    	}
    	catch(e)
    	{
    	  try
    	  {
    		var objOUICQ = GetObject("LDAP://OU=PSM,OU=IcqUsers,OU=UsersOfPolad,DC=local,DC=polad,DC=ru");
    		objOUICQ.Delete("user", "cn="+LoginUserName+"_icq");
    	  }
    	  catch(e)
    	  {
    		WScript.Echo("Ошибка удаления пользователя джаббер: "+LoginUserName+"_icq");
    		WScript.Quit(1);
    	  }
    	}
    	WScript.Echo("Удален пользователь джаббер: "+LoginUserName+"_icq");
    }
    
    function Information(UserName)
    {
       var WMIServiceObj = GetObject("Winmgmts:");
       var ProcEnumerator = new Enumerator(WMIServiceObj.ExecQuery("Select Handle from Win32_Process WHERE Caption = 'cscript.exe' OR Caption = 'wscript.exe'"));
       var ProcHandle = ProcEnumerator.item().Handle;	
       var objWMIProcess = GetObject("winmgmts:Win32_Process.Handle='" + ProcHandle + "'");
       var wmiOutParams = objWMIProcess.ExecMethod_("GetOwner");
       var AdministratorName = wmiOutParams.User;
       var objCurrentDate = new Date;
       var CurrentDate = objCurrentDate.getDate();
       CurrentDate += "." + (objCurrentDate.getMonth()+1);
       CurrentDate += "." + objCurrentDate.getYear() + " ";
       var CurrentHour = objCurrentDate.getHours();
       if(CurrentHour < 10)
    		CurrentDate += "0";
       CurrentDate += CurrentHour + ":";
       var CurrentMinute = objCurrentDate.getMinutes();
       if(CurrentMinute < 10)
    		CurrentDate += "0";
       CurrentDate += CurrentMinute;
       var objEmail = WScript.CreateObject("CDO.Message");
       objEmail.From = "\"Disable script\" diag@polad.ru";
       objEmail.To = "anmi@polad.ru,likian@polad.ru,amilek@polad.ru,kuklin@polad.ru,j@polad.ru";
       objEmail.Subject = UserName +" is disabled";
       objEmail.Textbody = "User " + UserName + " is disabled by " + AdministratorName + " in " + CurrentDate;
       objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
       objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.polad.ru";
       objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25;
       objEmail.Configuration.Fields.Update();
       try
       {
          objEmail.Send();
       }
       catch(e)
       {
          WScript.Echo("Mail system error: " + e.description);
       }
    }

    //////////////////////////////////////////////////////////
    // Скрипт удаления отключенных учетных записей          //
    // в OU=DisabledAccounts                  		 // 
    // Язык: JScript // // Автор: Андрей Мишечкин // ////////////////////////////////////////////////////////// //Объявление переменных var count1 = 0; //Счетчик общего количества пользователей var count2 = 0; //Счетчик числа увволенных пользователей var delUsersList = ""; //Список удаленных пользователей var objNTUser; //ADSI-объект пользователя (используя NTLM) var input; //переменная ввода символов со стандартного потока
    //Определение полного пути к орг. единце с отключенными учетными записями var DisabledAccountsOU = "LDAP://OU=DisabledAccounts,DC=local,DC=polad,DC=ru"; //Получение объекта орг. единицы и определение коллекции ее членов с обработкой ошибок try { var objDisabledAccountsOU = GetObject(DisabledAccountsOU); var enumDisabledAccountsOU = new Enumerator(objDisabledAccountsOU); } catch(e) { WScript.Echo("Can't create the OU object and collection" + e.description); } ////////////////////////////////////////////////////////////////////// // Основной цикл перебора элементов коллекции // ////////////////////////////////////////////////////////////////////// for(;!enumDisabledAccountsOU.atEnd();enumDisabledAccountsOU.moveNext()) { objOUMember = enumDisabledAccountsOU.item(); if(objOUMember.Class == "user") { //Вывод на экран информации о пользователе WScript.Echo("Login name: " + GetParam("objOUMember","sAMAccountName")); WScript.Echo("Display name: " + GetParam("objOUMember","displayName")); WScript.Echo("Description: " + GetParam("objOUMember","Description")); WScript.Echo("Last login time: " + GetParam("objNTUser","LastLogin")); if(objOUMember.AccountDisabled == 1) WScript.Echo("Account disabled"); else WScript.Echo("Account is not disabled"); //Выполнение удаления пользователя выполнении условия. WScript.Echo("Delete this account ? Y/N"); for(;;) { input = ""; input = WScript.StdIn.ReadLine(); if((input == "Y")||(input == "y")) { try { objDisabledAccountsOU.Delete("user","cn=" + objOUMember.Get("Name")); } catch(e) { WScript.Echo("Error. Account " + objOUMember.Get("sAMAccountName") + " is not deleted. " + e.description); } WScript.Echo(objOUMember.Get("sAMAccountName") + " is deleted"); delUsersList += GetParam("objOUMember","sAMAccountName") + " / " + GetParam("objOUMember","displayName") + "\n"; count2++; break; } else if((input == "N")||(input == "n")) { WScript.Echo(objOUMember.Get("sAMAccountName") + " is not deleted"); break; } else { WScript.Echo("Invalid option."); WScript.Echo("Delete this account ? Y/N"); } } WScript.Echo("------------------------------------------------------------"); count1++; } } WScript.Echo("Total accounts: " + count1); WScript.Echo("Deleted accounts: " + count2); Information(); ////////////////////////////////////////////////////////////////// // Фукнкция считывания параметров из кэша с обработкой ошибок // ////////////////////////////////////////////////////////////////// function GetParam(object,ParamName) { var result; if(object == "objOUMember") var objUser = objOUMember; else if(object == "objNTUser") var objUser = GetObject("WinNT://POLAD/" + objOUMember.Get("sAMAccountName") + ",user"); try { result = objUser.Get(ParamName); } catch(e) { result = "Undefined"; } return result; } function Information() { var WMIServiceObj = GetObject("Winmgmts:"); var ProcEnumerator = new Enumerator(WMIServiceObj.ExecQuery("Select Handle from Win32_Process WHERE Caption = 'cscript.exe' OR Caption = 'wscript.exe'")); var ProcHandle = ProcEnumerator.item().Handle; var objWMIProcess = GetObject("winmgmts:Win32_Process.Handle='" + ProcHandle + "'"); var wmiOutParams = objWMIProcess.ExecMethod_("GetOwner"); var AdministratorName = wmiOutParams.User; var objCurrentDate = new Date; var CurrentDate = objCurrentDate.getDate(); CurrentDate += "." + (objCurrentDate.getMonth()+1); CurrentDate += "." + objCurrentDate.getYear() + " "; var CurrentHour = objCurrentDate.getHours(); if(CurrentHour < 10) CurrentDate += "0"; CurrentDate += CurrentHour + ":"; var CurrentMinute = objCurrentDate.getMinutes(); if(CurrentMinute < 10) CurrentDate += "0"; CurrentDate += CurrentMinute; var objEmail = WScript.CreateObject("CDO.Message"); objEmail.From = "\"Usrclean script\" diag@polad.ru"; objEmail.To = "anmi@polad.ru"; objEmail.Subject = "Usrclean.js report"; objEmail.Textbody = "Users:\n" + delUsersList + "was deleted by " + AdministratorName + " in " + CurrentDate; objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2; objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.polad.ru"; objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25; objEmail.Configuration.Fields.Update(); try { objEmail.Send(); } catch(e) { WScript.Echo("Mail system error: " + e.description); } }
    ///////////////////////////////////////////////////////////
    // Сценарий для переноса каталогов увволенных сотрудников //
    // на ресурс длительного хранения.                       //
    // Используется утилита robocopy.exe                     //
    // Автор: Андрей Мишечкин                                //
    ///////////////////////////////////////////////////////////
    
    //Необходимые глобальные переменные					
    var objADSIUser					     //Ссылка на ADSI-объект пользователя
    var objUsersFolder;				     //Ссылка на объект каталога пользователя
    var UserFolderSpec;                                         //Полное имя каталога пользователя
    var OldUsersFolder = "I:\\ODBackup\\OldUsers\\";            //Переменная каталога долговременного хранения
    var enumUserFolders;				     //Коллекция каталогов пользователей
    var NoMove = true;					     //Флаг отмены перемещения каталога пользователя
    var IsError = false;				     //Флаг ошибки
    var WshShell = WScript.CreateObject("WScript.Shell");       //WshShell - используется для выполнения системных комманд  
    ///////////////////////////////////////////////////////////
    //	 Создание необходимых объектов файловой системы      //
    ///////////////////////////////////////////////////////////
    var fso = WScript.CreateObject("Scripting.FileSystemObject");	//Объект для файловой системы
    var ReportFile = fso.CreateTextFile("G:\\FileService\\ODLMReports\\" + GetTime() + "_main.txt",true); //Создание файла отчета и открытие его потока
    try
    {
      objUsersFolder = fso.GetFolder("E:\\Users");		 //Попытка получения объекта стартового каталога
      enumUserFolders = new Enumerator(objUsersFolder.SubFolders);	 //Создание коллекции для всех подкаталогов текущего каталога
    }
    catch(e)							//Обработка ошибки создания объекта стартового каталога
    {
      ReportFile.Write("Unable to open directory G:\\users or creating subfolders collection. Error: " + e.description);
      ReportFile.Close();
      WScript.Quit();
    }
    ///////////////////////////////////////////////////////////
    //	 Считываение каталогов пользователей	 	  //
    ///////////////////////////////////////////////////////////
    while(!enumUserFolders.atEnd())	  //Цикл перебора всех подпапок
    {
    	objUserFolder = enumUserFolders.item();
    	UserName = objUserFolder.Name;
    	/////////////////////////////////////////////////////////
    	// Получение ссылки на ADSI-объект пользователя        //
    	/////////////////////////////////////////////////////////
    	try
    	{
    		objADSIUser = GetObject("WinNT://POLAD/"+UserName+",user");//ADSI объект текущего пользователя
    	}
    	catch(e)
    	{
    		NoMove = false;
    	}	
    	if(!NoMove)
    	{
    		/////////////////////////////////////////////////////////////
    		// Перемещение каталога 		          	       //
    		/////////////////////////////////////////////////////////////	
        		UserFolderSpec = objUserFolder.Path;
        		WScript.Echo("Moving directory " + UserName);
        		ReportFile.Write("Moving directory " + UserName + "\n");
        		WshShell.Run("robocopy " + UserFolderSpec + " " + OldUsersFolder + "\\" + UserName + " /move /e /copyall /v /LOG:G:\\FileService\\ODLMReports\\" + UserName + ".txt /TEE /R:5 /W:5",1,true);
    	}
    	enumUserFolders.moveNext();
    }
    ReportFile.Write("odlm.js script is finished.\n");
    ReportFile.Close();		//Закрытие файла отчета
    
    //////////////////////////////////////////////////////////
    // Функция получения текущей даты и времени		 //
    //////////////////////////////////////////////////////////
    function GetTime()
    {
    	var objCurrentDate = new Date;
    	var strCurrentTime = objCurrentDate.getDate();
    	var CurrentMonth = (objCurrentDate.getMonth()+1);
    	if(CurrentMonth<10)
    		strCurrentTime +="0";
    	strCurrentTime += CurrentMonth; 
    	strCurrentTime += objCurrentDate.getYear();
    	strCurrentTime += "_";
    	strCurrentTime += objCurrentDate.getHours();
    	strCurrentTime += objCurrentDate.getMinutes();
    	strCurrentTime += objCurrentDate.getSeconds();
    	return strCurrentTime;
    }

    Andrew Mishechkin
    • Помечено в качестве ответа Vitaliy Golikov 22 августа 2009 г. 13:28
    22 августа 2009 г. 12:22

Все ответы

  • Расскажите пожалуйста что конкретно у вас не получается. Или вы хотите просто получить готовый скрипт? :)
    Еще не понятно как должен инициироваться сценарий - по каким то условиям или вручную? Что за пользовательские каталоги? Обычные общие папки (тогда справится xcopy) или профили пользователей (перемещяемые или перенаправляемые?).


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    22 августа 2009 г. 4:31
    Модератор
  • Начну немножко не по порядку! В посте описал одну из подзадач которую хотелось бы реализовать. Быть может существуют более адекватные методы работы с учетными записями пользователей и их персональными каталогами. В компании порядка 1000 пользователей, соответственно управлять учетными записями вручную очень проблематично!
    Комплексно я вижу задачу так:
    1. Периодически запускается скрипт, который проверяет lastlogontime, если это значение больше 60 дней, то учетная запись должна заблокироваться и переместиться в другой OU
    2. Одновременно каталог пользователя (перенаправленные документы) расположенный по пути \\company.name\ofice\userdoc\%username% должен переместиться \\company.name\ofice\NOusers\%username%
    3. Почтовый ящик пользователя должен удалиться на сервере MS Exchange 2003 и пользователь должен автоматически быть убран из глобального списка адресов.
    Профилями можно несколько принебречь, т.к. объем каждого не превышает 30 Мб, а вообще профили перемещаемые.
    Лично я вижу инициирование события по EventID блокировки учетной записи пользователя.

    22 августа 2009 г. 7:29
  • Комплексно я вижу задачу так:
    1. Периодически запускается скрипт, который проверяет lastlogontime, если это значение больше 60 дней, то учетная запись должна заблокироваться и переместиться в другой OU


    Рискуете заблокировать аккаунты действующих сотрудников. ИМХО определить техническими средствами увольнение сотрудника - задача очень нетривиальная. Тут надо действовать не технически а организационно.
    У нас реализовано следующим образом: при увольнении в обходном листе обязательная подпись сисадмина. Админ перед тем как подписать запускает специальный скрипт, который отключает  учетку, перемещает ее в спец. ОУ, удаляет пользователя джаббер и рассылает оповещения необходимым сотрудникам, например админу почтовой системы (почта у нас крутится на UNIX-системе). Раз в неделю админ специальным скриптом проходит по отключенным аккаунтам, и те у которых истек срок давности - удаляет. Чистка личных каталогов пользователей тоже производится специальным скриптом, периодически запускаемым на файловом сервере.
    Ниже коды приведенных скриптов:
    //////////////////////////////////////////////////////////
    // Скрипт отключения пользователя			//
    // Язык: JScript	  	                          //
    // Автор: Андрей Мишечкин		                 //
    //////////////////////////////////////////////////////////
    var objLDAPUser;
    var objRootDSE = GetObject("LDAP://rootDSE");
    var Args = WScript.Arguments;			//Аргументы коммандной строки
    var WshShell = WScript.CreateObject("WScript.Shell");
    
    ////////////////////////////////////////////////////////////////
    //   Создание ADSI объектов пользователя		      //
    ////////////////////////////////////////////////////////////////
    if(Args.length == 1)				//Указано только имя пользователя
    {
       var LoginUserName = Args(0);
    }
    else 						//Неправильные аргументы коммандной строки
    {
       WScript.Echo("Usage: disable[.js] LoginUserName");
       WScript.Quit()
    }
    ////////////////////////////////////////////////////////
    //   	Создание ADO-подключения		       //
    ////////////////////////////////////////////////////////
    var objConnection = WScript.CreateObject("ADODB.Connection");	//объект ADO-соединения
    var objCommand = WScript.CreateObject("ADODB.Command");         //объект запроса
    objConnection.Provider = "ADsDSOObject";
    objConnection.Open("Active Directory Provider");
    objCommand.ActiveConnection = objConnection;
    
    objCommand.Properties("Page Size")=1000;
    
    ////////////////////////////////////////////////////////////////////////
    //   	Выбор всех имен пользователей из AD c обработкой ошибок     //
    ////////////////////////////////////////////////////////////////////////
    try
    {
    	 objCommand.CommandText = "SELECT sAMAccountName,distinguishedName from 'LDAP://DC=local,DC=polad,DC=ru' Where objectClass='user' and objectClass<>'computer'";
    	 var objADCRes = objCommand.Execute;
    }
    catch(e)
    {
    	 WScript.Echo("ADODB error. " + e.description);
    	 WScript.Quit(1);
    }
    var IsUserFound = false;			//Флаг "Пользователь найден/не найден"
    objADCRes.MoveFirst;			//Переход к первому элементу коллекции выборки учетных записей пользователей
    while(!objADCRes.EOF)			//Цикл перебора всех учетных записей пользователей
    {
    	//Получение LDAP-объекта пользователя
    	if(objADCRes.Fields("sAMAccountName").Value == LoginUserName)
    	{
         	   objLDAPUser = GetObject("LDAP://" + objADCRes.Fields("distinguishedName").Value);
         	   IsUserFound = true;
         	   break;
      	}
      	else
      	  objADCRes.MoveNext;
    }
    if(!IsUserFound)
    {
      WScript.Echo("No user found");
      WScript.Quit();
    }
      
    /////////////////////////////////////////////////
    //   Отключение пользователя			            //
    ////////////////////////////////////////////////
    var intUAC = objLDAPUser.Get("userAccountControl");
    if(!(intUAC & 2))
    {
        objLDAPUser.Put("userAccountControl", intUAC | 2);
        objLDAPUser.SetInfo();
        WScript.Echo("User "+ LoginUserName +" is disabled");
        Information(LoginUserName);
    }
    else
        WScript.Echo("User " + LoginUserName + " is already disabled");
    ////////////////////////////////////////////////////////////////////////
    //   	Перемещение отключенной учетной записи в OU=DisabledAccounts    //
    ////////////////////////////////////////////////////////////////////////
    var strDN = new String(objADCRes.Fields("distinguishedName").Value);
    var reDisabledAccounts = new RegExp("DisabledAccounts","i");
    var MatchResult = strDN.match(reDisabledAccounts);
    //WScript.Echo(MatchResult);
    if(!MatchResult)
    {
      objOU = GetObject("LDAP://OU=DisabledAccounts," + objRootDSE.Get("defaultNamingContext"));
      objOU.MoveHere("LDAP://" + objADCRes.Fields("distinguishedName").Value, "CN="+LoginUserName);
      WScript.Echo("User " + LoginUserName + " is moved to OU=DisabledAccounts");
    }
    else
      WScript.Echo("User " + LoginUserName + " is already present in OU=DisabledAccounts");
    
    if(WshShell.Popup("Удалить пользователя Jabber?",0,"",4)==6)
    {
    	try
    	{
    		var objOUICQ = GetObject("LDAP://OU=IcqUsers,OU=UsersOfPolad,DC=local,DC=polad,DC=ru");
    		objOUICQ.Delete("user", "cn="+LoginUserName+"_icq");
    	}
    	catch(e)
    	{
    	  try
    	  {
    		var objOUICQ = GetObject("LDAP://OU=PSM,OU=IcqUsers,OU=UsersOfPolad,DC=local,DC=polad,DC=ru");
    		objOUICQ.Delete("user", "cn="+LoginUserName+"_icq");
    	  }
    	  catch(e)
    	  {
    		WScript.Echo("Ошибка удаления пользователя джаббер: "+LoginUserName+"_icq");
    		WScript.Quit(1);
    	  }
    	}
    	WScript.Echo("Удален пользователь джаббер: "+LoginUserName+"_icq");
    }
    
    function Information(UserName)
    {
       var WMIServiceObj = GetObject("Winmgmts:");
       var ProcEnumerator = new Enumerator(WMIServiceObj.ExecQuery("Select Handle from Win32_Process WHERE Caption = 'cscript.exe' OR Caption = 'wscript.exe'"));
       var ProcHandle = ProcEnumerator.item().Handle;	
       var objWMIProcess = GetObject("winmgmts:Win32_Process.Handle='" + ProcHandle + "'");
       var wmiOutParams = objWMIProcess.ExecMethod_("GetOwner");
       var AdministratorName = wmiOutParams.User;
       var objCurrentDate = new Date;
       var CurrentDate = objCurrentDate.getDate();
       CurrentDate += "." + (objCurrentDate.getMonth()+1);
       CurrentDate += "." + objCurrentDate.getYear() + " ";
       var CurrentHour = objCurrentDate.getHours();
       if(CurrentHour < 10)
    		CurrentDate += "0";
       CurrentDate += CurrentHour + ":";
       var CurrentMinute = objCurrentDate.getMinutes();
       if(CurrentMinute < 10)
    		CurrentDate += "0";
       CurrentDate += CurrentMinute;
       var objEmail = WScript.CreateObject("CDO.Message");
       objEmail.From = "\"Disable script\" diag@polad.ru";
       objEmail.To = "anmi@polad.ru,likian@polad.ru,amilek@polad.ru,kuklin@polad.ru,j@polad.ru";
       objEmail.Subject = UserName +" is disabled";
       objEmail.Textbody = "User " + UserName + " is disabled by " + AdministratorName + " in " + CurrentDate;
       objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
       objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.polad.ru";
       objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25;
       objEmail.Configuration.Fields.Update();
       try
       {
          objEmail.Send();
       }
       catch(e)
       {
          WScript.Echo("Mail system error: " + e.description);
       }
    }

    //////////////////////////////////////////////////////////
    // Скрипт удаления отключенных учетных записей          //
    // в OU=DisabledAccounts                  		 // 
    // Язык: JScript // // Автор: Андрей Мишечкин // ////////////////////////////////////////////////////////// //Объявление переменных var count1 = 0; //Счетчик общего количества пользователей var count2 = 0; //Счетчик числа увволенных пользователей var delUsersList = ""; //Список удаленных пользователей var objNTUser; //ADSI-объект пользователя (используя NTLM) var input; //переменная ввода символов со стандартного потока
    //Определение полного пути к орг. единце с отключенными учетными записями var DisabledAccountsOU = "LDAP://OU=DisabledAccounts,DC=local,DC=polad,DC=ru"; //Получение объекта орг. единицы и определение коллекции ее членов с обработкой ошибок try { var objDisabledAccountsOU = GetObject(DisabledAccountsOU); var enumDisabledAccountsOU = new Enumerator(objDisabledAccountsOU); } catch(e) { WScript.Echo("Can't create the OU object and collection" + e.description); } ////////////////////////////////////////////////////////////////////// // Основной цикл перебора элементов коллекции // ////////////////////////////////////////////////////////////////////// for(;!enumDisabledAccountsOU.atEnd();enumDisabledAccountsOU.moveNext()) { objOUMember = enumDisabledAccountsOU.item(); if(objOUMember.Class == "user") { //Вывод на экран информации о пользователе WScript.Echo("Login name: " + GetParam("objOUMember","sAMAccountName")); WScript.Echo("Display name: " + GetParam("objOUMember","displayName")); WScript.Echo("Description: " + GetParam("objOUMember","Description")); WScript.Echo("Last login time: " + GetParam("objNTUser","LastLogin")); if(objOUMember.AccountDisabled == 1) WScript.Echo("Account disabled"); else WScript.Echo("Account is not disabled"); //Выполнение удаления пользователя выполнении условия. WScript.Echo("Delete this account ? Y/N"); for(;;) { input = ""; input = WScript.StdIn.ReadLine(); if((input == "Y")||(input == "y")) { try { objDisabledAccountsOU.Delete("user","cn=" + objOUMember.Get("Name")); } catch(e) { WScript.Echo("Error. Account " + objOUMember.Get("sAMAccountName") + " is not deleted. " + e.description); } WScript.Echo(objOUMember.Get("sAMAccountName") + " is deleted"); delUsersList += GetParam("objOUMember","sAMAccountName") + " / " + GetParam("objOUMember","displayName") + "\n"; count2++; break; } else if((input == "N")||(input == "n")) { WScript.Echo(objOUMember.Get("sAMAccountName") + " is not deleted"); break; } else { WScript.Echo("Invalid option."); WScript.Echo("Delete this account ? Y/N"); } } WScript.Echo("------------------------------------------------------------"); count1++; } } WScript.Echo("Total accounts: " + count1); WScript.Echo("Deleted accounts: " + count2); Information(); ////////////////////////////////////////////////////////////////// // Фукнкция считывания параметров из кэша с обработкой ошибок // ////////////////////////////////////////////////////////////////// function GetParam(object,ParamName) { var result; if(object == "objOUMember") var objUser = objOUMember; else if(object == "objNTUser") var objUser = GetObject("WinNT://POLAD/" + objOUMember.Get("sAMAccountName") + ",user"); try { result = objUser.Get(ParamName); } catch(e) { result = "Undefined"; } return result; } function Information() { var WMIServiceObj = GetObject("Winmgmts:"); var ProcEnumerator = new Enumerator(WMIServiceObj.ExecQuery("Select Handle from Win32_Process WHERE Caption = 'cscript.exe' OR Caption = 'wscript.exe'")); var ProcHandle = ProcEnumerator.item().Handle; var objWMIProcess = GetObject("winmgmts:Win32_Process.Handle='" + ProcHandle + "'"); var wmiOutParams = objWMIProcess.ExecMethod_("GetOwner"); var AdministratorName = wmiOutParams.User; var objCurrentDate = new Date; var CurrentDate = objCurrentDate.getDate(); CurrentDate += "." + (objCurrentDate.getMonth()+1); CurrentDate += "." + objCurrentDate.getYear() + " "; var CurrentHour = objCurrentDate.getHours(); if(CurrentHour < 10) CurrentDate += "0"; CurrentDate += CurrentHour + ":"; var CurrentMinute = objCurrentDate.getMinutes(); if(CurrentMinute < 10) CurrentDate += "0"; CurrentDate += CurrentMinute; var objEmail = WScript.CreateObject("CDO.Message"); objEmail.From = "\"Usrclean script\" diag@polad.ru"; objEmail.To = "anmi@polad.ru"; objEmail.Subject = "Usrclean.js report"; objEmail.Textbody = "Users:\n" + delUsersList + "was deleted by " + AdministratorName + " in " + CurrentDate; objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2; objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.polad.ru"; objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25; objEmail.Configuration.Fields.Update(); try { objEmail.Send(); } catch(e) { WScript.Echo("Mail system error: " + e.description); } }
    ///////////////////////////////////////////////////////////
    // Сценарий для переноса каталогов увволенных сотрудников //
    // на ресурс длительного хранения.                       //
    // Используется утилита robocopy.exe                     //
    // Автор: Андрей Мишечкин                                //
    ///////////////////////////////////////////////////////////
    
    //Необходимые глобальные переменные					
    var objADSIUser					     //Ссылка на ADSI-объект пользователя
    var objUsersFolder;				     //Ссылка на объект каталога пользователя
    var UserFolderSpec;                                         //Полное имя каталога пользователя
    var OldUsersFolder = "I:\\ODBackup\\OldUsers\\";            //Переменная каталога долговременного хранения
    var enumUserFolders;				     //Коллекция каталогов пользователей
    var NoMove = true;					     //Флаг отмены перемещения каталога пользователя
    var IsError = false;				     //Флаг ошибки
    var WshShell = WScript.CreateObject("WScript.Shell");       //WshShell - используется для выполнения системных комманд  
    ///////////////////////////////////////////////////////////
    //	 Создание необходимых объектов файловой системы      //
    ///////////////////////////////////////////////////////////
    var fso = WScript.CreateObject("Scripting.FileSystemObject");	//Объект для файловой системы
    var ReportFile = fso.CreateTextFile("G:\\FileService\\ODLMReports\\" + GetTime() + "_main.txt",true); //Создание файла отчета и открытие его потока
    try
    {
      objUsersFolder = fso.GetFolder("E:\\Users");		 //Попытка получения объекта стартового каталога
      enumUserFolders = new Enumerator(objUsersFolder.SubFolders);	 //Создание коллекции для всех подкаталогов текущего каталога
    }
    catch(e)							//Обработка ошибки создания объекта стартового каталога
    {
      ReportFile.Write("Unable to open directory G:\\users or creating subfolders collection. Error: " + e.description);
      ReportFile.Close();
      WScript.Quit();
    }
    ///////////////////////////////////////////////////////////
    //	 Считываение каталогов пользователей	 	  //
    ///////////////////////////////////////////////////////////
    while(!enumUserFolders.atEnd())	  //Цикл перебора всех подпапок
    {
    	objUserFolder = enumUserFolders.item();
    	UserName = objUserFolder.Name;
    	/////////////////////////////////////////////////////////
    	// Получение ссылки на ADSI-объект пользователя        //
    	/////////////////////////////////////////////////////////
    	try
    	{
    		objADSIUser = GetObject("WinNT://POLAD/"+UserName+",user");//ADSI объект текущего пользователя
    	}
    	catch(e)
    	{
    		NoMove = false;
    	}	
    	if(!NoMove)
    	{
    		/////////////////////////////////////////////////////////////
    		// Перемещение каталога 		          	       //
    		/////////////////////////////////////////////////////////////	
        		UserFolderSpec = objUserFolder.Path;
        		WScript.Echo("Moving directory " + UserName);
        		ReportFile.Write("Moving directory " + UserName + "\n");
        		WshShell.Run("robocopy " + UserFolderSpec + " " + OldUsersFolder + "\\" + UserName + " /move /e /copyall /v /LOG:G:\\FileService\\ODLMReports\\" + UserName + ".txt /TEE /R:5 /W:5",1,true);
    	}
    	enumUserFolders.moveNext();
    }
    ReportFile.Write("odlm.js script is finished.\n");
    ReportFile.Close();		//Закрытие файла отчета
    
    //////////////////////////////////////////////////////////
    // Функция получения текущей даты и времени		 //
    //////////////////////////////////////////////////////////
    function GetTime()
    {
    	var objCurrentDate = new Date;
    	var strCurrentTime = objCurrentDate.getDate();
    	var CurrentMonth = (objCurrentDate.getMonth()+1);
    	if(CurrentMonth<10)
    		strCurrentTime +="0";
    	strCurrentTime += CurrentMonth; 
    	strCurrentTime += objCurrentDate.getYear();
    	strCurrentTime += "_";
    	strCurrentTime += objCurrentDate.getHours();
    	strCurrentTime += objCurrentDate.getMinutes();
    	strCurrentTime += objCurrentDate.getSeconds();
    	return strCurrentTime;
    }

    Andrew Mishechkin
    • Помечено в качестве ответа Vitaliy Golikov 22 августа 2009 г. 13:28
    22 августа 2009 г. 12:22