<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS,HTA: Запрос в Active Directory]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11288&amp;type=atom" />
	<updated>2016-02-08T03:45:38Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11288</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS,HTA: Запрос в Active Directory]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100933#p100933" />
			<content type="html"><![CDATA[<p>Вышел из ситуации разделением на 3 кнопки, т.е. для поиска по фамилии, логону и имени ПК. Работает быстро, но появилось лишних 3 кнопки, что печально. Можно как нибудь все таки сжать в 1?, нужен обработчик, который определит что введено или оставить как есть?</p><p>Сам код:<br /></p><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;1.css&quot;&gt;
&lt;HTA:APPLICATION
  ID=&quot;objPCManage&quot;
  CONTEXTMENU=&quot;no&quot;/&gt;
  &lt;script language=&quot;vbscript&quot;&gt;
&#039;---------------------------------------------------
	&#039; Конвертирование имени домена в нужный формат в АД
	&#039;---------------------------------------------------
	Function ConvertDomainNametoADsPath2()
		Dim strDomainName,arrDomLevels
			strDomainName = DomainNameAD2.value
			arrDomLevels = Split(strDomainName, &quot;.&quot;)
		ConvertDomainNametoADsPath2 = &quot;dc=&quot; &amp; Join(arrDomLevels, &quot;,dc=&quot;)
	End Function
	
	
	Sub useridsearch
		&#039;sNTDomain = &quot;mechel&quot; &#039;введите домен для WinNT
		sNTDomain = DomainNameWinNt.value
		if len(trim(struserid.value)) = 0 or struserid.value = &quot;*&quot; then 
		  Msgbox &quot;Please enter a valid username.&quot;,48,&quot;Invalid entry&quot;
		  exit sub
		End If
		BaseUserInfo.style.height = &quot;80px&quot;
		sUserIDValue = replace(strUserId.value,&quot;&amp;apos;&quot;,&quot;&#039;&quot;)
		&#039;Define Constant and declare variables
		Const ADS_UF_ACCOUNTDISABLE = &amp;H02
		Const ADS_UF_PASSWD_CANT_CHANGE = &amp;H40
		Const ADS_UF_LOCKOUT = &amp;H10
		Const ADS_UF_DONT_EXPIRE_PASSWD = &amp;H10000
		Const SEC_IN_DAY = 86400
		acctdisable = &quot;Enabled&quot;
		acctlocked = &quot;Not Locked&quot;
		strPasswordSet = &quot;&quot;
		&#039; Use ADO to search Active Directory.
		Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
		Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
		objConnection.Provider = &quot;ADsDSOOBject&quot;
		objConnection.Open &quot;Active Directory Provider&quot;
		Set objCommand.ActiveConnection = objConnection
		strDNSDomain = ConvertDomainNametoADsPath2()
		strFilter = &quot;(&amp;(objectCategory=person)(objectClass=user)(sAMAccountName=&quot; &amp; sUserIDValue &amp; &quot;))&quot;
		strQuery = &quot;&lt;LDAP://&quot; &amp; strDNSDomain &amp; &quot;&gt;;&quot; &amp; strFilter _
		  &amp; &quot;;sAMAccountName, distinguishedName, DisplayName, givenName, sn, UserAccountControl, CN, l, mail, Department, telephoneNumber, Title, employeeid;subtree&quot;
		objCommand.CommandText = strQuery
		objCommand.Properties(&quot;Page Size&quot;) = 750
		objCommand.Properties(&quot;Timeout&quot;) = 60
		objCommand.Properties(&quot;Cache Results&quot;) = False
		&#039; Enumerate all users. Check if accounts disabled.
		Set objRecordset = objCommand.execute
		x = 0
		Do Until objRecordset.EOF
			&#039;if user is found, set strusrpath to full DN name
			intFlag = objRecordSet.Fields(&quot;userAccountControl&quot;)
			lngFlag = objRecordSet.Fields(&quot;userAccountControl&quot;)
			strusrpath = objrecordset.fields(&quot;distinguishedName&quot;)
			Txt_userdn = strusrpath
			Txt_userid = objRecordSet.Fields(&quot;SamAccountName&quot;)
			Txt_userempid = objRecordSet.fields(&quot;employeeid&quot;)
			Txt_userDisplay = objRecordSet.fields(&quot;DisplayName&quot;)
		&#039;	Txt_usercn = objRecordSet.fields(&quot;cn&quot;)
		&#039;	Txt_userfn = objRecordSet.fields(&quot;givenName&quot;)
		&#039;	Txt_userln = objRecordSet.fields(&quot;sn&quot;)
			Txt_userAC = objRecordSet.fields(&quot;UserAccountControl&quot;)
			Txt_userDept = objRecordSet.fields(&quot;Department&quot;)
			Txt_userTitle = objRecordSet.fields(&quot;Title&quot;)
			Txt_userPhone = objRecordSet.fields(&quot;telephoneNumber&quot;)
			strPasswordset = &quot;&lt;br&gt;&lt;table width:100%&quot;&quot;&gt;&lt;tr&gt;&lt;td&gt;Reset User Password:&lt;/td&gt;&lt;td&gt;&lt;input border-width:1px&quot;&quot; type=&quot;&quot;password&quot;&quot; name=&quot;&quot;password&quot;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;input id=&quot;&quot;passreset&quot;&quot; button&quot;&quot; type=&quot;&quot;button&quot;&quot; value=&quot;&quot;Perform action&quot;&quot; name=&quot;&quot;changepass&quot;&quot; onClick=&quot;&quot;ChangePassword&quot;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Force user to change password?&amp;nbsp;&lt;input type=&quot;&quot;checkbox&quot;&quot; name=&quot;&quot;cbxForceChange&quot;&quot;&gt;&lt;/td&gt;&lt;td&gt;Unlock account?&amp;nbsp;&lt;input type=&quot;&quot;checkbox&quot;&quot; name=&quot;&quot;cbxUnlock&quot;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;span id=&quot;&quot;spnenabledisable&quot;&quot;&gt;Enable&lt;/span&gt; account?&amp;nbsp;&lt;input type=&quot;&quot;checkbox&quot;&quot; name=&quot;&quot;cbxEnable&quot;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&quot;
			If (intFlag And ADS_UF_ACCOUNTDISABLE) &lt;&gt; 0 Then
				acctdisable = &quot;Disabled&quot;
			End If
			Set objUser = GetObject(&quot;LDAP://&quot; &amp; strusrpath &amp; &quot;&quot;)
			intUAC = objUser.Get(&quot;UserAccountControl&quot;)
			If objUser.IsAccountLocked = True Then
				strPasswordset = strPasswordset &amp; &quot; &lt;input id=unlock button&quot;&quot; type=&quot;&quot;button&quot;&quot; value=&quot;&quot;Unlock Account&quot;&quot; name=&quot;&quot;accunlock&quot;&quot; onclick=&quot;&quot;UnlockAccount&quot;&quot;&gt;&quot;
				acctlocked = &quot;Locked&quot;
			End If
			If intFlag And ADS_UF_DONT_EXPIRE_PASSWD Then
				Txt_pwdexpire = &quot;The password &lt;font color=&quot;&quot;red&quot;&quot;&gt;&lt;b&gt;does not&lt;/b&gt;&lt;/font&gt; expire&lt;br&gt;&quot;
			Else
				on error resume next
			dtmValue = objUser.PasswordLastChanged
				intTimeInterval = int(Now - dtmValue)
				&#039;modify domain name in next line
				Set objDomainNT = GetObject(&quot;WinNT://&quot; &amp; sNTDomain)
				ntMaxPwdAge = objDomainNT.Get(&quot;MaxPasswordAge&quot;)
				intMaxPwdAge = (ntMaxPwdAge/SEC_IN_DAY)
				If intTimeInterval &gt;= intMaxPwdAge and acctDisable &lt;&gt; &quot;Disabled&quot; Then
					Txt_pwdexpire = &quot;Password &lt;font color=&quot;&quot;red&quot;&quot;&gt;&lt;b&gt;has expired&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&quot;
				Else
					If acctDisable &lt;&gt; &quot;Disabled&quot; then Txt_pwdexpire = &quot;Password will expire in &lt;font color=&quot;&quot;red&quot;&quot;&gt;&quot; &amp; int((dtmValue + intMaxPwdAge) - now) &amp; &quot;&lt;/font&gt; days&lt;br&gt;&quot;
				End If
			End If             
			strBaseUserInfo = &quot;&lt;table pretty-table&quot;&quot; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Username&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Full Name&lt;/th&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; Txt_userDisplay &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&quot;
		&#039;	  	&quot;&lt;tr&gt;&lt;td&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; txt_userln &amp; &quot;, &quot; &amp; txt_userfn &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&quot;
			strAddUserInfo = &quot;&lt;table class=&#039;pretty-table&#039; rule=&#039;rows&#039; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; colspan=&#039;2&#039; scope=&quot;&quot;col&quot;&quot;&gt;&lt;b&gt;&lt;center&gt;Additional Information&lt;/center&gt;&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; &gt;Title:&lt;/th&gt;&lt;td&gt;&quot; &amp; Txt_userTitle &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
			  &quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; &gt;Department:&lt;/th&gt;&lt;td&gt;&quot; &amp; Txt_userDept &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; &gt;Telephone:&lt;/th&gt;&lt;td&gt;&quot; &amp; Txt_userPhone &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;/table&gt;&quot;			
			strAccUserStatus = &quot;&lt;table class=&#039;pretty-table&#039; rule=&#039;rows&#039; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th colspan=&#039;2&#039; scope=&quot;&quot;col&quot;&quot;&gt;&lt;center&gt;Account Status&lt;/center&gt;&lt;/th&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td scope=&quot;&quot;row&quot;&quot; &gt;This account is:&lt;/td&gt;&lt;td&gt;&quot; &amp; acctdisable &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td scope=&quot;&quot;row&quot;&quot; &gt;This account is:&lt;/td&gt;&lt;td&gt;&quot; &amp; acctlocked &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&quot; &amp; Txt_pwdexpire &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;/table&gt;&quot; 
			x=x+1
			objRecordset.MoveNext
		Loop
		If x = 0 Then
			BaseUserInfo.style.height = &quot;300px&quot;
			strBaseUserInfo = &quot;&lt;br&gt;&lt;center&gt;&lt;font size=5&gt;The requested username&lt;br&gt;&lt;font size=7&gt;&quot; &amp; sUserIDValue &amp; &quot;&lt;/font&gt;&lt;br&gt;is not found in Active Directory&lt;/font&gt;&lt;/center&gt;&quot;
		Else
		End If
		BaseUserInfo.innerhtml = strBaseUserInfo
		AddUserInfo.innerhtml = strAddUserInfo
		AccUserStatus.innerhtml = strAccUserStatus
		AdditionalOptions.innerhtml = strpasswordset
		spnScanTime.innerhtml = &quot;Scanned: &lt;span style=&#039;color:red;&#039;&gt;&quot; &amp; now &amp; &quot;&lt;/span&gt;&quot;
		&#039;msgbox cbxUnlock.disabled
		on error resume next
		If acctLocked = &quot;Not Locked&quot; then 
		  cbxUnlock.disabled = true
		Else
		  cbxUnlock.disabled = false
		End if
		If acctdisable = &quot;Disabled&quot; then
		  spnenabledisable.innerhtml = &quot;Enable&quot;
		Else
		  spnenabledisable.innerhtml = &quot;Disable&quot;
		End If
		password.focus()
		on error goto 0 
	End Sub
	
	Sub LastSearch
		if len(trim(struserid.value)) = 0 then exit sub
		AddUserInfo.innerhtml = &quot;&quot;
		AccUserStatus.innerhtml = &quot;&quot;
		AdditionalOptions.innerhtml = &quot;&quot;
		acctdisable = &quot;Enabled&quot;
		acctlocked = &quot;Not Locked&quot;
		&#039; Use ADO to search Active Directory.
		Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
		Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
		objConnection.Provider = &quot;ADsDSOOBject&quot;
		objConnection.Open &quot;Active Directory Provider&quot;
		Set objCommand.ActiveConnection = objConnection
		&#039; Determine the DNS domain from the RootDSE object.
		&#039;Set objRootDSE = GetObject(&quot;LDAP://RootDSE&quot;)
		&#039;strDNSDomain = objRootDSE.Get(&quot;DefaultNamingContext&quot;)
		strDNSDomain = ConvertDomainNametoADsPath2()
		strFilter = &quot;(&amp;(objectCategory=person)(objectClass=user)(sn=&quot; &amp; struserid.value &amp; &quot;))&quot;
		strQuery = &quot;&lt;LDAP://&quot; &amp; strDNSDomain &amp; &quot;&gt;;&quot; &amp; strFilter _
		  &amp; &quot;;sAMAccountName,sn,givenName,distinguishedname,userAccountControl,cn,DisplayName&quot;
		objCommand.CommandText = strQuery
		objCommand.Properties(&quot;Page Size&quot;) = 750
		objCommand.Properties(&quot;Timeout&quot;) = 60
		objCommand.Properties(&quot;Cache Results&quot;) = False
		&#039; Enumerate all users. Check if account&#039;s disabled.
		Set objRecordset = objCommand.execute
		x = 0
		strBaseUserInfo = &quot;&lt;table class=&#039;pretty-table&#039; rule=&#039;rows&#039; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Username&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Full Name&lt;/th&gt;&lt;/tr&gt;&quot;
		Do Until objRecordset.EOF
			Txt_userid = objRecordSet.Fields(&quot;SamAccountName&quot;)
			Txt_fullname = objRecordset.Fields(&quot;cn&quot;)
		&#039;	strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;tr&gt;&lt;td&gt;&lt;span cursor:pointer&quot;&quot; onClick= &quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span cursor:pointer&quot;&quot; onClick=&quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; objRecordSet.Fields(&quot;sn&quot;) &amp; &quot;, &quot; &amp; objRecordSet.Fields(&quot;givenName&quot;) &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&quot;
			strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;tr&gt;&lt;td&gt;&lt;span cursor:pointer&quot;&quot; onClick= &quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span cursor:pointer&quot;&quot; onClick=&quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; objRecordSet.fields(&quot;DisplayName&quot;) &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&quot;
		
		

			BaseUserInfo.style.height = &quot;365px&quot;
		  x=x+1
			objRecordset.MoveNext
		Loop
		If x = 0 Then
			strBaseUserinfo = &quot;&lt;center&gt;The last name entered, &#039;&quot; &amp; struserid.value &amp; &quot;&#039; is not found in Active Directory.&lt;/center&gt;&quot;
		End If
		strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;/table&gt;&quot;
		BaseUserInfo.innerhtml = strBaseUserInfo
	End Sub

	Function GetUser(strID)
		if len(trim(strId)) = 0 then exit function
		  Struserid.Value = replace(strID,&quot;&amp;apos;&quot;,&quot;&#039;&quot;)
		  Call useridsearch
	End Function
	
	Sub UnlockAccount
		&#039;Connect to Active directory And check user to be cloned exists
		&#039;must enter strUserid = username
		Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
		objConnection.Open &quot;Provider=ADsDSOObject;&quot;
		Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
		objCommand.ActiveConnection = objConnection
		objcommand.commandtext = _
		 &quot;&lt;LDAP://&quot; &amp; sRootUserOU &amp; &quot;&gt;;&quot; &amp; _
		  &quot;(&amp;(objectCategory=person)(objectClass=user)&quot; &amp; _
					&quot;(sAMAccountName=&quot; &amp; struserid.value &amp;&quot;));&quot; &amp; _
						&quot;sAMAccountName, distinguishedName;subtree&quot;
		Set objRecordSet = objCommand.Execute
		If objRecordSet.RecordCount = 0 Then
			strHTML = &quot;The username &quot; &amp; struserid.value &amp;&quot; is not found in Active Directory.  Press OK to exit&quot;
			&#039;WScript.quit
		Else
			While Not objRecordset.EOF
				userdn = objRecordSet.fields(&quot;distinguishedname&quot;)
				Set objUser = GetObject(&quot;LDAP://&quot; &amp; userdn &amp; &quot;&quot;)
				objUser.IsAccountLocked = False
				objUser.SetInfo
				On Error Resume Next
				If Err.Number &lt;&gt; 0 Then
					MsgBox(Err.Number &amp; &quot; &quot; &amp; Err.Description)
				Else
					MsgBox(&quot;Account Unlocked&quot;)
				End If        
				objRecordset.MoveNext
			Wend
		End If
	End Sub
	
	Sub CompSearch
        if len(trim(struserid.value)) = 0 then exit sub
        AddUserInfo.innerhtml = &quot;&quot;
        AccUserStatus.innerhtml = &quot;&quot;
        AdditionalOptions.innerhtml = &quot;&quot;
        &#039; Use ADO to search Active Directory.
        Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
        Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
        objConnection.Provider = &quot;ADsDSOOBject&quot;
        objConnection.Open &quot;Active Directory Provider&quot;
        Set objCommand.ActiveConnection = objConnection
        strDNSDomain = ConvertDomainNametoADsPath2()
        strFilter = &quot;(&amp;(objectCategory=computer)(objectClass=computer)(name=&quot; &amp; struserid.value &amp; &quot;))&quot;
        strQuery = &quot;&lt;LDAP://&quot; &amp; strDNSDomain &amp; &quot;&gt;;&quot; &amp; strFilter _
          &amp; &quot;;name,operatingSystem,operatingSystemServicePack,whenCreated,WhenChanged&quot;
        objCommand.CommandText = strQuery
        objCommand.Properties(&quot;Page Size&quot;) = 750
        objCommand.Properties(&quot;Timeout&quot;) = 60
        objCommand.Properties(&quot;Cache Results&quot;) = False 
        &#039; Enumerate all computers. 
        Set objRecordset = objCommand.execute
        x = 0   
        strBaseUserInfo = &quot;&lt;table class=&#039;pretty-table&#039; rule=&#039;rows&#039; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
                        &quot;&lt;tr&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Имя ПК&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;operatingSystem&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;ServicePack&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;whenCreated&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;WhenChanged&lt;/th&gt;&lt;/tr&gt;&quot;
        Do Until objRecordset.EOF
                Txt_computername = objRecordSet.Fields(&quot;name&quot;)
                strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;tr&gt;&lt;td&gt;&quot; &amp; Txt_computername &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; objRecordSet.fields(&quot;operatingSystem&quot;) &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; objRecordSet.fields(&quot;operatingSystemServicePack&quot;) &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; objRecordSet.fields(&quot;whenCreated&quot;) &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; objRecordSet.fields(&quot;WhenChanged&quot;) &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot;
                BaseUserInfo.style.height = &quot;365px&quot; 
                x=x+1
                objRecordset.MoveNext
        Loop    
        If x = 0 Then
                strBaseUserinfo = &quot;&lt;center&gt;The computer name entered, &#039;&quot; &amp; struserid.value &amp; &quot;&#039; is not found in Active Directory.&lt;/center&gt;&quot;
        End If  
        strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;/table&gt;&quot;
        BaseUserInfo.innerhtml = strBaseUserInfo
End Sub 
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

	DomainName WinNt&lt;input type=&quot;text&quot;  id=&quot;DomainNameWinNt&quot; name=&quot;DomainNameWinNt&quot; class=&quot;txtSearchText&quot; value=&quot;mechel&quot; size=&quot;20&quot;&gt; 
&lt;div id=&quot;divbody&quot;&gt;
						&lt;table&gt;
							&lt;tr&gt;
								&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;
									Enter the &lt;u&gt;username&lt;/u&gt; or &lt;u&gt;last name&lt;/u&gt; below and click appropriate search.&lt;br&gt;&lt;br&gt;
									&lt;input type=&quot;text&quot;  id=&quot;DomainNameAD2&quot; name=&quot;txtDomainName&quot; class=&quot;txtSearchText&quot; value=&quot;int.mechel.corp&quot; size=&quot;20&quot;&gt;
									&lt;input type=&quot;text&quot; id=&quot;StrUserid&quot; name=&quot;StrUserid&quot; size=&quot;20&quot;&gt;
									&lt;input id=&quot;idsearchbutton&quot;  class=&quot;button&quot; type=&quot;button&quot; value=&quot;Search Username&quot; name=&quot;userid&quot;  onClick=&quot;useridsearch&quot;&gt;
									&lt;input id=&quot;lastsearchbutton&quot;  class=&quot;button&quot; type=&quot;button&quot; value=&quot;Search Last Name&quot; name=&quot;lastname&quot;  onClick=&quot;LastSearch&quot;&gt;
									&lt;input id=&quot;compsearchbutton&quot;  class=&quot;button&quot; type=&quot;button&quot; value=&quot;Search Computer Name&quot; name=&quot;compname&quot;  onClick=&quot;CompSearch&quot;&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/table&gt;
						&lt;br&gt;
						&lt;table&gt;
							&lt;tr&gt;
								&lt;td&gt;
									&lt;Div id=&quot;BaseUserInfo&quot; style=&quot;height:300px;overflow:auto&quot;&gt;
									&lt;/Div&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/table&gt;
						&lt;table&gt;
							  &lt;tr&gt;
								&lt;td valign=&quot;top&quot;&gt;
									&lt;Div id=&quot;AddUserInfo&quot;&gt;
									&lt;/Div&gt;
								&lt;/td&gt;
								&lt;td valign=&quot;top&quot;&gt;
									&lt;Div id=&quot;AccUserStatus&quot;&gt;
									&lt;/Div&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/table&gt;
						&lt;div id=&quot;AdditionalOptions&quot;&gt;
						&lt;/div&gt;
					&lt;/div&gt;
					&lt;span style=&#039;color:darkblue&#039;&gt;Domain: &lt;/span&gt;
					&lt;div id=&quot;status_bar&quot; style=&quot;padding-top:5px;&quot;&gt;
						&lt;span id=&quot;spnStatusOU&quot;&gt;
						&lt;/span&gt;
						&lt;span id=&quot;spnStatusDomain&quot;&gt;
						&lt;/span&gt;
						&lt;span id=&quot;spnScanTime&quot;&gt;
						&lt;/span&gt;
					&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[shade45]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33296</uri>
			</author>
			<updated>2016-02-08T03:45:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100933#p100933</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS,HTA: Запрос в Active Directory]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100887#p100887" />
			<content type="html"><![CDATA[<p><strong>shade45</strong><br />Разбейте весь свой код на отдельные vbs скрипты и замеряйте скорость их выполнения.<br />Если окажется что одна из процедур выполняется чересчур долго, то публикуйте ее в форуме - попробуем её ускорить.<br />ИМХО проще переписать весь этот код с нуля, чем пытаться отлаживать целиком.</p>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-02-06T16:23:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100887#p100887</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS,HTA: Запрос в Active Directory]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100851#p100851" />
			<content type="html"><![CDATA[<p>Здравствуйте уважаемые форумчане, есть следующий скрипт для поиска пользователей (по фамилии) и компьютеров в AD. Работает хорошо, находит все что нужно, но думает очень очень медленно (секунд 10).<br /></p><div class="codebox"><pre><code>	&lt;html&gt;
&lt;head&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;1.css&quot;&gt;
&lt;HTA:APPLICATION
  ID=&quot;objPCManage&quot;
  CONTEXTMENU=&quot;no&quot;/&gt;
  
&lt;/head&gt;
&lt;body&gt;
&lt;input type=&#039;text&#039; value=&#039;int.mechel.corp&#039; id=&#039;DomainNameAD&#039; name=&#039;DomainNameAD&#039;&gt;
		&lt;input type=&#039;text&#039; value=&#039;&#039; id=&#039;VvodData&#039; name=&#039;VvodData&#039;&gt;
	&lt;input type=&#039;button&#039; value=&#039;Поиск Пользователь&amp;PC&#039; onclick=&#039;SearchAD()&#039; id=&#039;SearchADScript&#039; name=&#039;SearchADScript&#039;&gt;
&lt;div&gt;
&lt;span id=&quot;vuvod&quot;&gt;

&lt;/span&gt;

&lt;/div&gt;
&lt;script language=&quot;vbscript&quot;&gt;
	&#039;---------------------------------------------------
	&#039; Конвертирование имени домена в нужный формат в АД
	&#039;---------------------------------------------------
	&#039;Convert domain name to ADsPath
	Function ConvertDomainNametoADsPath()
		Dim strDomainName,arrDomLevels
			strDomainName = DomainNameAD.value
			arrDomLevels = Split(strDomainName, &quot;.&quot;)
		ConvertDomainNametoADsPath = &quot;dc=&quot; &amp; Join(arrDomLevels, &quot;,dc=&quot;)
	End Function
	
	
	&#039;---------------------------------------------
	&#039; Форма таблицы Верх
	&#039;---------------------------------------------
	Function trGenTop(NameValue, value)
		Dim style
		style = &quot;style=&#039;vertical-align:top; border:1px solid #000&#039;&quot;
		trGenTop=Trim(&quot;&lt;tr&gt;&lt;th&gt;&quot; &amp; NameValue &amp; &quot;&lt;/th&gt;&lt;th&gt;&quot; &amp; value &amp; &quot;&lt;/th&gt;&lt;/tr&gt;&quot;) 
	End Function
	
	&#039;---------------------------------------------
	&#039; Форма таблицы
	&#039;---------------------------------------------
	Function trGenTable(parametr, value())
		Dim style
		style = &quot;style=&#039;vertical-align:top; border:2px solid #000&#039; cellpadding=&#039;10px&#039;&quot;
		trGenTable=Trim(&quot;&lt;tr &quot;&amp; style &amp;&quot;&gt;&lt;th&gt;&quot;&amp; parametr &amp;&quot;&lt;/th&gt;&lt;td &quot;&amp; style &amp;&quot;&gt;&quot;&amp; value &amp;&quot;&lt;/td&gt;&lt;/tr&gt;&quot;) 
	End Function
	
			&#039;---------------------------------------------
	&#039; Форма таблицы Строка
	&#039;---------------------------------------------
	Function trGenStroka(parametr)
		Dim style
		style = &quot;style=&#039;vertical-align:top; border:1px solid #000&#039;&quot;
		trGenStroka=Trim(&quot;&lt;tr&gt;&lt;th&gt;&quot;&amp; parametr &amp;&quot;&lt;/th&gt;&lt;/tr&gt;&quot;) 
	End Function
	&#039;---------------------------------------------------
	&#039; Конвертирование времени
	&#039;---------------------------------------------------
	Function ConvertTime(objDate)
		Dim Key,TempKey,Temp,lngHigh,lngLow,dtmDate
		Set objShell = CreateObject(&quot;Wscript.Shell&quot;)
		Key=&quot;HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias&quot;
		TempKey = objShell.RegRead(Key)
		If (VarType(TempKey) = 3) Then
			Temp = TempKey
		ElseIf (VarType(TempKey)=12) Then
			Temp = 0
				   For k = 0 To UBound(TempKey)
				   Temp = Temp + (TempKey(k) * 256^k)
				   Next
		End If
		lngHigh = objDate.HighPart
		lngLow = objDate.LowPart
		If (lngLow &lt; 0) Then
			lngHigh = lngHigh + 1
		End If
		If (lngHigh = 0) And (lngLow = 0 ) Then
			dtmDate = #1/1/1601#
		Else
			dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32))+ lngLow)/6/10^8 - Temp)/1440
		End If
		ConvertTime=dtmDate
	End Function
	&#039;---------------------------------------------
	&#039; Поиск в АД - Учеток и ПК
	&#039;---------------------------------------------
	Sub SearchAD
		&#039;On Error Resume Next
		Dim strADsPath,ADSRoot,objConnection,objCommand,srchTrm,objRecordSet,strADPath,objUser,strMsg
		Dim strlockOutDuration,intLockoutDurationMinutes,i
		Dim strDisplayName,strTelephoneNumber
		Dim strTitle,strDepartment
		Dim strSamAccountName,strAccountDisabled,strCn&#039;account
		Dim strPasswordLastChanged,strWhenCreated,strWhenChanged,strLastLogonTimestamp,strPwdLastSet
		Dim strStroka,strStroka1,strStroka2,strDistinguishedName,strCanonicalName,strIsAccountLocked
		Dim oDomain, oUser,maxPwdAge,numDays,warningDays,objNetwork,strUserDays,strUserDaysLeft
		Dim LoginInfo,strDomainDN,strUserDN,whenPasswordExpires,fromDate,daysLeft
		Dim strmemberOf,objmemberOf,objGroup,strList,strUserlogonname,arrGroup
		dim strNamePC,strOperatingSystem,strdnsHostName,stroperatingSystemServicePack,strWhenCreatedPC,strWhenChangedPC
		ADSRoot = ConvertDomainNametoADsPath()
		Const ADS_SCOPE_SUBTREE = 2	 
		Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
		Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
		objConnection.Provider = &quot;ADsDSOObject&quot;
		objConnection.Open &quot;Active Directory Provider&quot;
		Set objCommand.ActiveConnection = objConnection
			objCommand.Properties(&quot;Page Size&quot;) = 1000
			objCommand.Properties(&quot;Timeout&quot;) = 30
			objCommand.Properties(&quot;Cache Results&quot;) = False &#039; экспериментально
			objCommand.Properties(&quot;Searchscope&quot;) = ADS_SCOPE_SUBTREE
			objCommand.CommandText = &quot;SELECT * FROM &#039;LDAP://&quot; &amp; ADSRoot &amp; &quot;&#039; WHERE objectCategory=&#039;user&#039; OR objectCategory=&#039;computer&#039;&quot;
		
			srchTrm = LCase(VvodData.value)
			i = 0
			If Len(srchTrm)&lt;4 or Instr(srchTrm, &quot;=&quot;) Then
				strHtml = &quot;Please enter a search term in excess of 3 characters. Don&#039;t use &quot;&quot;=&quot;&quot;&quot;
				vuvod.innerHTML = strHtml
				Exit Sub
			End If
			Set objRecordSet = objCommand.Execute
			objRecordSet.MoveFirst
			Do Until objRecordSet.EOF
				strADPath = LCase(objRecordSet.Fields(&quot;adsPath&quot;).Value)
			If InStr(strADPath, srchTrm) Then
				Set objUser = GetObject(objRecordSet.Fields(&quot;adsPath&quot;).Value)
				Select Case objUser.Class
			Case &quot;user&quot;
					If objUser.AccountDisabled = FALSE Then
					strAccountDisabled = strAccountDisabled &amp; &quot;Аккаунт включён&quot; &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
					Else
						strAccountDisabled = strAccountDisabled &amp; &quot;Аккаунт выключен&quot; &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
					End If
	
					If objUser.IsAccountLocked = FALSE Then
					strIsAccountLocked = strIsAccountLocked &amp; &quot;Аккаунт разблокирован&quot; &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
					Else
						strIsAccountLocked = strIsAccountLocked &amp; &quot;Аккаунт заблокирован&quot; &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
					End If
					
					objmemberOf  = objUser.GetEx(&quot;memberOf&quot;)
					For Each objGroup in objmemberOf 
					    objGroup = Mid(objGroup, 4, 330) 
					   arrGroup = Split(objGroup, &quot;,&quot;)
					   strList = strList &amp; arrGroup(0) &amp; &quot;&lt;br&gt;&quot;
					Next
					
					&#039; Additional section to find the primary group.
					If objUser.primaryGroupID = 513 Then
					   strList = strList &amp; &quot;&lt;br&gt;&quot;
					Else If objUser.primaryGroupID = 515 Then
					   strList = strList &amp; &quot;Domain Computers&quot; &amp; &quot;&lt;br&gt;&quot;
					Else strList = strList &amp; &quot;Maybe a Domain Controller&quot;
					End If
					End If 
			&#039;GENERAL
				strDisplayName = strDisplayName &amp; objUser.DisplayName &amp; &quot;&lt;th&gt;&quot; &amp; VbCrLf
				strTelephoneNumber = strTelephoneNumber &amp; objUser.telephoneNumber &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
			&#039;ACCOUNT
				strSamAccountName = strSamAccountName &amp; objUser.samAccountName &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
			&#039;Company Info
				strTitle = strTitle &amp; objUser.title &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strDepartment = strDepartment &amp; objUser.department &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
			&#039;Info
				strPasswordLastChanged = strPasswordLastChanged &amp; objUser.PasswordLastChanged &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strWhenCreated = strWhenCreated &amp; objUser.whenCreated &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strWhenChanged = strWhenChanged &amp; objUser.WhenChanged &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strLastLogonTimestamp = strLastLogonTimestamp &amp; ConvertTime(objUser.Get(&quot;lastLogonTimestamp&quot;)) &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
			&#039;Stroka
				strStroka =  &quot;&lt;td colspan=&#039;3&#039; align=&#039;center&#039; bgcolor=&#039;#CBD8EB&#039;&gt;&lt;b&gt;Должность и место работы&lt;/b&gt;&lt;/td&gt;&quot;
				strStroka1 = &quot;&lt;td colspan=&#039;2&#039; align=&#039;center&#039; bgcolor=&#039;#CBD8EB&#039;&gt;&lt;b&gt;Изменение учетки&lt;/b&gt;&lt;/td&gt;&quot; &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strStroka2 = &quot;&lt;td colspan=&#039;3&#039; align=&#039;center&#039; bgcolor=&#039;#CBD8EB&#039;&gt;&lt;b&gt;Остальное&lt;/b&gt;&lt;/td&gt;&quot;
			&#039;Other
				strDistinguishedName = strDistinguishedName &amp; objUser.distinguishedName &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf 			
				strCanonicalName = strCanonicalName &amp; objUser.canonicalName &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf	
				strmemberOf = strmemberOf &amp; strList &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				warningDays = 115 &#039; порог срабатывания уведомления
				Set LoginInfo = CreateObject(&quot;ADSystemInfo&quot;) 
				Set objNetwork = CreateObject(&quot;WScript.Network&quot;)
				strDomainDN = DomainNameAD.value &#039; int.mechel.corp
				strUserDN = objUser.distinguishedName
				Set oDomain = GetObject(&quot;LDAP://&quot; &amp; ADSRoot)
				Set maxPwdAge = oDomain.Get(&quot;maxPwdAge&quot;)
				numDays = CCur((maxPwdAge.HighPart * 2 ^ 32) + maxPwdAge.LowPart) / CCur(-864000000000)
				Set oUser = GetObject(&quot;LDAP://&quot; &amp; strUserDN)
				whenPasswordExpires = DateAdd(&quot;d&quot;, numDays, oUser.PasswordLastChanged)
				fromDate = Date
				daysLeft = DateDiff(&quot;d&quot;,fromDate,whenPasswordExpires)
				&#039;msgbox &quot;Password Last Changed: &quot; &amp; oUser.PasswordLastChanged
				if (daysLeft &lt; warningDays) and (daysLeft &gt; -1) then
				&#039;msgbox &quot;Количество дней до истечения пароля: &quot; &amp; daysLeft &amp; &quot;.&quot; &amp; chr(13) &amp; &quot;Пароль действителен до &quot; &amp; whenPasswordExpires
				strUserDays = strUserDays &amp; whenPasswordExpires &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf	
				strUserDaysLeft = strUserDaysLeft &amp; daysLeft &amp; &quot; дней&quot; &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				End if
				Set oUser = Nothing
				Set maxPwdAge = Nothing
				Set oDomain = Nothing


				strMsg = &quot;&lt;table style=&#039;border-collapse: collapse&#039; bgcolor=#F5F5F5 border=&#039;3&#039;  width=&#039;100%&#039;&gt;&quot; &amp;_
					trgenTop  (&quot;Имя&quot;,strDisplayName) &amp;_
				trgenTable(&quot;1&quot;,strCanonicalName) &amp;_
				trgenTable(&quot;Телефон&quot;,strTelephoneNumber) &amp;_
					trgenTable(&quot;Количество дней до истечения пароля:&quot;,strUserDaysLeft) &amp;_
					trgenTable(&quot;Пароль действителен до&quot;,strUserDays) &amp;_
					trgenTable(&quot;WinLogon&quot;,strSamAccountName) &amp;_
					trgenTable(&quot;Выкл/Вкл акк?&quot;,strAccountDisabled) &amp;_
					trgenTable(&quot;Заблокирована учетка&quot;,strIsAccountLocked) &amp;_
				trGenStroka(strStroka)&amp;_
					trgenTable(&quot;Должность&quot;,strTitle) &amp;_
					trgenTable(&quot;Цех&quot;,strDepartment) &amp;_
				trGenStroka(strStroka1) &amp;_
					trgenTable(&quot;Когда сменил пароль&quot;,strPasswordLastChanged) &amp;_
					trgenTable(&quot;Когда создана учетка&quot;,strWhenCreated) &amp;_
					trgenTable(&quot;Когда изменена учетка&quot;,strWhenChanged) &amp;_
					trgenTable(&quot;Когда был залогинен&quot;,strLastLogonTimestamp) &amp;_
				trGenStroka(strStroka2) &amp;_
					trgenTable(&quot;Полный путь в формате в АД&quot;,strDistinguishedName) &amp;_
				&quot;&lt;/table&gt;&quot;
			Case &quot;computer&quot;
				strNamePC = strNamePC &amp; objUser.name &amp; &quot;&lt;th&gt;&quot; &amp; VbCrLf
				stroperatingSystemServicePack = stroperatingSystemServicePack &amp; objUser.operatingSystemServicePack &amp; VbCrLf
				strOperatingSystem = strOperatingSystem &amp; objUser.operatingSystem &amp; &quot; &quot; &amp; stroperatingSystemServicePack &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strdnsHostName = strdnsHostName &amp; objUser.dnsHostName &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strWhenCreatedPC = strWhenCreatedPC &amp; objUser.whenCreated &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strWhenChangedPC = strWhenChangedPC &amp; objUser.WhenChanged &amp; &quot;&lt;td&gt;&quot; &amp; VbCrLf
				strMsg = &quot;&lt;table style=&#039;border-collapse: collapse&#039; bgcolor=#F5F5F5 border=&#039;3&#039;  width=&#039;100%&#039;&gt;&quot; &amp;_
					trgenTop(&quot;NamePC&quot;,strNamePC) &amp;_
					trgenTable(&quot;OS&quot;,strOperatingSystem) &amp;_
					trgenTable(&quot;Dns Host Name&quot;,strdnsHostName) &amp;_
					trgenTable(&quot;Изменено&quot;,strWhenCreatedPC) &amp;_
					trgenTable(&quot;Создано&quot;,strWhenChangedPC) &amp;_	
				&quot;&lt;/table&gt;&quot;
				Case Else
					strMsg = &quot;Unidentified&quot; &amp; VbCrLf
				End Select
				strHtml = strMsg &amp; VbCrLf
				i = i + 1
			  End If
			objRecordSet.MoveNext
			Loop
			If Not i &gt; 0 Then
			 strHtml = &quot;No results found.&quot;
			End If
		vuvod.innerHTML = strHtml
	End sub
	&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></div><p>Особенно на фоне скрипта для поиска пользователей по учетке и фамилии, можете подсказать как их скомпоновать?, вся загвоздка в самом обращении к АД, т.е. в 1 случае я через селект выбираю в двух категориях, а в 2 скрипте, оно сначало &quot;кешируется&quot;, а потом выдается пользователю, подскажите пожалуйста.</p><div class="codebox"><pre><code>	&lt;html&gt;
&lt;head&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;1.css&quot;&gt;
&lt;HTA:APPLICATION
  ID=&quot;objPCManage&quot;
  CONTEXTMENU=&quot;no&quot;/&gt;
  &lt;script language=&quot;vbscript&quot;&gt;
&#039;---------------------------------------------------
	&#039; Конвертирование имени домена в нужный формат в АД
	&#039;---------------------------------------------------
	Function ConvertDomainNametoADsPath2()
		Dim strDomainName,arrDomLevels
			strDomainName = DomainNameAD2.value
			arrDomLevels = Split(strDomainName, &quot;.&quot;)
		ConvertDomainNametoADsPath2 = &quot;dc=&quot; &amp; Join(arrDomLevels, &quot;,dc=&quot;)
	End Function
	
	
	Sub useridsearch
		&#039;sNTDomain = &quot;mechel&quot; &#039;введите домен для WinNT
		sNTDomain = DomainNameWinNt.value
		if len(trim(struserid.value)) = 0 or struserid.value = &quot;*&quot; then 
		  Msgbox &quot;Please enter a valid username.&quot;,48,&quot;Invalid entry&quot;
		  exit sub
		End If
		BaseUserInfo.style.height = &quot;80px&quot;
		sUserIDValue = replace(strUserId.value,&quot;&amp;apos;&quot;,&quot;&#039;&quot;)
		&#039;Define Constant and declare variables
		Const ADS_UF_ACCOUNTDISABLE = &amp;H02
		Const ADS_UF_PASSWD_CANT_CHANGE = &amp;H40
		Const ADS_UF_LOCKOUT = &amp;H10
		Const ADS_UF_DONT_EXPIRE_PASSWD = &amp;H10000
		Const SEC_IN_DAY = 86400
		acctdisable = &quot;Enabled&quot;
		acctlocked = &quot;Not Locked&quot;
		strPasswordSet = &quot;&quot;
		&#039; Use ADO to search Active Directory.
		Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
		Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
		objConnection.Provider = &quot;ADsDSOOBject&quot;
		objConnection.Open &quot;Active Directory Provider&quot;
		Set objCommand.ActiveConnection = objConnection
		strDNSDomain = ConvertDomainNametoADsPath2()
		strFilter = &quot;(&amp;(objectCategory=person)(objectClass=user)(sAMAccountName=&quot; &amp; sUserIDValue &amp; &quot;))&quot;
		strQuery = &quot;&lt;LDAP://&quot; &amp; strDNSDomain &amp; &quot;&gt;;&quot; &amp; strFilter _
		  &amp; &quot;;sAMAccountName, distinguishedName, DisplayName, givenName, sn, UserAccountControl, CN, l, mail, Department, telephoneNumber, Title, employeeid;subtree&quot;
		objCommand.CommandText = strQuery
		objCommand.Properties(&quot;Page Size&quot;) = 750
		objCommand.Properties(&quot;Timeout&quot;) = 60
		objCommand.Properties(&quot;Cache Results&quot;) = False
		&#039; Enumerate all users. Check if accounts disabled.
		Set objRecordset = objCommand.execute
		x = 0
		Do Until objRecordset.EOF
			&#039;if user is found, set strusrpath to full DN name
			intFlag = objRecordSet.Fields(&quot;userAccountControl&quot;)
			lngFlag = objRecordSet.Fields(&quot;userAccountControl&quot;)
			strusrpath = objrecordset.fields(&quot;distinguishedName&quot;)
			Txt_userdn = strusrpath
			Txt_userid = objRecordSet.Fields(&quot;SamAccountName&quot;)
			Txt_userempid = objRecordSet.fields(&quot;employeeid&quot;)
			Txt_userDisplay = objRecordSet.fields(&quot;DisplayName&quot;)
		&#039;	Txt_usercn = objRecordSet.fields(&quot;cn&quot;)
		&#039;	Txt_userfn = objRecordSet.fields(&quot;givenName&quot;)
		&#039;	Txt_userln = objRecordSet.fields(&quot;sn&quot;)
			Txt_userAC = objRecordSet.fields(&quot;UserAccountControl&quot;)
			Txt_userDept = objRecordSet.fields(&quot;Department&quot;)
			Txt_userTitle = objRecordSet.fields(&quot;Title&quot;)
			Txt_userPhone = objRecordSet.fields(&quot;telephoneNumber&quot;)
			strPasswordset = &quot;&lt;br&gt;&lt;table style=&quot;&quot;width:100%&quot;&quot;&gt;&lt;tr&gt;&lt;td&gt;Reset User Password:&lt;/td&gt;&lt;td&gt;&lt;input style=&quot;&quot;border-width:1px&quot;&quot; type=&quot;&quot;password&quot;&quot; name=&quot;&quot;password&quot;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;input id=&quot;&quot;passreset&quot;&quot; class=&quot;&quot;button&quot;&quot; type=&quot;&quot;button&quot;&quot; value=&quot;&quot;Perform action&quot;&quot; name=&quot;&quot;changepass&quot;&quot; onClick=&quot;&quot;ChangePassword&quot;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Force user to change password?&amp;nbsp;&lt;input type=&quot;&quot;checkbox&quot;&quot; name=&quot;&quot;cbxForceChange&quot;&quot;&gt;&lt;/td&gt;&lt;td&gt;Unlock account?&amp;nbsp;&lt;input type=&quot;&quot;checkbox&quot;&quot; name=&quot;&quot;cbxUnlock&quot;&quot;&gt;&lt;/td&gt;&lt;td&gt;&lt;span id=&quot;&quot;spnenabledisable&quot;&quot;&gt;Enable&lt;/span&gt; account?&amp;nbsp;&lt;input type=&quot;&quot;checkbox&quot;&quot; name=&quot;&quot;cbxEnable&quot;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&quot;
			If (intFlag And ADS_UF_ACCOUNTDISABLE) &lt;&gt; 0 Then
				acctdisable = &quot;Disabled&quot;
			End If
			Set objUser = GetObject(&quot;LDAP://&quot; &amp; strusrpath &amp; &quot;&quot;)
			intUAC = objUser.Get(&quot;UserAccountControl&quot;)
			If objUser.IsAccountLocked = True Then
				strPasswordset = strPasswordset &amp; &quot; &lt;input id=unlock class=&quot;&quot;button&quot;&quot; type=&quot;&quot;button&quot;&quot; value=&quot;&quot;Unlock Account&quot;&quot; name=&quot;&quot;accunlock&quot;&quot; onclick=&quot;&quot;UnlockAccount&quot;&quot;&gt;&quot;
				acctlocked = &quot;Locked&quot;
			End If
			If intFlag And ADS_UF_DONT_EXPIRE_PASSWD Then
				Txt_pwdexpire = &quot;The password &lt;font color=&quot;&quot;red&quot;&quot;&gt;&lt;b&gt;does not&lt;/b&gt;&lt;/font&gt; expire&lt;br&gt;&quot;
			Else
				on error resume next
			dtmValue = objUser.PasswordLastChanged
				intTimeInterval = int(Now - dtmValue)
				&#039;modify domain name in next line
				Set objDomainNT = GetObject(&quot;WinNT://&quot; &amp; sNTDomain)
				ntMaxPwdAge = objDomainNT.Get(&quot;MaxPasswordAge&quot;)
				intMaxPwdAge = (ntMaxPwdAge/SEC_IN_DAY)
				If intTimeInterval &gt;= intMaxPwdAge and acctDisable &lt;&gt; &quot;Disabled&quot; Then
					Txt_pwdexpire = &quot;Password &lt;font color=&quot;&quot;red&quot;&quot;&gt;&lt;b&gt;has expired&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&quot;
				Else
					If acctDisable &lt;&gt; &quot;Disabled&quot; then Txt_pwdexpire = &quot;Password will expire in &lt;font color=&quot;&quot;red&quot;&quot;&gt;&quot; &amp; int((dtmValue + intMaxPwdAge) - now) &amp; &quot;&lt;/font&gt; days&lt;br&gt;&quot;
				End If
			End If             
			strBaseUserInfo = &quot;&lt;table class=&quot;&quot;pretty-table&quot;&quot; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Username&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Full Name&lt;/th&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; Txt_userDisplay &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&quot;
		&#039;	  	&quot;&lt;tr&gt;&lt;td&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/td&gt;&lt;td&gt;&quot; &amp; txt_userln &amp; &quot;, &quot; &amp; txt_userfn &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&quot;
			strAddUserInfo = &quot;&lt;table class=&#039;pretty-table&#039; rule=&#039;rows&#039; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; colspan=&#039;2&#039; scope=&quot;&quot;col&quot;&quot;&gt;&lt;b&gt;&lt;center&gt;Additional Information&lt;/center&gt;&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; &gt;Title:&lt;/th&gt;&lt;td&gt;&quot; &amp; Txt_userTitle &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
			  &quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; &gt;Department:&lt;/th&gt;&lt;td&gt;&quot; &amp; Txt_userDept &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;row&quot;&quot; &gt;Telephone:&lt;/th&gt;&lt;td&gt;&quot; &amp; Txt_userPhone &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;/table&gt;&quot;			
			strAccUserStatus = &quot;&lt;table class=&#039;pretty-table&#039; rule=&#039;rows&#039; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th colspan=&#039;2&#039; scope=&quot;&quot;col&quot;&quot;&gt;&lt;center&gt;Account Status&lt;/center&gt;&lt;/th&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td scope=&quot;&quot;row&quot;&quot; &gt;This account is:&lt;/td&gt;&lt;td&gt;&quot; &amp; acctdisable &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td scope=&quot;&quot;row&quot;&quot; &gt;This account is:&lt;/td&gt;&lt;td&gt;&quot; &amp; acctlocked &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;td colspan=&#039;2&#039;&gt;&quot; &amp; Txt_pwdexpire &amp; &quot;&lt;/td&gt;&lt;/tr&gt;&quot; &amp; _
				&quot;&lt;/table&gt;&quot; 
			x=x+1
			objRecordset.MoveNext
		Loop
		If x = 0 Then
			BaseUserInfo.style.height = &quot;300px&quot;
			strBaseUserInfo = &quot;&lt;br&gt;&lt;center&gt;&lt;font size=5&gt;The requested username&lt;br&gt;&lt;font size=7&gt;&quot; &amp; sUserIDValue &amp; &quot;&lt;/font&gt;&lt;br&gt;is not found in Active Directory&lt;/font&gt;&lt;/center&gt;&quot;
		Else
		End If
		BaseUserInfo.innerhtml = strBaseUserInfo
		AddUserInfo.innerhtml = strAddUserInfo
		AccUserStatus.innerhtml = strAccUserStatus
		AdditionalOptions.innerhtml = strpasswordset
		spnScanTime.innerhtml = &quot;Scanned: &lt;span style=&#039;color:red;&#039;&gt;&quot; &amp; now &amp; &quot;&lt;/span&gt;&quot;
		&#039;msgbox cbxUnlock.disabled
		on error resume next
		If acctLocked = &quot;Not Locked&quot; then 
		  cbxUnlock.disabled = true
		Else
		  cbxUnlock.disabled = false
		End if
		If acctdisable = &quot;Disabled&quot; then
		  spnenabledisable.innerhtml = &quot;Enable&quot;
		Else
		  spnenabledisable.innerhtml = &quot;Disable&quot;
		End If
		password.focus()
		on error goto 0 
	End Sub
	
	Sub LastSearch
		if len(trim(struserid.value)) = 0 then exit sub
		AddUserInfo.innerhtml = &quot;&quot;
		AccUserStatus.innerhtml = &quot;&quot;
		AdditionalOptions.innerhtml = &quot;&quot;
		acctdisable = &quot;Enabled&quot;
		acctlocked = &quot;Not Locked&quot;
		&#039; Use ADO to search Active Directory.
		Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
		Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
		objConnection.Provider = &quot;ADsDSOOBject&quot;
		objConnection.Open &quot;Active Directory Provider&quot;
		Set objCommand.ActiveConnection = objConnection
		&#039; Determine the DNS domain from the RootDSE object.
		&#039;Set objRootDSE = GetObject(&quot;LDAP://RootDSE&quot;)
		&#039;strDNSDomain = objRootDSE.Get(&quot;DefaultNamingContext&quot;)
		strDNSDomain = ConvertDomainNametoADsPath2()
		strFilter = &quot;(&amp;(objectCategory=person)(objectClass=user)(sn=&quot; &amp; struserid.value &amp; &quot;))&quot;
		strQuery = &quot;&lt;LDAP://&quot; &amp; strDNSDomain &amp; &quot;&gt;;&quot; &amp; strFilter _
		  &amp; &quot;;sAMAccountName,sn,givenName,distinguishedname,userAccountControl,cn,DisplayName&quot;
		objCommand.CommandText = strQuery
		objCommand.Properties(&quot;Page Size&quot;) = 750
		objCommand.Properties(&quot;Timeout&quot;) = 60
		objCommand.Properties(&quot;Cache Results&quot;) = False
		&#039; Enumerate all users. Check if account&#039;s disabled.
		Set objRecordset = objCommand.execute
		x = 0
		strBaseUserInfo = &quot;&lt;table class=&#039;pretty-table&#039; rule=&#039;rows&#039; border=1 cellspacing=&quot;&quot;0&quot;&quot; width=&quot;&quot;100%&quot;&quot;&gt;&quot; &amp; _
				&quot;&lt;tr&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Username&lt;/th&gt;&lt;th scope=&quot;&quot;col&quot;&quot;&gt;Full Name&lt;/th&gt;&lt;/tr&gt;&quot;
		Do Until objRecordset.EOF
			Txt_userid = objRecordSet.Fields(&quot;SamAccountName&quot;)
			Txt_fullname = objRecordset.Fields(&quot;cn&quot;)
		&#039;	strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;tr&gt;&lt;td&gt;&lt;span style=&quot;&quot;cursor:pointer&quot;&quot; onClick= &quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;&quot;cursor:pointer&quot;&quot; onClick=&quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; objRecordSet.Fields(&quot;sn&quot;) &amp; &quot;, &quot; &amp; objRecordSet.Fields(&quot;givenName&quot;) &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&quot;
			strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;tr&gt;&lt;td&gt;&lt;span style=&quot;&quot;cursor:pointer&quot;&quot; onClick= &quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; Txt_userid &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;&quot;cursor:pointer&quot;&quot; onClick=&quot;&quot;GetUser(&#039;&quot; &amp; replace(Txt_userid,&quot;&#039;&quot;,&quot;&amp;apos;&quot;) &amp; &quot;&#039;)&quot;&quot;&gt;&quot; &amp; objRecordSet.fields(&quot;DisplayName&quot;) &amp; &quot;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&quot;
		
		

			BaseUserInfo.style.height = &quot;365px&quot;
		  x=x+1
			objRecordset.MoveNext
		Loop
		If x = 0 Then
			strBaseUserinfo = &quot;&lt;center&gt;The last name entered, &#039;&quot; &amp; struserid.value &amp; &quot;&#039; is not found in Active Directory.&lt;/center&gt;&quot;
		End If
		strBaseUserInfo = strBaseUserInfo &amp; &quot;&lt;/table&gt;&quot;
		BaseUserInfo.innerhtml = strBaseUserInfo
	End Sub

	Function GetUser(strID)
		if len(trim(strId)) = 0 then exit function
		  Struserid.Value = replace(strID,&quot;&amp;apos;&quot;,&quot;&#039;&quot;)
		  Call useridsearch
	End Function
	
	Sub UnlockAccount
		&#039;Connect to Active directory And check user to be cloned exists
		&#039;must enter strUserid = username
		Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)
		objConnection.Open &quot;Provider=ADsDSOObject;&quot;
		Set objCommand = CreateObject(&quot;ADODB.Command&quot;)
		objCommand.ActiveConnection = objConnection
		objcommand.commandtext = _
		 &quot;&lt;LDAP://&quot; &amp; sRootUserOU &amp; &quot;&gt;;&quot; &amp; _
		  &quot;(&amp;(objectCategory=person)(objectClass=user)&quot; &amp; _
					&quot;(sAMAccountName=&quot; &amp; struserid.value &amp;&quot;));&quot; &amp; _
						&quot;sAMAccountName, distinguishedName;subtree&quot;
		Set objRecordSet = objCommand.Execute
		If objRecordSet.RecordCount = 0 Then
			strHTML = &quot;The username &quot; &amp; struserid.value &amp;&quot; is not found in Active Directory.  Press OK to exit&quot;
			&#039;WScript.quit
		Else
			While Not objRecordset.EOF
				userdn = objRecordSet.fields(&quot;distinguishedname&quot;)
				Set objUser = GetObject(&quot;LDAP://&quot; &amp; userdn &amp; &quot;&quot;)
				objUser.IsAccountLocked = False
				objUser.SetInfo
				On Error Resume Next
				If Err.Number &lt;&gt; 0 Then
					MsgBox(Err.Number &amp; &quot; &quot; &amp; Err.Description)
				Else
					MsgBox(&quot;Account Unlocked&quot;)
				End If        
				objRecordset.MoveNext
			Wend
		End If
	End Sub
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	DomainName WinNt&lt;input type=&quot;text&quot;  id=&quot;DomainNameWinNt&quot; name=&quot;DomainNameWinNt&quot; class=&quot;txtSearchText&quot; value=&quot;mechel&quot; size=&quot;20&quot;&gt; 
&lt;div id=&quot;divbody&quot;&gt;
						&lt;table&gt;
							&lt;tr&gt;
								&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;
									Enter the &lt;u&gt;username&lt;/u&gt; or &lt;u&gt;last name&lt;/u&gt; below and click appropriate search.&lt;br&gt;&lt;br&gt;
									&lt;input type=&quot;text&quot;  id=&quot;DomainNameAD2&quot; name=&quot;txtDomainName&quot; class=&quot;txtSearchText&quot; value=&quot;int.mechel.corp&quot; size=&quot;20&quot;&gt;
									&lt;input type=&quot;text&quot; name=&quot;StrUserid&quot; size=&quot;20&quot;&gt;
									&lt;input id=&quot;idsearchbutton&quot;  class=&quot;button&quot; type=&quot;button&quot; value=&quot;Search Username&quot; name=&quot;userid&quot;  onClick=&quot;useridsearch&quot;&gt;
									&lt;input id=&quot;lastsearchbutton&quot;  class=&quot;button&quot; type=&quot;button&quot; value=&quot;Search Last Name&quot; name=&quot;lastname&quot;  onClick=&quot;LastSearch&quot;&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/table&gt;
						&lt;br&gt;
						&lt;table&gt;
							&lt;tr&gt;
								&lt;td&gt;
									&lt;Div id=&quot;BaseUserInfo&quot; style=&quot;height:300px;overflow:auto&quot;&gt;
									&lt;/Div&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/table&gt;
						&lt;table&gt;
							  &lt;tr&gt;
								&lt;td valign=&quot;top&quot;&gt;
									&lt;Div id=&quot;AddUserInfo&quot;&gt;
									&lt;/Div&gt;
								&lt;/td&gt;
								&lt;td valign=&quot;top&quot;&gt;
									&lt;Div id=&quot;AccUserStatus&quot;&gt;
									&lt;/Div&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/table&gt;
						&lt;div id=&quot;AdditionalOptions&quot;&gt;
						&lt;/div&gt;
					&lt;/div&gt;
					&lt;span style=&#039;color:darkblue&#039;&gt;Domain: &lt;/span&gt;
					&lt;div id=&quot;status_bar&quot; style=&quot;padding-top:5px;&quot;&gt;
						&lt;span id=&quot;spnStatusOU&quot;&gt;
						&lt;/span&gt;
						&lt;span id=&quot;spnStatusDomain&quot;&gt;
						&lt;/span&gt;
						&lt;span id=&quot;spnScanTime&quot;&gt;
						&lt;/span&gt;
					&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[shade45]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33296</uri>
			</author>
			<updated>2016-02-05T05:27:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100851#p100851</id>
		</entry>
</feed>
