<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScript: Вывод списка пользователей на каждом контроллере домена...]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=920</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=920&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScript: Вывод списка пользователей на каждом контроллере домена...».]]></description>
		<lastBuildDate>Thu, 06 Dec 2007 07:26:52 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScript: Вывод списка пользователей на каждом контроллере домена...]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=6701#p6701</link>
			<description><![CDATA[<p>Если стоит задача блокировки учетных записей, неактивных более определённого количества дней, эту задачу можно в некоторых случаях решить и без скриптов, интерактивно:<br />1. Установить &quot;Windows Server 2003 Service Pack 2 Administration Tools Pack&quot; (adminpak_sp2.msi), на WinXP SP2 ставится без проблем.<br />2. Запустить mmc.exe, подключить оснастку &quot;Active Directory Users and Computers&quot;.<br />3. В ветви &quot;Saved Queries&quot; в контекстном меню - &quot;New&quot; - &quot;Query&quot;.<br />4. В окне &quot;New Query&quot; кнопка &quot;Define Query...&quot;, затем в окне поиска задать нужное значение в поле &quot;Days since last logon&quot;.<br />5. В правой панели оснастки выделить всех найденных пользователей, в контекстном меню - &quot;Disable Account&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Thu, 06 Dec 2007 07:26:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=6701#p6701</guid>
		</item>
		<item>
			<title><![CDATA[JScript: Вывод списка пользователей на каждом контроллере домена...]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=6638#p6638</link>
			<description><![CDATA[<p>... с указанием даты последнего входа пользователя в домен.</p><p>Поскольку пользователь мог ни разу не входить в домен, дата входа в зависимости от версии Windows Server (2000, 2003) может быть как 0, так и null (&lt;Not Set&gt;). Если дата входа равна 0, то она выводится как &quot;1 января 1601 г. 0:00:00&quot;. Если она равна null, то выдается сообщение &quot;Значение lastLogon для текущего пользователя отсутствует&quot;.</p><p>Скрипт может (и должен) использоваться для отслеживания неактивных пользователей.</p><p>Оговорка - делать на основе этого скрипта автоматическое удаление неактивных пользователей нужно осторожно, так как в неактивных могут присутствовать пользователи, созданные системой автоматически для своих нужд. Удалять их не рекомендуется. В теме <a href="http://forum.script-coding.com/viewtopic.php?id=859">http://forum.script-coding.com/viewtopic.php?id=859</a> были попытки найти способ отличить системных пользователей от &quot;ручных&quot;, но универсальный способ пока не найден.</p><p>За помощь в тестировании скрипта и высказанные замечания спасибо <strong>alexii</strong>.</p><div class="codebox"><pre><code>var WSH = new ActiveXObject (&#039;WScript.Shell&#039;);

// Если скрипт запущен через WScript, ругаемся и выходим
if (WScript.FullName.toLowerCase() == (WScript.Path+&#039;\\wscript.exe&#039;).toLowerCase()) {
      WSH.Popup(&#039;Запуск сценария производится только через &#039;+WScript.Path+&#039;\\cscript.exe.\n\nВыходим...&#039;, 0, &#039;Ошибка&#039;, 16);
      WScript.Quit();
}

var Stdout = WScript.Stdout;
var Stdin  = WScript.Stdin;
var objDict = new ActiveXObject(&quot;Scripting.Dictionary&quot;);
var objConnection = new ActiveXObject(&quot;ADODB.Connection&quot;);
var objCommand = new ActiveXObject(&quot;ADODB.Command&quot;);
var oRoot = GetObject(&quot;LDAP://rootDSE&quot;);
var sDomain = oRoot.Get(&quot;defaultNamingContext&quot;);

var strLDAP  = &quot;LDAP://OU=Domain Controllers,&quot; + sDomain;
var ADS_SCOPE_SUBTREE = 2;
var space = &#039;                                                                                                                                       &#039;;
var date1601 = Math.abs((new Date(1601,0,1)).getTime())
var strDC, temp, arr

// Формируем запрос на поиск всех серверов домена ========================
objConnection.Provider = &quot;ADsDSOObject&quot;;
objConnection.Open(&quot;Active Directory Provider&quot;);

objCommand.ActiveConnection = objConnection;
objCommand.Properties(&quot;Page Size&quot;) = 500;
objCommand.Properties(&quot;Searchscope&quot;) = ADS_SCOPE_SUBTREE;
objCommand.Properties(&quot;Sort On&quot;) = &quot;sAMAccountName&quot;;
objCommand.CommandText = &quot;SELECT sAMAccountName,adsPath FROM &#039;&quot; + strLDAP + &quot;&#039; WHERE objectCategory=&#039;computer&#039;&quot;;
// =======================================================================

// Выполняем запрос
var objRSServers = objCommand.Execute;

// Перебираем все найденные серверы и добавляем юзеров в глобальный
// для сценария словарь objDict (в функции GetUsers)
while ( !objRSServers.EOF ) {
   strDC = objRSServers.Fields(&quot;sAMAccountName&quot;).Value;
   GetUsers(strDC.substr(0, strDC.length-1 ));
   objRSServers.moveNext()
}

// сортируем логины по алфавиту
arr = (new VBArray(objDict.Keys())).toArray();
for (var i = arr.length - 1; i&gt;=0; i--) {
   for (var j= 0; j&lt;i; j++) {
      if ( arr[j]&gt;arr[j+1] ) {
         temp=arr[j+1];
         arr[j+1]=arr[j];
         arr[j]=temp;
      }
   }
}

// Перебираем всех найденных юзверей
var name, lastLogon, age, Item
var comment = &#039;   &lt;Значение lastLogon для текущего пользователя отсутствует&gt;&#039;;
for (var usr in arr)
{
   name = arr[usr];

   Stdout.Write( (name+space).substr(0,30) );

   lastLogon = objDict(name);
   if(lastLogon instanceof Date) {
      age = (new Date() - lastLogon)/(86400*1000);
      Stdout.WriteLine( (&quot;Дата последнего входа: &quot; +(lastLogon).toLocaleString()+space).substr(0,53)+
                        &quot;(&quot;+(space+age.toFixed(0)).slice(-7)+&quot; дней назад)&quot; );
   } else {
      Stdout.WriteLine( comment );
   }

}

Stdout.WriteLine (&quot;\nНажмите Enter&quot;);
Stdin.ReadLine ();


//
// FUNCTIONS
//


// Выбирает всех пользователей на заданном сервере домена в ассоциативный массив
function GetUsers( strDC ) {
var dLastLogin;
var Conn = new ActiveXObject(&quot;ADODB.Connection&quot;);
var RSUsers = new ActiveXObject (&quot;ADODB.Recordset&quot;);
var query = &quot;SELECT sAMAccountName, lastLogon FROM &#039;LDAP://&quot; + strDC + &quot;&#039; WHERE objectCategory=&#039;user&#039;&quot;

   Stdout.WriteLine(&quot;Список пользователей на: &quot; + strDC);

   Conn.Provider = &quot;ADsDSOObject&quot;;
   Conn.Open(&quot;Active Directory Provider&quot;);
   RSUsers.ActiveConnection = Conn;

   for ( RSUsers.Open (query); !RSUsers.EOF; RSUsers.moveNext() ) {

      // Для уникальности имени добавляем к нему имя DC
      sAMAccountName = strDC+&quot;: &quot;+RSUsers.Fields(&quot;sAMAccountName&quot;).Value;

      if ( dLastLogin = RSUsers.Fields(&quot;lastLogon&quot;).Value ) {
         // сюда попадаем, когда у атрибута есть значение (любое)
         dLastLogin     = getLast(dLastLogin);
      } else {
         // сюда попадаем, когда атрибута нет значения (&lt;Not Set&gt;)
      }

      AddToDict(sAMAccountName, dLastLogin)
   }
}


// добавляет в ассоциативный массив значение с примечанием
function AddToDict(name, value) {
   if (!objDict.Exists (name) ) {
      objDict.Add ( name, value );
   } else {
      objDict(name) = value;
   }
}

// конвертирует lastLogon, возвращенный запросом к LDAP, в удобоваримую дату
function getLast( last ) {
var res,
    intLastLogonTime = last.HighPart* (4294967296) + last.LowPart;

   res = intLastLogonTime / 10000;
   res = res - date1601;

   return (new Date(res));
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (delpher)]]></author>
			<pubDate>Wed, 05 Dec 2007 07:48:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=6638#p6638</guid>
		</item>
	</channel>
</rss>
