<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Notes From The Field : Scripting</title><link>http://blogs.technet.com/notesfromthefield/archive/tags/Scripting/default.aspx</link><description>Tags: Scripting</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Some Easy Active Directory Scripting</title><link>http://blogs.technet.com/notesfromthefield/archive/2008/08/26/some-easy-active-directory-scripting.aspx</link><pubDate>Tue, 26 Aug 2008 21:28:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3112326</guid><dc:creator>jdphilli</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/notesfromthefield/comments/3112326.aspx</comments><wfw:commentRss>http://blogs.technet.com/notesfromthefield/commentrss.aspx?PostID=3112326</wfw:commentRss><description>&lt;p&gt;I solved a little problem for a customer the other day and I thought I'd share a little about it with you. It involves some VBScript user manipulation in Active Directory, and yes: there will be a code sample.&lt;/p&gt;  &lt;p&gt;Let's start with the problem. For whatever reason, some users were missing some home drive information and more than half of users were not configured for roaming profiles. It was determined that this should be corrected. An easy way, of course, would be to push a group policy out which would configure something like: &lt;a href="file://servername/home/%25username%25" mce_href="file://servername/home/%25username%25"&gt;\\servername\home\%username%&lt;/a&gt; for home directory paths and &lt;a href="file://servername/profile/%25username%25" mce_href="file://servername/profile/%25username%25"&gt;\\servername\profile\%username%&lt;/a&gt; for profile paths. Well, that would have been easy if that's what the customer wanted to do, but it wasn't. Instead, they have set up a rather nice DFS root share for home drives and profile paths broken down by, lets say, users' last names. Sample paths for this would be &lt;a href="file://\\dfsroot.com\home\%x\%username%" mce_href="file://dfsroot/home/%25x/%25username%25"&gt;\\dfsroot.com\home\%x\%username%&lt;/a&gt; where %x is the user's first initial of the last name. This wouldn't be so easy with a group policy. So for this, I wrote some code.&lt;/p&gt;  &lt;p&gt;What I did was obtain a list of users who needed these properties set in display name format. This was done by extracting user information with CSVDE. The result would look something like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier"&gt;Smith, Bob       &lt;br /&gt;Johnson, William K.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Once I had this file (named &lt;strong&gt;&lt;font face="courir"&gt;users.txt&lt;/font&gt;&lt;/strong&gt;), I could run my script&lt;/p&gt;  &lt;p&gt;If you'll notice, in this particular instance, the display name is &lt;strong&gt;Last, First&lt;/strong&gt;. Many corporations configure their GAL this way, and I can understand why, although at Microsoft we use the reverse order of &lt;strong&gt;First Last&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;What the script does is open a log file for writing, open the &lt;font face="Courier"&gt;&lt;strong&gt;users.txt&lt;/strong&gt;&lt;/font&gt; file for reading&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;font size="1"&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; ForWriting = 2
&lt;span class="kwrd"&gt;Const&lt;/span&gt; ForReading = 1

&lt;span class="rem"&gt;'Path for log&lt;/span&gt;
logfilepath = &lt;span class="str"&gt;&amp;quot;C:\TEMP\log.txt&amp;quot;&lt;/span&gt;

&lt;span class="rem"&gt;'Path for user list&lt;/span&gt;
userfilepath = &lt;span class="str"&gt;&amp;quot;C:\TEMP\users.txt&amp;quot;&lt;/span&gt;

&lt;span class="rem"&gt;'Base Paths&lt;/span&gt;
baseHomePath = \\dfsroot.com\home\baseProfilePath = \\dfsroot.com\profile\

&lt;span class="rem"&gt;'Setup input file&lt;/span&gt;
&lt;span class="kwrd"&gt;Set&lt;/span&gt; objFSO = CreateObject(&lt;span class="str"&gt;&amp;quot;Scripting.FileSystemObject&amp;quot;&lt;/span&gt;)
&lt;span class="kwrd"&gt;Set&lt;/span&gt; objInputFile = objFSO.OpenTextFile(userfilepath, ForReading, &lt;span class="kwrd"&gt;True&lt;/span&gt;)

&lt;span class="rem"&gt;'Setup log file&lt;/span&gt;
&lt;span class="kwrd"&gt;Set&lt;/span&gt; objFSO = CreateObject(&lt;span class="str"&gt;&amp;quot;Scripting.FileSystemObject&amp;quot;&lt;/span&gt;)
&lt;span class="kwrd"&gt;Set&lt;/span&gt; objAdLogTextFile = objFSO.OpenTextFile(logfilepath, ForWriting, &lt;span class="kwrd"&gt;True&lt;/span&gt;)

&lt;span class="rem"&gt;'Create Objects for LDAP Queries&lt;/span&gt;
&lt;span class="kwrd"&gt;Set&lt;/span&gt; rootDSE = GetObject(&lt;span class="str"&gt;&amp;quot;LDAP://RootDSE&amp;quot;&lt;/span&gt;)
DomainContainer = rootDSE.&lt;span class="kwrd"&gt;Get&lt;/span&gt;(&lt;span class="str"&gt;&amp;quot;defaultNamingContext&amp;quot;&lt;/span&gt;)

&lt;span class="kwrd"&gt;Set&lt;/span&gt; conn = CreateObject(&lt;span class="str"&gt;&amp;quot;ADODB.Connection&amp;quot;&lt;/span&gt;)
conn.Provider = &lt;span class="str"&gt;&amp;quot;ADSDSOObject&amp;quot;&lt;/span&gt;
conn.Open &lt;span class="str"&gt;&amp;quot;ADs Provider&amp;quot;&lt;/span&gt;

&lt;span class="rem"&gt;'Read in username from input file&lt;/span&gt;
&lt;span class="kwrd"&gt;Do&lt;/span&gt; &lt;span class="kwrd"&gt;Until&lt;/span&gt; objInputFile.AtEndOfStream

  strDisplayName = objInputFile.Readline

  &lt;span class="rem"&gt;'Find all users in AD using an LDAP query&lt;/span&gt;
  strLDAP = &lt;span class="str"&gt;&amp;quot;&amp;lt;LDAP://&amp;quot;&lt;/span&gt; &amp;amp; DomainContainer &amp;amp; &lt;span class="str"&gt;&amp;quot;&amp;gt;;(&amp;amp;(objectCategory=person)(objectClass=user)_&lt;br /&gt;      (anr=&amp;quot;&lt;/span&gt; &amp;amp; strDisplayName &amp;amp; &lt;span class="str"&gt;&amp;quot;*));adspath;subtree&amp;quot;&lt;/span&gt;

  &lt;span class="rem"&gt;'Get query results and output to file&lt;/span&gt;
  &lt;span class="kwrd"&gt;Set&lt;/span&gt; oComm = CreateObject(&lt;span class="str"&gt;&amp;quot;ADODB.Command&amp;quot;&lt;/span&gt;)
  oComm.ActiveConnection = conn
  oComm.CommandText = strLDAP
  oComm.Properties(&lt;span class="str"&gt;&amp;quot;Sort on&amp;quot;&lt;/span&gt;) = &lt;span class="str"&gt;&amp;quot;displayName&amp;quot;&lt;/span&gt; 
  oComm.Properties(&lt;span class="str"&gt;&amp;quot;Page size&amp;quot;&lt;/span&gt;) = 15000

  &lt;span class="kwrd"&gt;set&lt;/span&gt; rs = oComm.Execute
 
  &lt;span class="kwrd"&gt;If&lt;/span&gt; rs.recordcount = 0 &lt;span class="kwrd"&gt;then&lt;/span&gt; 
        QueryResult = &lt;span class="str"&gt;&amp;quot;User not found&amp;quot;&lt;/span&gt; 
        objAdLogTextFile.WriteLine(FoundObject.Displayname &amp;amp; &lt;span class="str"&gt;&amp;quot; | &amp;quot;&lt;/span&gt; &amp;amp; QueryResult)  
  &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt; 

  &lt;span class="kwrd"&gt;If&lt;/span&gt; rs.recordcount &amp;gt; 1 &lt;span class="kwrd"&gt;then&lt;/span&gt; 
        QueryResult = &lt;span class="str"&gt;&amp;quot;Resolved to more than one name&amp;quot;&lt;/span&gt; 
        objAdLogTextFile.WriteLine(FoundObject.Displayname &amp;amp; &lt;span class="str"&gt;&amp;quot; | &amp;quot;&lt;/span&gt; &amp;amp; QueryResult) 
  &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt; 

  &lt;span class="kwrd"&gt;If&lt;/span&gt; rs.recordcount = 1 &lt;span class="kwrd"&gt;then&lt;/span&gt; 
    &lt;span class="kwrd"&gt;While&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; rs.EOF
      &lt;span class="kwrd"&gt;Set&lt;/span&gt; FoundObject = GetObject (rs.Fields(0).Value)
      fullProfilePath = baseProfilePath &amp;amp; left(FoundObject.displayName,1) &amp;amp; &lt;span class="str"&gt;&amp;quot;\&amp;quot;&lt;/span&gt; &amp;amp;_&lt;br /&gt;          FoundObject.sAMAccountName
      fullHomePath = baseHomePath &amp;amp; left(FoundObject.displayName,1) &amp;amp; &lt;span class="str"&gt;&amp;quot;\&amp;quot;&lt;/span&gt; &amp;amp;_&lt;br /&gt;          FoundObject.sAMAccountName
      objAdLogTextFile.WriteLine(FoundObject.Displayname &amp;amp; &lt;span class="str"&gt;&amp;quot; | &amp;quot;&lt;/span&gt; &amp;amp; fullHomePath &amp;amp;_&lt;br /&gt;          &lt;span class="str"&gt;&amp;quot; | &amp;quot;&lt;/span&gt; &amp;amp; fullProfilePath)
      FoundObject.profilePath = fullProfilePath
      FoundObject.homeDirectory = fullHomePath
      FoundObject.homeDrive = &lt;span class="str"&gt;&amp;quot;H:&amp;quot;&lt;/span&gt;
      FoundObject.SetInfo
      rs.MoveNext
    &lt;span class="kwrd"&gt;Wend&lt;/span&gt;
  &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;
&lt;span class="kwrd"&gt;Loop&lt;/span&gt;
 
MsgBox &lt;span class="str"&gt;&amp;quot;Processing complete!&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;This code helped me to set the baseline for existing users. New would then need to be created with the proper home drive and profile path. A good way to automate this is with something like ILM to provision user accounts. ILM is good for quite a lot of things and maybe one day, I'll have some tidbits to post about it.&lt;/p&gt;

&lt;p&gt;Until next time, I hope this sample will help you get started on your own scripts for your directory.&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3112326" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/notesfromthefield/archive/tags/Scripting/default.aspx">Scripting</category><category domain="http://blogs.technet.com/notesfromthefield/archive/tags/VBScript/default.aspx">VBScript</category><category domain="http://blogs.technet.com/notesfromthefield/archive/tags/Active+Directory/default.aspx">Active Directory</category></item><item><title>Wscript.Network</title><link>http://blogs.technet.com/notesfromthefield/archive/2008/02/26/wscript-network.aspx</link><pubDate>Tue, 26 Feb 2008 09:13:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:2931999</guid><dc:creator>jdphilli</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/notesfromthefield/comments/2931999.aspx</comments><wfw:commentRss>http://blogs.technet.com/notesfromthefield/commentrss.aspx?PostID=2931999</wfw:commentRss><description>&lt;p&gt;One of my favorite objects is the Wscript.Network object. It's a very simple way to access certain environment variables in a VBScript.&lt;/p&gt;  &lt;p&gt;To invoke this object, this line must be inserted near the top of your script (certainly before you reference properties of this object):&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; WshNetwork = CreateObject(&lt;span class="str"&gt;&amp;quot;Wscript.Network&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
  &lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/blockquote&gt;

&lt;p&gt;What you can do with this is query the properties of username, computername and userdomain. You can also do things like add a network drive and add a printer (as well as deleting them). This is great for a much more flexible login script processing than standard batch.&lt;/p&gt;

&lt;p&gt;For example, if you want to map a drive: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;WshNetwork.MapNetworkDrive &lt;span class="str"&gt;&amp;quot;x:&amp;quot;&lt;/span&gt; \\SERVERNAME\SHARE&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;maps a drive, and the commands to add a printer and make it the default are:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;WshNetwork.AddWindowsPrinterConnection &lt;span class="str"&gt;\\printserv\DefaultPrinter&lt;br /&gt;&lt;/span&gt;WshNetwork.SetDefaultPrinter \\printserv\DefaultPrinter&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;These code snippets apply to Windows 2000 and higher - other parameters may be necessary for earlier systems. &lt;/p&gt;

&lt;p&gt;A complete technical description of this object can be found here: &lt;a title="http://msdn2.microsoft.com/en-us/library/s6wt333f(vs.85).aspx" href="http://msdn2.microsoft.com/en-us/library/s6wt333f(vs.85).aspx" mce_href="http://msdn2.microsoft.com/en-us/library/s6wt333f(vs.85).aspx"&gt;http://msdn2.microsoft.com/en-us/library/s6wt333f(vs.85).aspx&lt;/a&gt;, but here is a listing of the properties and methods:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Properties&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;UserName - this is obviously the username variable, likely the SAM Account Name (the pre-Windows 2000 name) &lt;/li&gt;

  &lt;li&gt;UserDomain - this is the NetBIOS domain name &lt;/li&gt;

  &lt;li&gt;ComputerName - this is the NetBIOS computer name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Methods&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;AddWindowsPrinterConnection - this is the command to add a printer in Windows 2000 and higher &lt;/li&gt;

  &lt;li&gt;AddPrinterConnection - this is the command to add a printer in older systems &lt;/li&gt;

  &lt;li&gt;EnumNetworkDrives - this command lists the mapped drives on the computer &lt;/li&gt;

  &lt;li&gt;EnumPrinterConnections - this command lists the installed printers &lt;/li&gt;

  &lt;li&gt;MapNetworkDrive - this command maps a network drive &lt;/li&gt;

  &lt;li&gt;RemoveNetworkDrive - this command removes a network drive &lt;/li&gt;

  &lt;li&gt;RemovePrinterConnection - this command removes a printer connection &lt;/li&gt;

  &lt;li&gt;SetDefaultPrinter - this command sets the default printer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this is helpful for you. Let me know!&lt;/p&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=2931999" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/notesfromthefield/archive/tags/Scripting/default.aspx">Scripting</category><category domain="http://blogs.technet.com/notesfromthefield/archive/tags/VBScript/default.aspx">VBScript</category></item></channel></rss>