[THIN] Script to fix Office - TypeLib - Registry Entries

  • From: "Parker, Dennis" <Dennis.Parker@xxxxxxxxxx>
  • To: "thin@xxxxxxxxxxxxx" <thin@xxxxxxxxxxxxx>
  • Date: Fri, 31 Jan 2003 11:48:10 -0600

Perhaps some of you remember a post a while back about Q248658:  OFF2000: 
Windows Hangs When You Log on to a Terminal Server Computer.  (See end of the 
post for the full Q article if interested).  Basically, it says that the 
registry will grow because of the way Terminal servers handle temp directories. 
 For anybody that's interested (I did a search of the forums and hadn't seen 
anything like this, but perhaps I missed it somewhere by not searching 
properly) I modified a couple of scripts on the Internet and made one that will 
search through the \HKEY_CLASSES_ROOT\TypeLib registry entries for MSForms.EXD 
and remove the entries from the registry.  Seemed like a much easier solution 
than the Microsoft solutions.

The script requires RegObj.DLL from Microsoft, which can be obtained here:  
http://msdn.microsoft.com/vbasic/downloads/addins/default.asp

The script works best using CSCRIPT.EXE because of the use of WSCRIPT.ECHO, 
which could be commented out of course.  Also, I commented out the single line 
that actually does the removal of the registry key, so it isn't destructive by 
default.

I have successfully run this on my Terminal Servers (NT 4.0) here with out 
issue, but of course I make no warranty that this will work in your shop.  Use 
at your own risk. 

I hope that someone out there finds it useful.  Of course I don't mind if it 
gets posted to thethin.net either.

'---copy between the lines and paste into your favorite text editor and save as 
a .vbs file---
'--------------------------------------------------------------------------------------------

Option Explicit

'This works best with CSCRIPT.EXE

Dim strRet 
Dim Temp, TempSplit
Dim strLIBS(), strLIBScount
Dim i, strComputer

strLIBScount = -1
strComputer = "your terminal server name here"

WScript.Echo enumerateSubKeys("\HKEY_CLASSES_ROOT\TypeLib", strComputer)

WScript.Echo "-------------"
For i = 0 To UBound(strLIBS)
        WScript.Echo strLIBS(i)
Next
WScript.Echo "-------------"

For i = 0 To UBound(strLIBS)
        Temp = deleteKey(strLIBS(i), strComputer)
Next

Function enumerateValues(strKey, strComputerName)
'
' strKey is the name of registry key to enumerate
' strComputerName is the computer from which registry is used
'
    Dim objRegObj
    Dim objRootKey

    Set objRegObj = WScript.CreateObject("RegObj.Registry")
    'Choose the Registry Hive
    If strComputerName = "" Then
        Set objRootKey = objRegObj.RegKeyFromString(strKey)
    Else
        Dim objRemoteRegistry
        
        Set objRemoteRegistry = objRegObj.RemoteRegistry(strComputerName)
        Set objRootKey = objRemoteRegistry.RegKeyFromString(strKey)
    End If

    Dim oValue
    

    For Each oValue In objRootKey.Values
        If InStr(oValue.Value, "MSForms.EXD") Then
                strLIBScount = strLIBScount + 1
                ReDim Preserve strLIBS(strLIBScount)
                        TempSplit = Split(strKey, "\")
                        strLIBS(strLIBScount) = "\" & TempSplit(1) & "\" & 
TempSplit(2) & "\" & TempSplit(3)
                        strRet = strRet & TempSplit(3) & " " & oValue.Value & 
vbCrLf
                        
        End If
    Next

   
     enumerateValues = strRet

End Function

Function enumerateSubKeys(strKey, strComputerName)
'
' strKey is the name of registry key to enumerate
' strComputerName is the computer from which registry is used
'
     Dim objRegObj
     Dim objRootKey
        
     Set objRegObj = WScript.CreateObject("RegObj.Registry")
    'Choose the Registry Hive
    If strComputerName = "" Then
        Set objRootKey = objRegObj.RegKeyFromString(strKey)
    Else
        Dim objRemoteRegistry
        
        Set objRemoteRegistry = objRegObj.RemoteRegistry(strComputerName)
        Set objRootKey = objRemoteRegistry.RegKeyFromString(strKey)
    End If

     Dim objRegKey
     
     For Each objRegKey in objRootKey.SubKeys
         temp = enumerateSubKeys(strKey & "\" & objRegKey, strComputerName)
         temp = enumerateValues(strKey & "\" & objRegKey, strComputerName)
     Next
    
     enumerateSubKeys = strRet

End Function

Function deleteKey(strKey, strComputerName)
'
' strKey is the name of registry key to enumerate
' strComputerName is the computer from which registry is used
'
     Dim objRegObj
     Dim objRegParentKey
     Dim objRootKey
        
     Set objRegObj = WScript.CreateObject("RegObj.Registry")
    'Choose the Registry Hive
    If strComputerName = "" Then
        Set objRootKey = objRegObj.RegKeyFromString(strKey)
    Else
        Dim objRemoteRegistry
        
        Set objRemoteRegistry = objRegObj.RemoteRegistry(strComputerName)
        Set objRootKey = objRemoteRegistry.RegKeyFromString(strKey)
    End If

    Set objRegParentKey = objRootKey.Parent
        
' Uncomment out the following to ACTUALLY do the delete.  
' I'm not responsible for any damage.   
'       objRegParentKey.SubKeys.Remove(objRootKey)
        
End Function

'---------------------------------------------------------------------------
'----END COPY Section of VBS code ------------------------------------------

----Q article----
OFF2000: Windows Hangs When You Log on to a Terminal Server Computer 
Q248658
----------------------------------------------------------------------------
----
The information in this article applies to:

Microsoft Office 2000 
Microsoft Office 97 for Windows 
Microsoft Windows NT Server version 4.0, Terminal Server Edition

----------------------------------------------------------------------------
----


SYMPTOMS
When you log on to a Terminal Server computer either from a client
workstation using the Terminal Server Client or directly from the console,
Windows may appear to hang (showing an hourglass) for several minutes after
the desktop appears, and you cannot click the Start menu or double-click any
icon on the desktop until the hourglass disappears.

Over time, this problem may become noticeably worse and may lead to an
eventual crash of the Terminal Server computer. 



CAUSE
When Windows loads the desktop, it scans the Windows registry. If the
TypeLib key (HKEY_CLASSES_ROOT\TypeLib) in the Windows registry is inflated,
it will appear to slow down or hang Windows while the registry is scanned.

When you run any of the Microsoft Office 97 or Microsoft Office 2000
programs, the following new folders are created in the user session Temp
folder: 

Excel9.0


Ppt9.0


Word8.0


Vbe


The first time you insert a control into a document or UserForm, the Office
program creates an .exd file for that control in the appropriate folder.
After a program creates the .exd file for a specific control, it takes less
time to insert the same control again. This is because the .exd file caches
information for the control. However, at the same time, a unique class ID
registry entry is made in the Windows registry for this .exd file.

When each user logs off the Windows Terminal Server computer, their session
Temp folder is also deleted. The specified folders described earlier in this
article, along with the .exd files created in those folders, are deleted
when this occurs. However, the registry entries created still remain. Over
time, as the same and/or subsequent users log on and use form controls on
the Windows Terminal Server computer, the Windows registry
(HKEY_CLASSES_ROOT\TypeLib) will increase in size large enough to exhibit
the behavior described in the "Symptoms" section of this article.

For additional information about why .exd files are created and their use in
Microsoft Office applications, click the article number below to view the
article in the Microsoft Knowledge Base: 
Q199830 OFF2000: EXD Files Are Created When You Insert Controls 



RESOLUTION

Method 1
Unfortunately, only way to resolve this issue with minimal problems is to
backup all user data stored on the server, format the server, then reinstall
the Windows Terminal Server and all applications. You can then restore all
user data from your backup once complete.

This is the only method supported by Microsoft Technical Support.

NOTE: Please see the Workaround section below for preventative steps that
can be used to prevent this problem from reoccurring. 
Method 2
WARNING: The following possible resolution is given only as an alternative
to the supported method. It is not suggested that these steps be used, and
any problems experienced as a result of performing these steps are to be
taken at your own risk. THIS METHOD IS NOT SUPPORTED BY MICROSOFT TECHNICAL
SUPPORT. You may still have to resort to the solution given in Method 1 to
completely resolve this problem.

WARNING: USE THE FOLLOWING AT YOUR OWN RISK.

IMPORTANT: This article contains information about editing the registry.
Before you edit the registry, make sure you understand how to restore it if
a problem occurs. For information about how to do this, view the "Restoring
the Registry" Help topic in Regedit.exe or the "Restoring a Registry Key"
Help topic in Regedt32.exe.

WARNING: Using Registry Editor incorrectly can cause serious problems that
may require you to reinstall your operating system. Microsoft cannot
guarantee that problems resulting from the incorrect use of Registry Editor
can be solved. Use Registry Editor at your own risk.

For information about how to edit the registry, view the "Changing Keys and
Values" Help topic in Registry Editor (Regedit.exe) or the "Add and Delete
Information in the Registry" and "Edit Registry Data" Help topics in
Regedt32.exe. Note that you should back up the registry before you edit it.
If you are running Windows NT, you should also update your Emergency Repair
Disk (ERD).

To resolve this problem, you will need a second machine. Use the following
steps below to resolve this issue:


On a separate machine (designated in these steps as Machine-B) install
Windows NT 4.0 Terminal Server Edition.


On Machine-B install each application EXACTLY as it is installed on the
original machine exhibiting the problems described in the Symptoms section
(designated in these steps as Machine-A).

NOTE: It is best for Machine-A and Machine-B to be 100% identical in
hardware and drive configurations.


On Machine-B, open the Windows Registry and export the TypeLib key:


On the Windows Start menu, click Run.


Type Regedit and click OK.


Browse to and select the following key:


HKEY_CLASSES_ROOT\TypeLib 
On the Registry menu, click Export Registry File, give the file a name and
save it to a floppy disk.


Exit the Registry Editor.


On Machine-A, open the Windows Registry and delete the TypeLib key:


On the Windows Start menu, click Run.


Type Regedit and click OK.


Browse to and select the following key:


HKEY_CLASSES_ROOT\TypeLib 
On the Edit menu, click Delete.


Exit the Registry Editor.


Place the floppy disk created in step 3-d into the floppy drive of
Machine-A.


Browse to and double-click on the Registry file to import it into the
Windows Registry of Machine-A.


As a result the TypeLib key on Machine-A will be updated to reflect the
clean state as seen on Machine-B. The problem described in the Symptoms
section should no longer be seen. 

NOTE: Please see the Workaround section below for preventative steps that
can be used to prevent this problem from reoccurring. 



WORKAROUND
To prevent this problem, you can use flat temporary directories on your
Windows NT Server 4.0 Terminal Server Edition.

By default, flat temporary directories are turned off (disabled). This means
that the system creates a subdirectory under the directory specified by the
TEMP and TMP environment variables that corresponds to the hexadecimal value
of each user's logon ID.

By using FLATTEMP to enable flat temporary directories, the system no longer
creates subdirectories under the directory specified by the user's TEMP
environment variable. This could result in users using the same directory to
store temporary files. If flat temporary directories are enabled, make sure
each user is using his or her own specific temporary directory by setting
the TEMP and TMP environment variables in the System icon in Control Panel. 

For additional information about FLATTEMP, click the article number below to
view the article in the Microsoft Knowledge Base: 

Q186524 Using Terminal Server's FLATTEMP Command 



STATUS
Microsoft has confirmed this to be a problem in Microsoft Office 2000 and
Microsoft Office 97.



MORE INFORMATION
For additional information about this and related problems, click the
article numbers below to view the articles in the Microsoft Knowledge Base: 

Q189119 UserEnv Returns Corrupted Profile for All Failures Including RSL
Exceeded 
Q223492 Registry Size Increases After Installing Outlook Express 5 

Additional query words: OFF2000 

Keywords : kbenv kbui kbdta kbgpf 
Version : WINDOWS:2000,97; winnt:4.0 
Platform : WINDOWS winnt 
Issue type : kbbug kbprb 
 


Last Reviewed: January 6, 2000
 

----boring signature...sorry----

Dennis Parker, MCSE, CCA
Senior Systems Analyst
Fiserv EFT
4550 SW Macadam Ave, Ste 100
Portland, Or. 97239
Direct: 503-274-6785
Fax:    503-274-6619
 
This e-mail is confidential and may well be legally privileged.   If you have 
received it in error, you are on notice of its status.   Please notify us 
immediately by reply e-mail and then delete this message from your system.   
Please do not copy it or use it for any purposes, or disclose its contents to 
any other person.   To do so could violate state and Federal privacy laws.   
Thank you for your cooperation.   Please contact me if you need assistance.


***************************************************************************
This Week's Sponsor: New Wyse(R) Expedian(TM)software maximizes your server 
capacity--cost-effectively. Now you can dramatically increase the number of 
users on a server by as much as 40%--and reduce the number of servers you have 
to manage. By optimizing memory usage, Wyse Expedian software allows the 
terminal server to support more applications and more concurrentusers. Download 
your 30-day free trial today at:
http://www.wyse.com/expedian/eval.cfm?promo=US-Ad-0103TheThinNetNewsletterEM
****************************************************************************


For Archives, to Unsubscribe, Subscribe or 
set Digest or Vacation mode use the below link:
http://thethin.net/citrixlist.cfm

Other related posts: