<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RO Windows Administrators Weblog &#187; Scripting</title>
	<atom:link href="http://www.winadmin.ro/category/scripting/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.winadmin.ro</link>
	<description>Weblogul adminilor de Windows din Romania.</description>
	<lastBuildDate>Wed, 28 Jul 2010 15:34:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Cum pot detecta cand cineva imi modifica grupul Domain Admins?</title>
		<link>http://www.winadmin.ro/2010/02/17/cum-pot-detecta-cand-cineva-imi-modifica-grupul-domain-admins/</link>
		<comments>http://www.winadmin.ro/2010/02/17/cum-pot-detecta-cand-cineva-imi-modifica-grupul-domain-admins/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 05:00:00 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[Domain Admins]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2010/02/17/cum-pot-detecta-cand-cineva-imi-modifica-grupul-domain-admins/</guid>
		<description><![CDATA[&#160; WMI?VBScript? Ne folosim de un exemplu de script de pe “Hey! Scripting guy!” care ne ajuta sa cautam in textul dintr-un event si de modelul de script descris in articolul de aici. In prima etapa scriptul monitorizeaza aparitia oricarui eveniment cu ID-ul 641 Set colMonitoredEvents = objWMIService.ExecNotificationQuery _&#160;&#160;&#160; &#160;&#160;&#160; (&#34;Select * from __InstanceCreationEvent Where [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p>WMI?VBScript?</p>
<p>Ne folosim de un exemplu de script de pe <a href="http://blogs.technet.com/heyscriptingguy/archive/2007/02/26/how-can-i-monitor-event-log-messages-for-specific-words.aspx">“Hey! Scripting guy!”</a> care ne ajuta sa cautam in textul dintr-un event si de modelul de script descris in articolul de <a href="http://www.winadmin.ro/2010/02/16/cum-monitorizez-aparitia-unui-anumit-event-id-in-loguri-vbswmi-version/">aici</a>.</p>
<p>In prima etapa scriptul monitorizeaza aparitia oricarui eveniment cu ID-ul 641</p>
<blockquote><p>Set colMonitoredEvents = objWMIService.ExecNotificationQuery _&#160;&#160;&#160; <br />&#160;&#160;&#160; (&quot;Select * from __InstanceCreationEvent Where &quot; _       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; &quot;TargetInstance ISA &#8216;Win32_NTLogEvent&#8217; &quot; _       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; &quot;and TargetInstance.EventCode = &#8217;641&#8242; &quot;)</p>
</blockquote>
<p>Urmand ca apoi sa caute un corpul mesajului textul “domain admins”.</p>
<blockquote><p>If InStr(LCase(objLatestEvent.TargetInstance.Message), &quot;domain admins&quot;) Then     <br />&#160;&#160;&#160; Wscript.Echo &quot;Message: &quot; &amp; objLatestEvent.TargetInstance.Message      <br />End If</p>
</blockquote>
<p>Intreg scriptul il gasiti mai jos:</p>
<blockquote><p>strComputer = &quot;.&quot; </p>
<p>Set objWMIService = GetObject(&quot;winmgmts:{(Security)}\\&quot; &amp; _     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; strComputer &amp; &quot;\root\cimv2&quot;) </p>
<p>Set colMonitoredEvents = objWMIService.ExecNotificationQuery _&#160;&#160;&#160; <br />&#160;&#160;&#160; (&quot;Select * from __InstanceCreationEvent Where &quot; _      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; &quot;TargetInstance ISA &#8216;Win32_NTLogEvent&#8217; &quot; _      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; &quot;and TargetInstance.EventCode = &#8217;641&#8242; &quot;) </p>
<p>Do     <br />&#160;&#160;&#160; Set objLatestEvent = colMonitoredEvents.NextEvent      <br />&#160;&#160;&#160; If InStr(LCase(objLatestEvent.TargetInstance.Message), &quot;domain admins&quot;) Then      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Message: &quot; &amp; objLatestEvent.TargetInstance.Message      <br />&#160;&#160;&#160; End If </p>
<p>Loop</p>
<p>&#160;</p>
</blockquote>
<p>Iata ce se intampla cand il rulam si modificam grupul Domain Admins.</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2010/02/image61.png"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="image" src="http://www.winadmin.ro/wp-content/uploads/2010/02/image_thumb22.png" width="644" height="435" /></a> </p>
<p>Ca actiune in cazul modificarii unui event doar afisam un text in cazul scriptului de mai sus, insa actiunea potrivita ar fi generarea si trimiterea unui email pentru a avertiza administratorul (dar asta alta data).</p>
<p>Pentru o mai buna protectie e bine sa monitorizam si grupurile Administrators, Enterprise Admins, Schema Admins (chiar si Backup &amp; Server Operators ar fi bine).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2010/02/17/cum-pot-detecta-cand-cineva-imi-modifica-grupul-domain-admins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cum monitorizez aparitia unui anumit Event ID in loguri? (VBS/WMI version)</title>
		<link>http://www.winadmin.ro/2010/02/16/cum-monitorizez-aparitia-unui-anumit-event-id-in-loguri-vbswmi-version/</link>
		<comments>http://www.winadmin.ro/2010/02/16/cum-monitorizez-aparitia-unui-anumit-event-id-in-loguri-vbswmi-version/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 06:00:00 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Management and monitoring]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Event ID]]></category>
		<category><![CDATA[Monitoring]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2010/02/16/cum-monitorizez-aparitia-unui-anumit-event-id-in-loguri-vbswmi-version/</guid>
		<description><![CDATA[  Exista destul de multe metode pentru a monitoriza aparitia unui anumit eveniment in event viewer. Avem tool-uri, scripturi, agenti de monitorizare, iar de la Windows Vista in sus putem sa declansam anumite activitati la aparitia unui eveniment folosind Task Scheduler. Astazi o sa prezint un mod de a face acest lucru folosind un script [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>Exista destul de multe metode pentru a monitoriza aparitia unui anumit eveniment in event viewer. Avem tool-uri, scripturi, agenti de monitorizare, iar de la Windows Vista in sus putem sa declansam anumite activitati la aparitia unui eveniment folosind Task Scheduler.</p>
<p>Astazi o sa prezint un mod de a face acest lucru folosind un script VBS (asta si pentru ca poate fi folosit cam pe orice versiune de Windows):</p>
<blockquote><p>strComputer = &#8220;.&#8221;</p>
<p>Set objWMIService = GetObject(&#8220;winmgmts:{(Security)}\\&#8221; &amp; _<br />
        strComputer &amp; &#8220;\root\cimv2&#8243;)</p>
<p>Set colMonitoredEvents = objWMIService.ExecNotificationQuery _  <br />
    (&#8220;Select * from __InstanceCreationEvent Where &#8221; _<br />
        &amp; &#8220;TargetInstance ISA &#8216;Win32_NTLogEvent&#8217; &#8221; _<br />
            &amp; &#8220;and TargetInstance.EventCode = &#8217;7035&#8242; &#8220;)</p>
<p>Do<br />
    Set objLatestEvent = colMonitoredEvents.NextEvent<br />
        Wscript.Echo &#8220;Un serviciu a fost oprit&#8221;<br />
        Wscript.Echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;<br />
        Wscript.Echo &#8220;User: &#8221; &amp; objLatestEvent.TargetInstance.User<br />
        Wscript.Echo &#8220;Time: &#8221; &amp; objLatestEvent.TargetInstance.TimeWritten<br />
        Wscript.Echo &#8220;Category: &#8221; &amp; objLatestEvent.TargetInstance.Category<br />
        Wscript.Echo &#8220;Event Code: &#8221; &amp; objLatestEvent.TargetInstance.EventCode<br />
        Wscript.Echo &#8220;Message: &#8221; &amp; objLatestEvent.TargetInstance.Message<br />
        Wscript.Echo &#8220;Record Number: &#8221; &amp; objLatestEvent.TargetInstance.RecordNumber<br />
        Wscript.Echo &#8220;Source Name: &#8221; &amp; objLatestEvent.TargetInstance.SourceName<br />
        Wscript.Echo &#8220;Event Type: &#8221; &amp; objLatestEvent.TargetInstance.Type<br />
        Wscript.Echo</p>
<p>        Wscript.Echo objLatestEvent.TargetInstance.Message<br />
        Wscript.Echo<br />
Loop</p></blockquote>
<p>Scriptul monitorizeaza aparitia evenimentului cu ID-ul 7035 (vedeti linia cu TargetInstance.EventCode = &#8217;7035&#8242;; pentru a monitoriza alt event modificati aceasta linie) in oricare din logurile sistemului. In momentul in care apare va afisa detalii despre eveniment. ID-ul 7035 apare la oprirea sau pornirea unui serviciu in Windows. Evenimentele de start si stop au acelasi cod (7035 si 7036) asa ca e putin mai greu sa deosebesti intre oprirea si pornirea unui serviciu doar din ID-ul eventului. Ca exemplu l-am pornit pe un server din command prompt:</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2010/02/image22.png"><img style="border-width: 0px;" src="http://www.winadmin.ro/wp-content/uploads/2010/02/image_thumb12.png" border="0" alt="image" width="644" height="171" /></a></p>
<p>Si am restartat serviciul DNS Client:</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2010/02/image23.png"><img style="border-width: 0px;" src="http://www.winadmin.ro/wp-content/uploads/2010/02/image_thumb13.png" border="0" alt="image" width="391" height="263" /></a></p>
<p>La cateva secunde iata ce se intampla in command prompt:</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2010/02/image24.png"><img style="border-width: 0px;" src="http://www.winadmin.ro/wp-content/uploads/2010/02/image_thumb14.png" border="0" alt="image" width="644" height="436" /></a></p>
<p>Exemplul cu restartul de serviciu nu este cel mai bun exemplu tocmai pentru ca nu exista event-uri separate pentru start si stop, insa e suficient ca sa intelegeti ca functioneaza. Scriptul poate fi modificat foarte usor pentru a face altceva, nu numai a afisa informatii pe ecran. Trebuie doar sa introduceti codul in bucla Do … Loop din script.</p>
<p>Sursa: <a href="http://blogs.technet.com/heyscriptingguy/">Hey, Scripting Guy!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2010/02/16/cum-monitorizez-aparitia-unui-anumit-event-id-in-loguri-vbswmi-version/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Searching for delegated rights in AD</title>
		<link>http://www.winadmin.ro/2009/12/08/searching-for-delegated-rights-in-ad/</link>
		<comments>http://www.winadmin.ro/2009/12/08/searching-for-delegated-rights-in-ad/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 06:05:00 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/?p=274</guid>
		<description><![CDATA[&#160; Scopul scriptului care il voi prezenta mai jos este de a cauta in Active Directory dupa delegarile facute la nivel de Organizational Unit-uri. Intr-un domeniu in care facem delegari pentru alti admini, daca acestea nu sunt documentate si sunt facute folosind useri si nu de grupuri, in timp sunt uitate iar userul va avea [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p>Scopul scriptului care il voi prezenta mai jos este de a cauta in Active Directory dupa delegarile facute la nivel de Organizational Unit-uri. Intr-un domeniu in care facem delegari pentru alti admini, daca acestea nu sunt documentate si sunt facute folosind useri si nu de grupuri, in timp sunt uitate iar userul va avea acces in continuare la resursele delegate chiar daca nu face parte din grupurile de administratori.</p>
<p>Scriptul arata cam asa:</p>
<blockquote><p>&#8216;Script created by Andrei Ungureanu      <br />&#8216;www.winadmin.ro </p>
<p>On error resume next      <br />Const ADS_SCOPE_SUBTREE = 2       <br />Const ADS_ACEFLAG_INHERITED_ACE = &amp;H10 </p>
<p>Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)      <br />Set objCommand =&#160;&#160; CreateObject(&quot;ADODB.Command&quot;)       <br />objConnection.Provider = &quot;ADsDSOObject&quot;       <br />objConnection.Open &quot;Active Directory Provider&quot; </p>
<p>Set objCOmmand.ActiveConnection = objConnection      <br />objCommand.CommandText = _       <br />&#160;&#160;&#160; &quot;Select Name, distinguishedName from &#8216;LDAP://DC=itboard,DC=local&#8217; &quot; _       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; &quot;Where objectClass=&#8217;organizationalUnit&#8217;&quot;&#160; <br />objCommand.Properties(&quot;Page Size&quot;) = 1000       <br />objCommand.Properties(&quot;Searchscope&quot;) = ADS_SCOPE_SUBTREE       <br />Set objRecordSet = objCommand.Execute       <br />objRecordSet.MoveFirst </p>
<p>Do Until objRecordSet.EOF      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; strOU = objRecordSet.Fields(&quot;distinguishedName&quot;)&#160; <br />Set ObjUser = GetObject(&quot;LDAP://&quot; &amp; strOU)       <br />Set objsd = objUser.Get(&quot;ntSecurityDescriptor&quot;)       <br />Set dacl = objsd.DiscretionaryAcl </p>
<p>For Each ace In dacl      <br />If ace.Trustee = &quot;ITBOARD\andreiu&quot; Then       <br />&#160;&#160;&#160; iAceFlags = ace.AceFlags </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; If(iAceFlags And ADS_ACEFLAG_INHERITED_ACE)Then      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exit For       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; End If </p>
<p>&#160;&#160;&#160; wscript.echo strOU      <br />&#160;&#160;&#160; Exit For       <br />End If       <br />next </p>
<p>&#160;&#160;&#160; objRecordSet.MoveNext      <br />Loop</p>
</blockquote>
<p>E nevoie sa inlocuiti in script ITBOARD\andreiu cu userul pe care il cautati si la fel numele domeniului din dc=itboard,dc=local in numele domeniului pe care rulati scriptul. Scriptul va verifica toata ierarhia de OU-uri si va afisa doar locatiile in care userul are permisiuni (daca exista deja permisiuni mostenite de la un OU parinte nu va mai verifica alte permisiuni pe acel OU).</p>
<p>Atentie ca numele userului si domeniul sunt case sensitive. Acestea trebuie puse in script exact asa cum apar in proprietatile userului:</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2009/12/image.png"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="image" src="http://www.winadmin.ro/wp-content/uploads/2009/12/image_thumb.png" width="406" height="484" /></a> </p>
<p>Scriptul nu este bullet proof si e posibila sa existe cazuri in care sa nu detecteze tot. Pentru a-i imbunatati viteza am decis sa fac skip la OU-urile unde exista deja drepturi mostenite pentru acel user.</p>
<p>PS: Atentie ca scripturile postate aici sunt modificate de wordpress si anumite caractere trebuie modificate de mana cand faceti copy/paste la script.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/12/08/searching-for-delegated-rights-in-ad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cum verificam bifa “Allow inheritable permissions” (in Active Directory)</title>
		<link>http://www.winadmin.ro/2009/11/24/cum-verificam-bifa-allow-inheritable-permissions-in-active-directory/</link>
		<comments>http://www.winadmin.ro/2009/11/24/cum-verificam-bifa-allow-inheritable-permissions-in-active-directory/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 23:08:22 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Delegation]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2009/11/24/cum-verificam-bifa-allow-inheritable-permissions-in-active-directory/</guid>
		<description><![CDATA[&#160; Stiu ca foarte multi administratori de Active Directory s-au lovit de problema asta. In special cand preiei administrarea unui domeniu de la altcineva sau cand obiectele care le ai in domeniul tau au venit printr-o migrare. Bifa din imaginea de mai jos se refera la mostenirea permisiunilor de pe containerul care contine obiectul (sau [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p>Stiu ca foarte multi administratori de Active Directory s-au lovit de problema asta. In special cand preiei administrarea unui domeniu de la altcineva sau cand obiectele care le ai in domeniul tau au venit printr-o migrare.</p>
<p>Bifa din imaginea de mai jos se refera la mostenirea permisiunilor de pe containerul care contine obiectul (sau pot fi mai multe nu numai unul).</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2009/11/image34.png"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="image" src="http://www.winadmin.ro/wp-content/uploads/2009/11/image_thumb33.png" width="570" height="484" /></a> </p>
<p>E nevoie ca aceste permisiuni sa se propage la obiectele din container, pentru ca la nivel de container se fac delegarile de permisiuni. Sa luam exemplul in care delegam permisiunea de a reseta parole unui admin regional pentru toti userii care se afla intr-o anumita locatie, mai exact toti userii care se afla intr-un anumit container (OU).</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2009/11/image35.png"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="image" src="http://www.winadmin.ro/wp-content/uploads/2009/11/image_thumb34.png" width="558" height="484" /></a> </p>
<p>Daca obiectele din containerul meu nu au bifa de care pomeneam mai sus activa, delegarea nu o sa functioneze. By default bifa e activa, insa pe parcursul vietii unui obiect in AD, se poate schimba. Cateodata poate fi facuta manual sau de anumite procese – gen cazul cand un user este adaugat in grupul Domain Admins, iar cand este scos nu este pusa la loc.</p>
</p>
<p>&#160;</p>
<p>Cum putem sa fortam activarea acestei bife sau sa vedem daca este activa? In cazul unui singur utilizator e simplu, problema apare atunci cand avem zeci sau sute de utilizatori (poate chiar mai multi dar ne oprim aici) de modificat sau verificat.</p>
<p>Ca de obicei VBScript ne sare in ajutor. Mai jos avem un exemplu de script care verifica toti userii dintr-un anumit OU din AD si activeaza optiunea <em>Allow inheritable permissions</em>.</p>
<p>&#160;</p>
<blockquote><p>&#8216;Script created by Andrei Ungureanu     <br />&#8216;www.winadmin.ro </p>
<p>On Error Resume Next </p>
<p>Const ADS_SCOPE_SUBTREE = 2     <br />Const SE_DACL_PROTECTED = 0 </p>
<p>Set objConnection = CreateObject(&quot;ADODB.Connection&quot;)     <br />Set objCommand =&#160;&#160; CreateObject(&quot;ADODB.Command&quot;)      <br />objConnection.Provider = &quot;ADsDSOObject&quot;      <br />objConnection.Open &quot;Active Directory Provider&quot;      <br />Set objCommand.ActiveConnection = objConnection </p>
<p>objCommand.Properties(&quot;Size Limit&quot;)= 10000 </p>
<p>objCommand.Properties(&quot;Page Size&quot;) = 10000     <br />objCommand.Properties(&quot;Searchscope&quot;) = ADS_SCOPE_SUBTREE </p>
<p>objCommand.CommandText = _     <br />&quot;&lt;LDAP://ou=accounts,dc=itboard,dc=local&gt;;&quot;_      <br />&amp; &quot;(objectCategory=user);sAMAccountName,distinguishedname;subtree&quot;</p>
<p>Set objRecordSet = objCommand.Execute </p>
<p>objRecordSet.MoveFirst     <br />Do Until objRecordSet.EOF </p>
<p> userDN = objRecordSet.Fields(&quot;distinguishedName&quot;).Value     <br /> set objObject = getobject(&quot;LDAP://&quot; &amp; userDN &amp; &quot;&quot;)      <br /> Set objntSD = objObject.Get(&quot;nTSecurityDescriptor&quot;) </p>
<p> intNTSDControl = objNtSD.Control </p>
<p> If intNTSDControl &lt;&gt; 35844 Then     <br />&#160;&#160;&#160; &#8216; Enable &quot;allow inheritable permissions&quot;.      <br />&#160;&#160;&#160; intNTSDControl = intNTSDControl And SE_DACL_PROTECTED      <br />&#160;&#160;&#160; objntSD.Control = intNTSDControl      <br />&#160;&#160;&#160; objObject.Put &quot;nTSecurityDescriptor&quot;, objntSD      <br />&#160;&#160;&#160; objObject.SetInfo      <br />&#160;&#160;&#160; WScript.Echo &quot;Obiectul &quot; &amp; userDN &amp; &quot; a fost modificat&quot;      <br /> End If </p>
<p> objRecordSet.MoveNext     <br />Loop</p>
</blockquote>
<p>Calea <a href="//ou=accounts,dc=itboard,dc=local">LDAP://ou=accounts,dc=itboard,dc=local</a> trebuie inlocuita cu locatia in care avem obiectele ce trebuiesc scanate. Merge specificat chiar si domain root insa nu recomand asa ceva. Recomand ca inainte sa folositi scriptul, sa il verificati pe un mediu de test.</p>
<p>PS: scriptul merge modificat foarte usor si doar pentru a arata starea bifei <em>Allow inheritable permissions</em>.</p>
<p><font>&#160;</font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/11/24/cum-verificam-bifa-allow-inheritable-permissions-in-active-directory/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cum aflam cine este logat pe o statie? (via Active Directory)</title>
		<link>http://www.winadmin.ro/2009/11/19/cum-aflam-cine-este-logat-pe-o-statie-via-active-directory/</link>
		<comments>http://www.winadmin.ro/2009/11/19/cum-aflam-cine-este-logat-pe-o-statie-via-active-directory/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 16:53:55 +0000</pubDate>
		<dc:creator>mmarius</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/?p=238</guid>
		<description><![CDATA[Sunt convins ca fiecare admin are metoda lui de a verifica cine este logat pe o statie. Ca sa dam cateva exemple  : - Sesiune de RDP catre statia respectiva (dupa validare suntem intrebati daca vrem (sau nu) sa deconectam userul). - Query WMI pe statie. - Diverse tool-uri third party -Scripturi In-house M-am tot [...]]]></description>
			<content:encoded><![CDATA[<p>Sunt convins ca fiecare admin are metoda lui de a verifica cine este logat pe o statie.</p>
<p>Ca sa dam cateva exemple  :</p>
<p>- Sesiune de RDP catre statia respectiva (dupa validare suntem intrebati daca vrem (sau nu) sa deconectam userul).</p>
<p>- Query WMI pe statie.</p>
<p>- Diverse tool-uri third party</p>
<p>-Scripturi In-house</p>
<p>M-am tot gandit in ultima vreme la o metoda mai eleganta de a centraliza aceste informatii. Am tot analizat acest proces si de la un sheet in excel am ajuns la concluzia ca ar fi mai util sa fie in AD, mai ales ca fiecare dintre noi il foloseste mai tot timpul. Asa ca m-am gandit ca ar fi bine sa fac un script.</p>
<p>Acest script va verifica din sesiunea locala variabilele de sistem %username% si %computername% iar daca ele sunt identice cu cele din AD (aici ma refer la common name-ul asociat obiectelor) atunci va modifica attributul description pentru obiectul aferent statiei cu un string formatat din script.</p>
<p>Acesta se va aplica la user logon printr-un GPO, sau setat ca logon script din Active Directory User and Computers in tabul profile.</p>
<p>Inainte de a incepe cu analiza scriptului voi sublinia pasi logici de implementare:</p>
<p>1. Script</p>
<p>2. Modificarea securitatii pe OU-ul care contine statiile.</p>
<p>3. Creare GPO, sau setat ca logon script din Active Directory User and Computers in tabul profile.</p>
<p>4. Testare</p>
<p>5. Aplicare politica</p>
<p>In acest articol voi prezenta doar pasii 1 si 2.</p>
<p> </p>
<p>1. Script</p>
<p>Codul scriptului este colorat in gri pentru o preluare mai rapida in pagina.</p>
<p> </p>
<p><span style="color: #808080;">&#8216;Created by Mihai Marius 2009<br />
&#8216;</span></p>
<p><span style="color: #808080;">Set wshShell = WScript.CreateObject( &#8220;WScript.Shell&#8221; )</span><span style="color: #808080;"><br />
<span style="color: #808080;">Local_ComputerName = wshShell.ExpandEnvironmentStrings( &#8220;%COMPUTERNAME%&#8221; )<br />
Local_UserName = wshShell.ExpandEnvironmentStrings( &#8220;%USERNAME%&#8221; ) </span></span></p>
<p><span style="color: #808080;"> </span></p>
<p><span style="color: #808080;">Set objSysInfo = CreateObject( &#8220;ADSystemInfo&#8221; )<br />
AD_ComputerName = objSysInfo.ComputerName<br />
AD_UserName = objSysInfo.UserName </span></p>
<p><span style="color: #808080;"> </span></p>
<p><span style="color: #808080;">Set objUser = GetObject(&#8220;LDAP://&#8221; &amp; AD_UserName)<br />
Set objComputer = GetObject(&#8220;LDAP://&#8221; &amp; AD_ComputerName) </span></p>
<p><span style="color: #808080;"> </span></p>
<p><span style="color: #808080;">    </span><span style="color: #808080;">If Local_UserName = objUser.CN and Local_ComputerName = objComputer.CN Then </span></p>
<p><span style="color: #808080;">Text_Desc = &#8220;Userul &#8221; &amp; objUser.CN &amp; &#8221; s-a connectat  la &#8221; &amp; Now &amp; &#8220;.&#8221; </span></p>
<p><span style="color: #808080;">objComputer.Description = Text_Desc<br />
objComputer.SetInfo </span></p>
<p><span style="color: #808080;">Set wshShell = Nothing<br />
Set objSysInfo = Nothing<br />
Set objComputer    = Nothing<br />
Set objUser = Nothing </span></p>
<p><span style="color: #808080;">Else</span></p>
<p><span style="color: #808080;">Set wshShell = Nothing<br />
Set objSysInfo = Nothing<br />
Set objComputer    = Nothing<br />
Set objUser = Nothing </span></p>
<p><span style="color: #808080;">    End If</span></p>
<p><span style="color: #808080;">WScript.Quit </span></p>
<p>Acum sa analizam codul si sa oferim cateva informatii.</p>
<blockquote><p>Set wshShell = WScript.CreateObject( &#8220;WScript.Shell&#8221; )<br />
Local_ComputerName = wshShell.ExpandEnvironmentStrings( &#8220;%COMPUTERNAME%&#8221; )<br />
Local_UserName = wshShell.ExpandEnvironmentStrings( &#8220;%USERNAME%&#8221; )</p></blockquote>
<p>Initializam un shell pentru sesiunea locala de unde extragem variabilele de sistem %computername% si %username%.</p>
<p>Valorile returnate vor fi declarate ca Local_ComputerName  si Local_UserName.</p>
<p> </p>
<blockquote><p>Set objSysInfo = CreateObject( &#8220;ADSystemInfo&#8221; )<br />
AD_ComputerName = objSysInfo.ComputerName<br />
AD_UserName = objSysInfo.UserName</p></blockquote>
<p>Cream o instanta a clasei ADSystemInfo, pentru a utiliza obiectele din AD care fac referinta la statie si utilizator. Este important de subliniat valoarea acestei clase deoarece ea ne returneaza DN-ul (distinguished name) obiectelor util in pasul urmator.</p>
<p> </p>
<blockquote><p>Set objUser = GetObject(&#8220;LDAP://&#8221; &amp; AD_UserName)<br />
Set objComputer = GetObject(&#8220;LDAP://&#8221; &amp; AD_ComputerName)</p></blockquote>
<p>Query LDAP pentru a utiliza atributele din AD asociate statiei si utilizatorului.</p>
<p> </p>
<blockquote><p>If Local_UserName = objUser.CN and Local_ComputerName = objComputer.CN Then</p>
<p>Text_Desc = &#8220;Userul &#8221; &amp; objUser.CN &amp; &#8221; s-a connectat  la &#8221; &amp; Now &amp; &#8220;.&#8221;</p></blockquote>
<p>O functie de validare intre valorile locale si valorile asociate obiectelor in AD. M-am gandit sa fac un double check ale acestor valori pentru a nu modifica campul description daca nu ele nu sunt identice.</p>
<p>Daca valorile sunt egale atunci se formateaza textul pentru descriere. Intial m-am gandit sa trec doar utilizatorul dar am vazut pe net si alte abordari de forma: &#8220;Userul x s-a logat la data z ora y” si m-am gandit ca acesta abordare ar fi mai utila pentru debugging.</p>
<p> </p>
<blockquote><p>objComputer.Description = Text_Desc<br />
objComputer.SetInfo</p>
<p>Set wshShell = Nothing<br />
Set objSysInfo = Nothing<br />
Set objComputer    = Nothing<br />
Set objUser = Nothing</p></blockquote>
<p>Setam textul formatat pentru atributul description al obiectului ce reprezinta statia. Eliminam obiectele care au fost incarcate in memoria sistemului .</p>
<blockquote><p>Else</p>
<p>Set wshShell = Nothing<br />
Set objSysInfo = Nothing<br />
Set objComputer    = Nothing<br />
Set objUser = Nothing</p></blockquote>
<blockquote><p>    End If<br />
WScript.Quit</p></blockquote>
<p>Daca valorile nu sunt egale atunci eliminam obiectele care au fost incarcate in memoria sistemului dupa care terminam functia si iesim din script.</p>
<p> </p>
<p>2.Modificarea securitatii pe OU-ul care contine statiile.</p>
<p>In acest pas voi descrie modul in care putem modifica securitatea OU-ului in care se regasesc obiectele care fac referinta la statiile din domeniu, pentru a permite doar modificarea campului description.<br />
Fara aceste permisiuni de modificare acest script nu va functiona pentru useri simpli (ma refer desigur la Domain Users).</p>
<p>In exemplul meu voi folosi  OU-ul Comp iar permisiunile le voi asocia groupului Domain Users. Ar fi de preferat sa utilizam un alt group ca sa nu-l folositi pe cel default, pentru a limita expunerile la eventuale atacuri.</p>
<p>Deschidem consola de Active Directory Users and Computers –&gt; Selectam OU-ul Comp –&gt; click dreapta Security si selectam Advanced –&gt; Add –&gt; Introducem Domain Users si selectam OK –&gt; selectam tabul Properties.</p>
<p>In campul Apply onto selectam “Computer objects” si selectam Write Description.</p>
<p>Poza arata exact pasi enumerati mai sus.</p>
<p> </p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2009/11/permisiuni.jpg"><img style="border-top-width: 0px;border-left-width: 0px;border-bottom-width: 0px;border-right-width: 0px" src="http://www.winadmin.ro/wp-content/uploads/2009/11/permisiuni_thumb.jpg" border="0" alt="permisiuni" width="680" height="573" /></a></p>
<p>Click OK, three times.</p>
<p>Dupa aplicarea scriptului in campul description al unei statii ar trebui sa arate asa:</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2009/11/pc.jpg"><img style="border-top-width: 0px;border-left-width: 0px;border-bottom-width: 0px;border-right-width: 0px" src="http://www.winadmin.ro/wp-content/uploads/2009/11/pc_thumb.jpg" border="0" alt="pc" width="709" height="542" /></a></p>
<p> </p>
<p>Sfat: Inainte de aplicarea acestei politci ar fi bine sa faceti cateva teste pentru a nu perturba activitatea.</p>
<p> </p>
<p>Troubleshooting: In cazul in care nu ati configurat corect , partea de permisiuni pe OU, veti primi un mesaj de eroare (pe sesiunea clientului) de forma :</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2009/11/error.jpg"><img style="border-top-width: 0px;border-left-width: 0px;border-bottom-width: 0px;border-right-width: 0px" src="http://www.winadmin.ro/wp-content/uploads/2009/11/error_thumb.jpg" border="0" alt="error" width="385" height="163" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/11/19/cum-aflam-cine-este-logat-pe-o-statie-via-active-directory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Run Powershell Scripts from GPO</title>
		<link>http://www.winadmin.ro/2009/10/27/run-powershell-scripts-from-gpo/</link>
		<comments>http://www.winadmin.ro/2009/10/27/run-powershell-scripts-from-gpo/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 08:00:00 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Group Policy]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2009/10/27/run-powershell-scripts-from-gpo/</guid>
		<description><![CDATA[Nou in Windows 2008R2 &#38; 7 putem face deployment la scripturi Powershell (startup sau logon): Scriptul cu extensia ps1 se copiaza in folderul scripts asociat cu politica si se adauga cu Add, fara powershell.exe in fata. Pe sistemul meu de test am avut setat deja Set-ExecutionPolicy Unrestricted. Dupa asta am setat sistemul si pe AllSigned [...]]]></description>
			<content:encoded><![CDATA[<p>Nou in Windows 2008R2 &amp; 7 putem face deployment la scripturi Powershell (startup sau logon):</p>
<p><a href="http://www.winadmin.ro/wp-content/uploads/2009/10/image82.png"><img style="border-bottom: 0px;border-left: 0px;float: none;margin-left: auto;border-top: 0px;margin-right: auto;border-right: 0px" border="0" alt="image" src="http://www.winadmin.ro/wp-content/uploads/2009/10/image_thumb81.png" width="624" height="484" /></a></p>
<p>Scriptul cu extensia ps1 se copiaza in folderul scripts asociat cu politica si se adauga cu Add, fara powershell.exe in fata.</p>
<p>Pe sistemul meu de test am avut setat deja Set-ExecutionPolicy Unrestricted. Dupa asta am setat sistemul si pe AllSigned si scriptul ruleaza fara probleme <img src='http://www.winadmin.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/10/27/run-powershell-scripts-from-gpo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cum schimbi IP Settings din script</title>
		<link>http://www.winadmin.ro/2009/10/14/cum-schimbi-ip-settings-din-script/</link>
		<comments>http://www.winadmin.ro/2009/10/14/cum-schimbi-ip-settings-din-script/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 16:57:12 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2009/10/14/cum-schimbi-ip-settings-din-script/</guid>
		<description><![CDATA[Chiar merge, nu e nevoie sa te duci pana la consola sistemului ca sa-i schimbi IP-ul, sa-l treci pe DHCP sau sa-i schimbi setarile pentru DNS/WINS. Merge din script. Si pentru ca majoritatea scripturilor pe care le folosesc sunt scrise in VBS o sa continui tot asa (pentru moment, ca studiez Powershell si Python). &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Chiar merge, nu e nevoie sa te duci pana la consola sistemului ca sa-i schimbi IP-ul, sa-l treci pe DHCP sau sa-i schimbi setarile pentru DNS/WINS. Merge din script. Si pentru ca majoritatea scripturilor pe care le folosesc sunt scrise in VBS o sa continui tot asa (pentru moment, ca studiez Powershell si Python).</p>
<p>&#160;</p>
<p>Un exemplu pentru folosirea acestui script ar fi un subnet cu ip-uri puse static si unde trebuie sa schimbi adresa serverului de DNS la toate sistemele. Sau un sistem setat cu IP static pe care vrei sa-l treci pe DHCP. Hai sa vedem si cateva exemple.</p>
<p>Cand pentru numele calculatorului folosim “.” inseamna ca ne conectam la sistemul local. Scriptul urmator trece pe DHCP toate adaptoarele de retea care au TCP/IP activat:</p>
<p><font color="#ff0000">strComputer = &quot;.&quot;      <br />set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)       <br />Set colItems = objWMIService.ExecQuery(&quot;Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = 1&quot;) </font></p>
<p><font color="#ff0000">For Each objItem in colItems      <br />&#160;&#160;&#160; If objItem.DHCPEnabled = False then       <br />&#160;&#160;&#160;&#160;&#160; errDHCP = objItem.EnableDHCP()</font></p>
<p><font color="#ff0000">&#160;&#160;&#160;&#160;&#160; errDNS = objItem.SetDNSServerSearchOrder()&#160; <br />&#160;&#160;&#160; End If       <br />Next</font></p>
<p>&#160;</p>
<p>Bun. Acum sa luam cazul in care vrem sa trecem de pe DHCP pe IP fix. Pentru asta folosim metoda EnableStatic care primeste 2 parametri IP Address si Subnet Mask sub forma:</p>
<p><font color="#ff0000">errStaticIP = objItem.EnableStatic(array(“192.168.0.10”),array(”255.255.255.0”))</font></p>
<p><font color="#ff0000">errDNS = objItem.SetDNSServerSearchOrder(array(“192.168.0.100, 192.168.0.101”))</font>&#160;</p>
<p>Ce altceva mai putem sa setam? WINS de exemplu:</p>
<p><font color="#ff0000">errWins = objItem.SetWINSServer (array(“192.168.0.100, 192.168.0.101”))</font></p>
<p>Pe scurt, puteti seta cam orice legat de configuratia TCP/IP prin script. Chiar si combinatii mai ciudate cu IP luat prin DHCP si DNS pus manual. Unul din scripturile facute in ultimul timp (pe genunchi) se conecta la toata sistemele dintr-un anumit subnet si imi dadea informatii despre clientul de DHCP: cand si-a luat IP ultima data, cand expira leaseul, de la ce server si-a luat IP, etc.</p>
<p>Concluzie: daca trebuie sa treceti o retea intreaga pe DHCP nu e nevoie sa vizitati fiecare calculator in parte. Merge si remote.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/10/14/cum-schimbi-ip-settings-din-script/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cum trimitem parametri unui VBScript</title>
		<link>http://www.winadmin.ro/2009/10/09/cum-trimitem-parametri-unui-vbscript/</link>
		<comments>http://www.winadmin.ro/2009/10/09/cum-trimitem-parametri-unui-vbscript/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 14:22:00 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2009/10/09/cum-trimitem-parametri-unui-vbscript/</guid>
		<description><![CDATA[Daca ne-am plictisit sa modificam scripturile de fiecare data pentru a specifica numele serverului sau locul unde e lista, exista si o varianta mai buna. Porninrea scriptului cu parametri. Pentru asta folosim colectia WScript.Arguments. Si putem verifica daca au fost specificati parametri folosing proprietatea Count: arguments = WScript.Arguments.Count Urmand a face si o verificare: If [...]]]></description>
			<content:encoded><![CDATA[<p>Daca ne-am plictisit sa modificam scripturile de fiecare data pentru a specifica numele serverului sau locul unde e lista, exista si o varianta mai buna. Porninrea scriptului cu parametri.</p>
<p>Pentru asta folosim colectia WScript.Arguments. Si putem verifica daca au fost specificati parametri folosing proprietatea Count:</p>
<p>arguments = WScript.Arguments.Count</p>
<p>Urmand a face si o verificare:</p>
<p>If arguments &lt; 1 then    <br />&#160; WScript.Echo “Ati uitat sa specificati parametrii. Exemplu: cscript script.vbs [parametru]”     <br />&#160; WScript.Quit     <br />end If</p>
<p>Daca se trece mai departe de conditia If putem sa citim parametrii:</p>
<p>param1 = WScript.Arguments.Item(0)</p>
<p>Wscript.Echo param1</p>
<p>Daca avem mai multi citim si celelalte obiecte din colectie ex:WScript.Arguments.Item(1) (ati prins ideea).</p>
<p>&#160;</p>
<p>PS: by default scripturile sunt rulate folosind Wscript.exe atunci cand pornesti scriptul din Explorer. (comportamentul default merge modificat) Recomandat e sa rulati scripturile folosind Cscript.exe (ex: cscript myscript.vbs parametru) pentru a primi output-ul in fereastra din care ati lansat scriptul si pentru a-l putea redirecta.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/10/09/cum-trimitem-parametri-unui-vbscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reading from a text file &#8211; VBScript</title>
		<link>http://www.winadmin.ro/2009/10/09/reading-from-a-text-file-vbscript/</link>
		<comments>http://www.winadmin.ro/2009/10/09/reading-from-a-text-file-vbscript/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 13:50:41 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2009/10/09/reading-from-a-text-file-vbscript/</guid>
		<description><![CDATA[In foarte multe cazuri cand folosim scripturi pentru administrare specificam numele serverului la care sa ne conectam sau ne folosim de o lista in care avem toate serverele. Lista se afla intr-un fisier text si arata cam asa: Server1 Server2 Server3 Server4 Ideea e ca aveam nevoie de un script care se va conecta la [...]]]></description>
			<content:encoded><![CDATA[<p>In foarte multe cazuri cand folosim scripturi pentru administrare specificam numele serverului la care sa ne conectam sau ne folosim de o lista in care avem toate serverele. Lista se afla intr-un fisier text si arata cam asa:</p>
<p>Server1   <br />Server2    <br />Server3    <br />Server4</p>
<p>Ideea e ca aveam nevoie de un script care se va conecta la toate sisteme din lista si va face ceva. Ce va face nu e important acum Important e cum citim lista cu serverele. Iata si scriptul:</p>
<p>Const ForReading = 1   <br />Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)    <br />Set objTextFile = objFSO.OpenTextFile(&quot;d:\temp\servers.txt&quot;, ForReading)    <br />Do While objTextFile.AtEndOfStream &lt;&gt; True    <br /> strServer = objTextFile.ReadLine    <br /> Wscript.Echo &quot;Server: &quot; &amp; strServer    <br />Loop    <br />objTextFile.Close</p>
<p>&#160;</p>
<p>In linia <em>Set objTextFile = objFSO.OpenTextFile(&quot;d:\temp\servers.txt&quot;, ForReading) </em>puteti specifica locatia listei. Merge si ca parametru dar in alt post.</p>
<p>Iar in bucla Do While-Loop puteti introduce bucata de cod de care aveti nevoie si care se va folosi de variabila strServer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/10/09/reading-from-a-text-file-vbscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get DNS Server info via VBScript</title>
		<link>http://www.winadmin.ro/2009/10/08/get-dns-server-info-via-vbscript/</link>
		<comments>http://www.winadmin.ro/2009/10/08/get-dns-server-info-via-vbscript/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 12:51:15 +0000</pubDate>
		<dc:creator>Andrei Ungureanu</dc:creator>
				<category><![CDATA[Scripting]]></category>
		<category><![CDATA[DNS]]></category>

		<guid isPermaLink="false">http://www.winadmin.ro/2009/10/08/get-dns-server-info-via-vbscript/</guid>
		<description><![CDATA[Intr-o retea cu multe servere DNS, si de regula acolo unde sunt multe DC-uri sunt si multe DNS-uri poate o exista o problema in standardizarea setarilor pe aceste servere. Si cum DNS-ul reprezinta una din principalele cauze pentru care din cand in cand lucrurile nu merg asa cum ar trebui m-am gandit sa fac un [...]]]></description>
			<content:encoded><![CDATA[<p>Intr-o retea cu multe servere DNS, si de regula acolo unde sunt multe DC-uri sunt si multe DNS-uri poate o exista o problema in standardizarea setarilor pe aceste servere. Si cum DNS-ul reprezinta una din principalele cauze pentru care din cand in cand lucrurile nu merg asa cum ar trebui m-am gandit sa fac un script care sa se conecteze la toate DC-urile din domeniu si sa afiseze setarile serverului de DNS.</p>
<p>In cazul meu ma interesau setarile ce tin de forwarder, dar hai sa vedem ce a iesit.</p>
<p>Prima data trebuie sa aflam care sunt serverele DC din domeniu. Pentru asta m-am inspirat dintr-un <a href="http://www.rlmueller.net/Programs/EnumDCs.txt">script de-al lui Richard Mueller</a> care se conecteaza la configuration partion si cauta toate obiectele de tip NTDSA. Problema e ca noi trebuie sa cautam doar DC-urile, altfel as fi cautat simplu dupa server, dar e posibil gasesc si ceva servere Exchange care mai apar pe acolo. Cautand dupa NTDSA gasesc DC-urile insa trebuie sa aflu obiectul parinte, de asta am apelat la scriptul lui Richard Mueller ca sa nu ma mai chinui eu. Bineinteles ca exista si alte variante – gen enumerarea obiectelor din containerul Domain Controllers.</p>
<p>&#160;</p>
<p>Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery   <br />Dim adoRecordset, objDC, objSite </p>
<p>&#8216; Determine configuration context from RootDSE object.   <br />Set objRootDSE = GetObject(&quot;LDAP://RootDSE&quot;)    <br />strConfig = objRootDSE.Get(&quot;configurationNamingContext&quot;) </p>
<p>&#8216; Use ADO to search Active Directory for ObjectClass nTDSDSA.   <br />Set adoCommand = CreateObject(&quot;ADODB.Command&quot;)    <br />Set adoConnection = CreateObject(&quot;ADODB.Connection&quot;)    <br />adoConnection.Provider = &quot;ADsDSOObject&quot;    <br />adoConnection.Open &quot;Active Directory Provider&quot;    <br />adoCommand.ActiveConnection = adoConnection </p>
<p>strQuery = &quot;&lt;LDAP://&quot; &amp; strConfig _   <br />&#160;&#160;&#160; &amp; &quot;&gt;;(ObjectClass=nTDSDSA);AdsPath;subtree&quot; </p>
<p>adoCommand.CommandText = strQuery   <br />adoCommand.Properties(&quot;Page Size&quot;) = 100    <br />adoCommand.Properties(&quot;Timeout&quot;) = 30    <br />adoCommand.Properties(&quot;Cache Results&quot;) = False </p>
<p>Set adoRecordset = adoCommand.Execute </p>
<p>&#8216; The parent object of each object with ObjectClass=nTDSDSA is a Domain   <br />&#8216; Controller. The parent of each Domain Controller is a &quot;Servers&quot;    <br />&#8216; container, and the parent of this container is the &quot;Site&quot; container.    <br />Do Until adoRecordset.EOF    <br />&#160;&#160;&#160; Set objDC = GetObject( _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; GetObject(adoRecordset.Fields(&quot;AdsPath&quot;).Value).Parent)    <br />&#160;&#160;&#160; Set objSite = GetObject(GetObject(objDC.Parent).Parent)    <br />&#160;&#160;&#160; Wscript.Echo &quot;Domain Controller: &quot; &amp; objDC.cn &amp; vbCrLf _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; &quot;DNS Host Name: &quot; &amp; objDC.DNSHostName &amp; vbCrLf _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp; &quot;Site: &quot; &amp; objSite.name </p>
<p>‘Aici e bucata de cod care se conecteaza la DNS si citeste proprietatile</p>
<p>strComputer =&#160; objDC.cn   <br />Set objWMIService = GetObject(&quot;winmgmts:&quot; _    <br />&#160;&#160;&#160; &amp; &quot;{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;\root\MicrosoftDNS&quot;) </p>
<p>Set colItems = objWMIService.ExecQuery(&quot;Select * from MicrosoftDNS_Server&quot;) </p>
<p>For Each objItem in colItems   <br />&#160;&#160;&#160; </p>
<p>&#160;&#160;&#160; Wscript.Echo &quot;Address Answer Limit: &quot; &amp; objItem.AddressAnswerLimit   <br />&#160;&#160;&#160; Wscript.Echo &quot;Allow Update: &quot; &amp; objItem.AllowUpdate    <br />&#160;&#160;&#160; Wscript.Echo &quot;Autocache Update: &quot; &amp; objItem.AutoCacheUpdate    <br />&#160;&#160;&#160; Wscript.Echo &quot;Autoconfig File Zones: &quot; &amp; objItem.AutoConfigFileZones    <br />&#160;&#160;&#160; Wscript.Echo &quot;Bind Secondaries: &quot; &amp; objItem.BindSecondaries    <br />&#160;&#160;&#160; Wscript.Echo &quot;Boot Method: &quot; &amp; objItem.BootMethod    <br />&#160;&#160;&#160; Wscript.Echo &quot;Default Aging State: &quot; &amp; objItem.DefaultAgingState    <br />&#160;&#160;&#160; Wscript.Echo &quot;Default No-Refresh Interval: &quot; &amp; _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; objItem.DefaultNoRefreshInterval    <br />&#160;&#160;&#160; Wscript.Echo &quot;Default Refresh Interval: &quot; &amp; objItem.DefaultRefreshInterval    <br />&#160;&#160;&#160; Wscript.Echo &quot;Disable AutoReverse Zones: &quot; &amp; _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; objItem.DisableAutoReverseZones    <br />&#160;&#160;&#160; Wscript.Echo &quot;Disjoint Nets: &quot; &amp; objItem.DisjointNets    <br />&#160;&#160;&#160; Wscript.Echo &quot;Directory Service Available: &quot; &amp; objItem.DsAvailable    <br />&#160;&#160;&#160; Wscript.Echo &quot;Directory Service Polling Interval: &quot; &amp; _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; objItem.DsPollingInterval    <br />&#160;&#160;&#160; Wscript.Echo &quot;Directory Service Tombstone Interval: &quot; &amp; _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; objItem.DsTombstoneInterval    <br />&#160;&#160;&#160; Wscript.Echo &quot;EDNS Cache Timeout: &quot; &amp; objItem.EDnsCacheTimeout    <br />&#160;&#160;&#160; Wscript.Echo &quot;Enable Directory Partitions: &quot; &amp; _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; objItem.EnableDirectoryPartitions    <br />&#160;&#160;&#160; Wscript.Echo &quot;Enable DNSSec: &quot; &amp; objItem.EnableDnsSec    <br />&#160;&#160;&#160; Wscript.Echo &quot;Enable EDNS Probes: &quot; &amp; objItem.EnableEDnsProbes    <br />&#160;&#160;&#160; Wscript.Echo &quot;Event Log Level: &quot; &amp; objItem.EventLogLevel    <br />&#160;&#160;&#160; Wscript.Echo &quot;Forward Delegations: &quot; &amp; objItem.ForwardDelegations    <br />&#160;&#160;&#160; If Not IsNull(objItem.Forwarders) Then    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; strForwarders = Join(objItem.Forwarders, &quot;,&quot;)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Forwarders: &quot; &amp; strForwarders    <br />&#160;&#160;&#160; Else    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Forwarders:&quot;    <br />&#160;&#160;&#160; End If    <br />&#160;&#160;&#160; Wscript.Echo &quot;Forwarding Timeout: &quot; &amp; objItem.ForwardingTimeout    <br />&#160;&#160;&#160; Wscript.Echo &quot;Is Slave: &quot; &amp; objItem.IsSlave    <br />&#160;&#160;&#160; If Not IsNull(objItem.ListenAddresses) Then    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; strListenAddresses = Join(objItem.ListenAddresses, &quot;,&quot;)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Listen Addresses: &quot; &amp; strListenAddresses    <br />&#160;&#160;&#160; Else    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Listen Addresses:&quot;    <br />&#160;&#160;&#160; End If    <br />&#160;&#160;&#160; Wscript.Echo &quot;Local Net Priority: &quot; &amp; objItem.LocalNetPriority    <br />&#160;&#160;&#160; Wscript.Echo &quot;Logfile Maximum Size: &quot; &amp; objItem.LogFileMaxSize    <br />&#160;&#160;&#160; Wscript.Echo &quot;Logfile Path: &quot; &amp; objItem.LogFilePath    <br />&#160;&#160;&#160; If Not IsNull(objItem.LogIPFilterList) Then    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; strIPFilter = Join(objItem.LogIPFilterList, &quot;,&quot;)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Log IPFilter List: &quot; &amp; strIPFilter    <br />&#160;&#160;&#160; Else    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Log IPFilter List:&quot;    <br />&#160;&#160;&#160; End If    <br />&#160;&#160;&#160; Wscript.Echo &quot;Log Level: &quot; &amp; objItem.LogLevel    <br />&#160;&#160;&#160; Wscript.Echo &quot;Loose Wildcarding: &quot; &amp; objItem.LooseWildcarding    <br />&#160;&#160;&#160; Wscript.Echo &quot;Maximum Cache Time-to-Live: &quot; &amp; objItem.MaxCacheTTL    <br />&#160;&#160;&#160; Wscript.Echo &quot;Maximum Negative Cache Time-to-Live: &quot; &amp; _    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; objItem.MaxNegativeCacheTTL    <br />&#160;&#160;&#160; Wscript.Echo &quot;Name Check Flag: &quot; &amp; objItem.NameCheckFlag    <br />&#160;&#160;&#160; Wscript.Echo &quot;No Recursion: &quot; &amp; objItem.NoRecursion    <br />&#160;&#160;&#160; Wscript.Echo &quot;Recursion Retry: &quot; &amp; objItem.RecursionRetry    <br />&#160;&#160;&#160; Wscript.Echo &quot;Recursion Timeout: &quot; &amp; objItem.RecursionTimeout    <br />&#160;&#160;&#160; Wscript.Echo &quot;RoundRobin: &quot; &amp; objItem.RoundRobin    <br />&#160;&#160;&#160; Wscript.Echo &quot;Rpc Protocol: &quot; &amp; objItem.RpcProtocol    <br />&#160;&#160;&#160; Wscript.Echo &quot;Scavenging Interval: &quot; &amp; objItem.ScavengingInterval    <br />&#160;&#160;&#160; Wscript.Echo &quot;Secure Responses: &quot; &amp; objItem.SecureResponses    <br />&#160;&#160;&#160; Wscript.Echo &quot;Send Port: &quot; &amp; objItem.SendPort    <br />&#160;&#160;&#160; If Not IsNull(objItem.ServerAddresses) Then    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; strServerAddress = Join(objItem.ServerAddresses, &quot;,&quot;)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Server Addresses: &quot; &amp; strServerAddress    <br />&#160;&#160;&#160; Else    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Wscript.Echo &quot;Server Addresses:&quot;    <br />&#160;&#160;&#160; End If    <br />&#160;&#160;&#160; Wscript.Echo &quot;Started: &quot; &amp; objItem.Started    <br />&#160;&#160;&#160; Wscript.Echo &quot;Start Mode: &quot; &amp; objItem.StartMode    <br />&#160;&#160;&#160; Wscript.Echo &quot;Strict File Parsing: &quot; &amp; objItem.StrictFileParsing    <br />&#160;&#160;&#160; Wscript.Echo &quot;Update Options: &quot; &amp; objItem.UpdateOptions    <br />&#160;&#160;&#160; Wscript.Echo &quot;Version: &quot; &amp; objItem.Version    <br />&#160;&#160;&#160; Wscript.Echo &quot;Write Authority NS: &quot; &amp; objItem.WriteAuthorityNS    <br />&#160;&#160;&#160; Wscript.Echo &quot;Xfr Connect Timeout: &quot; &amp; objItem.XfrConnectTimeout    <br />&#160;&#160;&#160; Wscript.Echo &quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&quot;    <br />Next </p>
<p>&#160;&#160;&#160; adoRecordset.MoveNext   <br />Loop    <br />adoRecordset.Close</p>
<p>&#160;</p>
<p>Richard merge pe varianta cu Option Explicit de asta exista liniile cu Dim, insa a trebuit sa dezactivez asta pentru ca in bucata mea de cod nu am declarat variabilele. Am lasat si commenturile lui pentru a fi ceva mai inteligibil scriptul.</p>
<p>Daca va intereseaza doar “forwarders” puteti sa da-ti remove la restul liniilor de cod.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winadmin.ro/2009/10/08/get-dns-server-info-via-vbscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
