Alex Angelopoulos (aka at mvps dot org)
Recently moved to this location; please note that some onsite links may be not correctly relocated. Also, during MSDN site updates over the last few months, some of the MSDN reference links have broken; I am working to update these as time allows. - aka 2002.09.12
This was literally lifted from the newsgroups postings almost verbatim in most places. If you wonder why you don't see many attributions, it got difficult to keep track - especially since I would have had to attach Michael Harris' and Torgeir Bakken's names to virtually every entry here.
If you use WSH or even just VBScript/Jscript, the most important download to have is the WSH 5.6 documentation.
Voici la documentation en français.
Clarence Washington's Win32 Scripting site is the best general place to find all things related to scripting.
The Microsoft public newsgroups are the best place to ask questions and find answers:
microsoft.public.scripting.jscript
microsoft.public.scripting.vbscript
microsoft.public.scripting.wsh
Why imitate? an excellent canonical reference is the comp.lang.javascript FAQ
There is no such thing. The reason is that this is a function of whether or not a developer exposes a product to automation. Towards the end of my use of XP Pro RC2 (right before installing the release version) I had about 4500 ProgIDs and CLSIDs.
This was generated by having TLViewer export to IE. Note that this was not a complete list for that system - there were lots of unregistered controls on it - and it won't do you much good since it tells you nothing about the object other than its CLSID and ProgID. It tells you the object's name and address, but nothing about what it does.
Change the extension to .wsf and they will work fine. IIRC, .ws files were in use for an IBM application and Microsoft decided to change the registered extension to prevent possible collisions.
You can use the following 1-line VBScript to tell you:
MsgBox ScriptEngineBuildVersion
From a post by Michael Harris (with amendments suggested by Muhammad Arabi):
Operating System | WSH Version |
Windows 95 | None |
Windows 98 | 1.0 |
Windows Me | 5.5 |
Windows NT 4 | None |
Windows 2000 | 5.1 |
Windows XP | 5.6 |
Here are the versions of WSH and the scripting engines (if different) which are installed with different versions of Internet Explorer. Note that the NT4 option pack includes WSH 1.0 as an option.
Internet Explorer | WSH Version | Script Engines |
4 | ? | ? |
4.01 | ? | ? |
5 | ? | ? |
5.01 | 5.1 | 5.1 |
5.5 | 5.1 | 5.5 |
6 | 5.6 | -- |
WSH 5.6 is not officially supported on Win95 (which itself is no longer supported), but reports are that 5.6 installs/runs OK on Win95 (as do 5.1 and 5.5).
In a WSF file:
<script language="VBScript" src="external.vbs"/>
For reference, http://msdn.microsoft.com/library/en-us/script56/html/wsAdvantagesOfWs.asp
In an HTML file:
<script language="VBScript" src="external.vbs"/></script>
You can also create and register reusable classes in a .WSC file:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/lettitle.asp
Another way - if you do not wish to use the above, you can load and execute a
script as follows:
Sub Include(sInstFile) Dim oFSO, f, s Set oFSO = CreateObject("Scripting.FileSystemObject") Set f = oFSO.OpenTextFile(sInstFile) s = f.ReadAll f.Close ExecuteGlobal s End Sub
It's very likely that some other application you have installed put an older version of scrrun.dll on your system, causing this error. The version in %windir%\system32 should still be the correct one (it's a protected file, so it shouldn't have been overwritten), so you can probably just re-register it and all should be well. Type "regsvr32 scrrun.dll" from any command prompt. The version number on that file should be 5.6.0.6626. (Mike Whalen)
To simply set focus to a window with a particular title, you can use the AppActivate method. Here's an example from the WSH 5.6 documentation.
set oShell = WScript.CreateObject("WScript.Shell") oShell.Run "calc" WScript.Sleep 100 oShell.AppActivate "Calculator"
If you want a little more control - such as waiting on particular windows, etc - try using the Autoit ActiveX control.
Your best bets here all involve WMI, which is a large topic in and of itself (I am leading up into a fancy excuse for not covering it here). See the WMI downloads section if you don't have it installed. Here is a bare bones script which does this. Note that it does not deal with authentication issues, which become important when dealing with remote systems.
For Each obj In GetObject("winmgmts://" & computername & _ "/root/cimv2").ExecQuery("SELECT * FROM Win32_Process") s = s & obj.Description & vbCrLf Next
You may also directly shell out to a console command for this, such as tlist, tasklist, pslist, kill, taskkill, pskill.
See this MSDN reference:
EnumKey Method in Class StdRegProv
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/r_prov_43au.asp
Screen resolution cannot be changed from WSH. Here are some workarounds,
almost entirely taken from Torgeir Bakken's responses on this topic.
Use
Multires (which is free)
http://www.entechtaiwan.com/multires.htm
Here's
a reference to doing it via Java
http://home.istar.ca/~neutron/JDirect/DisplaySettings/
It should also be possible to do this using the ChangeDisplaySettings API, but
you would need to write a component to access it.
Win9x
clients running the QuickRes powertoy can run a shell command like this:
RunDLL
deskcp16.dll,QUICKRES_RUNDLLENTRY 1280x1024x24
FINDING
the screen resolution is possible, albeit not "natively" - here's a
quick script that will give you current screen resolution via Internet Explorer:
with createobject("internetexplorer.application") .navigate "about:blank" with .document.parentWindow.screen msgbox .width & " by " & .height end with end with
Wallpaper can be modified in the registry; unfortunately, changes don't take
place until you refresh, either by logoff/logon or by manually refreshing the
desktop.
The relevant registry key is HKCU\Control
Panel\Desktop\Wallpaper. To see an example script of copying wallpaper and
changing it, see:
http://groups.google.com/groups?selm=uFMs1Zq1AHA.2092%40tkmsftngp05
There are some canned procedures for doing this available from
http://www.wshscripting.com
and
http://cwashington.netreach.net
A canned example script:
set shell = CreateObject("wscript.shell") set sysEnv = shell.Environment("SYSTEM") '==> creates it... SysEnv("mySysVar") = "whatever" '==> retrieves it... foo = SysEnv("mySysVar") msgbox foo '==> removes it... SysEnv.Remove("mySysVar")
You can READ the environment using the standard WshEnvironment (see the documentation). Note that the Win9x environment is SIGNIFICANTLY different from NT/2K/XP.
The actual OS function to call varies depending on the operating system AND rev
level - for example, even RUNDLL calls usable on Win95 and WIn98 are different
from each other.
Here are some possible "general"
solutions. Note that for dealing with system control tasks your bets bet is
almost always to use WMI. WMI should be pre-installed if you have Windows
2000/XP or Windows Me. If you have NT4 or Win9x you can get it from the links at
the end of the FAQ.
If you have WMI installed:
Set OpSysSet = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true") for each OpSys in OpSysSet OpSys.Reboot() next
Also try looking at the Shutdown page:
http://www.robvanderwoude.com/shutdown.html
The simplest method if on NT/Win2K/XP is to create a "Volatile" environment
variable. Volatile variables last throughout the logon session. Here's an
example:
SetVar_Volatile "myvar","value_of_variable"
Sub SetVar_Volatile(VarName,VarValue)
set shell = createobject("wscript.shell")
set envVolatile = shell.environment("volatile")
envVolatile(VarName) = VarValue
End Sub
On Win9x, only "Process" variables are available to WSH, so you need to look
elsewhere for a tool to do this. Your best option is the "winset" utility,
which is available on all the Win9x CD media as an extra tool. You would have
to use wscript.shell's Run method and run Winset with the appropriate options in
that case.
This is one of the mainstay topics of CS courses. Even if you have not taken a CS class, this means that if you are any good at translating algorithms into code, you can find dozens of examples in textbooks and in every numerical recipes book available, optimized for all sorts of situations. If you aren't good at sight-reading algorithms, keep reading....
You can sort array elements in Jscript using the sort method - see the
docs.
Here's an example taken from there.
function SortDemo(){ var a, l; //Declare variables. a = new Array("X" ,"y" ,"d", "Z", "v","m","r"); l = a.sort(); //Sort the array. return(l); //Return sorted array. }
Note that this function does a lexicographical comparison as Michael Harris has noted - so numbers will be sorted as 1,11,12...19,2,20,21.. Here's a comparison function you can use for this case:
var a = new Array(); for (var i = 0; i < 15; i++) a[i] = Math.floor(Math.random() * 100); alert(a); a.sort(function (x, y) { return x - y; }); alert(a)
Here's a VBScript subroutine that looks for files in a folder with a given extension, using the GetExtensionName method:
sub modCopyNewIniFiles set objNewIniFolder = objFileSystem.GetFolder(strNewIniFolder) set objIniFileSet = objNewIniFolder.Files for each objFile in objIniFileSet if (lcase(objFileSystem.GetExtensionName(objFile.name)) = "ini") Then objFileSystem.CopyFile objFile.path,strMircFolder & Chr(92) end if Next end sub 'modCopyNewIniFiles
Here's a code snippet using VBScript; for full details, look in the documentation for the Run and Exec methods.
set objShell=CreateObject("Wscript.Shell") objShell.Run("notepad")
Note that you will usually have to specify the full path to the program; in Jscript you will need to escape "\" characters (so "C:\apps\myapp.exe" becomes "C:\\apps\myapp.exe"); and whatever scripting host you use, the outside " marks are stripped as they are passed to the shell, so you will need to embed " marks to correctly handle paths with spaces in them.
Again, see the docs; look for "SendKeys".
Set objShell = WScript.CreateObject("WScript.Shell") objShell.AppActivate "Notepad" objShell.SendKeys "Hello.{ENTER}How are you?"
See the links at the bottom. Please remember they can get stale, though.
Ask 5 people and you will get 6 answers. Here is a by no means complete
list.
Notepad - came with your OS. Enough said.
TextPad - nice, simple, but very functional and highly configurable.
HTML-Kit - very new and very nice. Still in beta, but a highly configurable editor
PrimalScript - pricey, but so is a Ferrari
MSE - part of Visual Studio
The VBA editor that ships with Office (access using Alt+F11 within Office applications)
Check the WSH Community on MSN in the links section; Ian has a lengthy list of these.
Also see Mark Pryor's suggestions on his web page About Script Editors.
The simplest method is to use WMI. Here's an example:
Set CompSysSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_ComputerSystem") For each CompSys in CompSysSet CompSys.SystemStartupDelay = 20 CompSys.Put_() Next WScript.Echo "Boot up delay time set"
Here's an example from Branimir Petrovic, showing how to use blat to do this. Blat is the tool for command line email needs, and a simple way to send email using WSH. It's actually a procedure for checking machine uptime, and coincidentally shows correct usage for blat. This example is a pure batch file and can be wrapped within WSH or called externally as a batch file.
:: Do yourself a favor - do it the simple way! :: :: Get blat.exe (command line mail utility) from: :: http://www.interlog.com/%7Etcharron/blat.html :: :: Copy both blat.exe and uptime.exe to your path :: (WinNT directory), save this as Uptime.bat, change :: values to fit your environment, and run it. :: :: --- Make a list of IPs you want to check set IP1 = "192.168.0.1" set IP2 = "192.168.0.2" set IP2 = "192.168.0.3" :: --- Next block is self-explanatory set MAILTO = "me@my.dom" set REPLYTO = "alterego@my.dom" set SUBJECT = "You've got mail..." set BODY = "C:\Uptime.log" :: --- Set IP or host name of your SMTP server set SMTP = 123.2.3.4 :: --- Check Uptimes Uptime %IP1% > C:\Uptime.log Uptime %IP2% >> C:\Uptime.log Uptime %IP3% >> C:\Uptime.log :: --- Send yourself mail (list of uptimes for choosen hosts) blat %BODY% -to %MAILTO% -subject %SUBJECT% -attach %BODY% -server %SMTP% -f %REPLYTO%
This is an historic issue with WSH. You have 2 solutions:
(1)
Upgrade to latest version of WSH
(2) Manually create a DWORD value
named "JITDebug" and set it to 1 under the following registry key:
HKEY_CURRENT_USER\Software\Microsoft\Windows
Script\Settings
Note that in order to run the debugger you need to specify it on the command line. If you want to execute the script in the debugger, add the "//X" option to the command line for cscript or wscript - like
wscript //x myscript.vbs
This is done simply by adding the instruction
<? debug="false">
You can, but they are returned as an array (after all, they are more multiple values). You will need to explicitly iterate over the array returned in order to read the values.
Reportedly, yes. It is not supported, but that's becuase Win95 is not supported by Microsoft either (a matter which is really of concern to you only if you are a direct channel purchaser).
If you don't already have it, you may need to install the latest DCOM for Win95 first - it is available from
http://www.microsoft.com/com/dcom/dcom95/dcom1_3.asp (2002.02.02)
See the Microsoft online documentation:
If you don't have it installed (and possibly selected "Never ask me again" when prompted to install it in the past), you can download it from the following location:
http://www.microsoft.com/java/vm/dl_vm40.htm
Here's a solution: Attachment Long File Name Truncates to 8.3 Format
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q260294
Product | Checkfile | Win2K Version | Current(2002.02.21) |
WSH | wscript.exe | 5.1.0.4615 | 5.6.0.6626 |
ADSI | adsnt.dll | 5.0.2195.2778 (aka ADSI 2.5) |
5.1.2600.0 |
WMI | wbemcore.dll | 1.5.0.1085.36 (aka WMI 1.5) |
5.1.2600.0 |
You can find a semi-up-to-date list of various file versions for WSH by following the hyperlink.
ActiveX controls have never worked natively in Netscape. With the disappearance of NCompass Labs, the key aftermarket integration for this has disappeared from the scene.
However, there are a few products which claim to work for interoperability using various mechanisms. We can't attest to how well (or even how) they work, but here are a couple which we have recently encountered.
Asgard Plugin Wizard Version 2 from Asgard software.
Fobs Systems also makes a Netscape plugin which we could not find on their website, but which is available on Winsite, called simply FOBS ActiveX Plugin 1.2. If the plugin has moved, we suggest searching Winsite directly.
As an interesting note - Mozilla IS an ActiveX object. In other words, you can control it externally once you have it installed on your system, through use of the "Mozilla.Application" ProgID. In a rather ironic twist, though, it cannot self-host. It must be displayed within a form of some kind, such as a VB or VBA form... or Internet Explorer.
To see an example of this in action, check out the Rube Goldberg Memorial Scripting page.
(This is an at-length conceptual answer from Michael Harris)
When you read the help on the various objects, properties, methods, etc. you
have to keep in mind that it's for VBA, not VBScript. VBA is hosted "from the
inside" by the specific application. As the host, it automatically provides
things to the VBA code that aren't automatic when you automate an application's
object model "from the outside" using VBScript hosted by WSH.
The key items to remember:
--- No objects are automatically exposed to VBScript. You generally use an
explicit CreateObject to get an instance of an object to use as the "root",
usually the ".Application" object.
--- In VBA that Application object and it's immediate interface members
(properties/methods) are automatically exposed. In VBScript you refer to the
Application object and it's properties/methods through the object variable
reference returned by the CreateObject.
--- Named constants specific to the application aren't exposed. You can either
look them up and code them locally in the VBScript code as Const variables, or
you can use the .wsf file format and a element to automatically expose them.
--- VBA supports named argument syntax (e.g., ArgName:="argvalue") in method
calls. In WSH hosted VBScript, you have to code all arguments as positional
arguments since named argument syntax is not supported.
Once you understand the "VBA from the inside" vs. "VBScript from the outside"
issues and the fundamental differences between VBA and VBScript as separate but
similar languages, you should be able to mentally "port" VBA and even full VB
examples to VBScript.
Upgrading to at least Internet Explorer 5.5 should provide you with the functionality you need to open the Compiled HTML Help.
"That error message generally means you either don't have read permissions for
HKLM\Software\Microsoft\Windows Script Host\Settings or the equivalent key in
HKCU. You need to be able to read both of those to run WSH."
-Mike Whalen
Windows Script Dev
taken from:
http://msdn.microsoft.com/library/en-us/wmisdk/us_cmdln_9fnc.asp
The Windows Management service starts automatically on computers running Microsoft® Windows NT®/Microsoft® Windows® 2000, but not on computers running Windows 95/98. To set up the Windows Management service to start automatically on a Windows 95/98 system, you must make the following changes to the operating system registry.
HKLM\SOFTWARE\Microsoft\wbem\cimom - AutostartWin9X
Value | Meaning |
---|---|
"0" | Manual
Use this setting when you do not need the service running continuously. When a local request comes in, WMI starts to service the request. If you later restart the computer, the computer will start in manual mode (WMI will not start automatically). Note that remote startup requests are only supported on Windows NT/Windows 2000. Remote startup requests are not supported by COM on Windows 95/98. |
"1" | Automatic if the computer system needs to reload
Use this setting if you would normally have active event consumers. If WMI has active event consumers and the system (any system that supports WMI) needs to be restarted, WMI starts automatically after the system starts. |
"2" | Automatic
Windows Management service always starts automatically. |
When you make a post asking for assistance with a specific error, the following information is crucial to help you get an answer quickly. I have forgotten to provide some of these when posting questions myself, and all too often what could have been a 3-minute answer turns into a 5-day email exchange that wastes time for everyone - especially the poster.
(1) Tell us what version OS, WSH, and Internet Explorer you are using. If you aren't certain about the WSH version, you can simply check the version of wscript.exe as a good guess.
(2) An error can be most easily tracked down by mentioning the exact error and showing the line on which it occured (even if you post the code, line breaks can make it hard to tell which line is which.
(3) Try posting the code if it is of reasonable length - if you can automatically insert line numbers, that is even better.
(4) Read Section 2: Posting Suggestions
First, here is what MVPs are not: MVPs are not Microsoft employees; they are merely people who have historically been such a significant, dedicated help to posters in a forum that they have been singled out for special recognition by Microsoft.
The downside of this is that they are not required to answer your questions and
may not necessarily know everything about a topic. The upside is that they
are quite often excellent communicators and subject matter experts, working from
a love for what they do.
Please do NOT forget that they are
typically doing this in their spare time and out of some insane internal urge to
look at problems belonging to other people. Try to be appreciative of your
fellow posters, and remember that more often than not they are also working hard
at daytime jobs where they often have their own problems to resolve.
We're glad you asked that. Before we tell you, you should know that just like any other form of communication, good newsgroup posting technique is something you learn - not something you know naturally. So don't take it personally if someone takes exception to how you post. Just correct it if it is truly a communication issue.
NEVER multi-post (separate IDENTICAL posts to different NGs or the same NG at different
times) and ONLY cross-post (addressing a single post to more than 1 group at a
time) to relevant groups. If you hit "send" more than once, you
are multi-posting, and that should never happen.
The reason to
stick to crossposting when necessary is that the answers will all be threaded
together, making results easily accessible by you and all respondents.
In
any case, if you look at responses you will quickly note that any given group of
the NGs are usually ALL examined by certain people - so they will likely see a
single post and if appropriate they often reply including other appropriate NGs
so question circulation widens.
"It doesn't work!" is not very informative, although it may be the only thing that comes to mind at 2 AM. "Wscript.CreateObject("my.ProgID") fails with WSH 5.6" IS informative.
If you get an error in a script, post at least the error code, the relevant lines of code, and anything special about circumstances (scripting engine version, OS, etc.). You may even want to include the entire code in the body. Note that it is best to put the code BELOW your question - it makes it easy to see a summary.
There are reasons to include attachments - that's why they are allowed.
Keep the following points in mind though.
+Filetypes such as
scripts and HTAs are typically deleted as a matter of course by email gateways,
even embedded in zip files. Rename scripts and such files to something
ending in .TXT with a note about the necessary extension.
+Remember
that many people have low speed connections and typically are forced to cache
downloads by default news client settings. Large or frequent un-needed
attachments can annoy some people. If an attachment is over about 4-8KiB in
size, you probably want to make it into a ZIP or CAB file (a rule I broke in my
last post)
If something works, let the responders know; if it has problems, note that also in your answer. When you finalize, say "thank you". Also, if you have done any research work in the process leading you to obscure sites or a unique solution, it would be nice if you posted links
Never "top-post" (setting your date ahead of current real-world date to post). This is a fast way to get your query to the top of the list where it will get repeated "Don't top-post, numbskull!" responses until its cancellation by the news server.
On a related note, the top cause of accidental crossposts seems to be checking a date via the taskbar clock - be careful if you ever do this, it can also have other significant drawbacks.
no native forums, code can be debugged anyway, many of top posters are extranationals
not an issue with OE usually. Note size limits on posts. Also causes issues with Google archiving
Use the test forums
Consider adding line numbers. Warn people about wrap. also may break down VBScript code lines with a &_ continuation.
Microsoft XML Core Services 4.0 RTM
MS OLE COM object viewer (oleview.exe)
WSH 5.6 - all versions
http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/MSDN-FILES/027/001/733/msdncompositedoc.xml
WMI For Win9x
http://download.microsoft.com/download/platformsdk/wmi9x/1.5/W9X/EN-US/wmi9x.exe
MS-DHTML Reference (these are huge - total about 20 MB or so)
ftp://ftp.microsoft.com/developr/platformsdk/feb2001/common/help/inet.chm
ftp://ftp.microsoft.com/developr/platformsdk/feb2001/common/help/inet.chi
System Administration Scripting Guide
http://www.microsoft.com/downloads/release.asp?ReleaseID=38942&area=search&ordinal=2
For ActivePerl and ActivePython
http://www.activestate.com
AutoItX
(the AutoItX control enhances the abilities of WSH to work with windows and
sendkeys)
http://www.hiddensoft.com/AutoIt/index2.html
ScriptX
http://www.meadroid.com/scriptx
Lotus Notes Automation
http://www.notes.net/46dom.nsf
http://doc.notes.net/uafiles.nsf/docs/com10/$File/comdoc.chm
Type Library Documentor
ActiveX Diagnostics
http://www.codestone.co.uk/home.html
TLViewer:
http://mysite.verizon.net/res1ur2j/tlviewer.htm
ActiveX Documentor
http://vbaccelerator.com/codelib/actvxdoc/article.htm
KeyInfo (Gives keycode for any standard key pressed)
http://dnsoft.hypermart.net/ki/
(mostly stolen wholesale from Mike Harris' 2001.03.15 post to microsoft.public.scripting.vbscript)
The comp.lang.javascript FAQ
http://jibbering.com/faq/
Win32
Scripting [Clarence Washington]
http://cwashington.netreach.net
(script search form at bottom of page)
Windows-Script
[Ian Morrish]
http://communities.msn.com/windowsscript
WSH
Utilities and Scripts Home Page [Jim Warrington]
http://home.att.net/~wshvbs/index.htm
WSH
Scripting [Mark Pryor]
http://home.sprintmail.com/~mpryor/
Bruce's
Reference Center
http://www.geocities.com/waltonob/
Windows
Script Host Samples [Mitch Gallant]
(using java: moniker)
http://home.istar.ca/~neutron/wsh/
SWYNK.COM:
Windows Script Library on SWYNK
http://www.swynk.com/winscript/
AshleyIT
Remote Scripting
http://www.ashleyit.com/rs/
Technology
(FAQs)
http://www.able-consulting.com/tech.htm
W3Schools
http://www.w3schools.com/
Dev
Guru - A Developer's Resource
http://www.devguru.com/
This is a by-no-means-complete list.
Language | OEM or Source | Cost | Remarks |
VBScript, Jscript | Microsoft | Comes with WSH | Standard - if you have WSH, you have these. |
Object REXX | IBM | Purchase from IBM | |
Haskellscript | Open Source | Open Source | |
Mondrian | Open Source | Open Source | for .NET only AFAIK |
Perl | ActiveState | Open Source | |
Python | ActiveState | Open Source | |
Pscript | MKS | Purchase from MKS | |
Ruby | Open Source | Open Source | This is a "modified" Ruby for COM integration. |
ActiveBatch | Advanced Systems Concepts | Purchase from Advanced Systems Concepts | |
Nullscript | Open Source | Open Source | "The scripting language about nothing."...really, it is. |
MSDN Active Directory, ADSI and Directory Services
http://msdn.microsoft.com/nhp/default.asp?contentid=28000413
Active
Directory Service Interfaces Overview
http://www.microsoft.com/windows2000/techinfo/howitworks/activedirectory/adsilinks.asp
Apostate
Café: Windows Scripting Host / ADSI Cookbook:
http://www.apostate.com/programming/wsh-adsi.html
ADSI
FAQ with examples at Clarence Washington's Scripting site:
http://cwashington.netreach.net/main_site/default.asp?topic=library
The Windows 2000 DDK
http://www.microsoft.com/ddk/W2kDDK.asp
Persistent Object Interfaces
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netdir/adsi/active_directory_service_interfaces_adsi.asp
Q165967 - PRB: Script Error Occurs When Referencing Non-variant Array
http://support.microsoft.com/support/kb/articles/Q165/9/67.ASP
Q250344 - SAMPLE: ARRAYCONVERT.EXE Variant Conversion Functions
http://support.microsoft.com/support/kb/articles/Q250/3/44.ASP
Q239470 - PRB: Cannot Call GetObject from Script in IE to Access Running
Object
http://support.microsoft.com/support/kb/articles/Q239/4/70.ASP