Showing posts with label software. Show all posts
Showing posts with label software. Show all posts

Monday, March 20, 2023

Disable Windows 10 Web Search

 I had a need to disable the web search results in Windows 10 for a limited user. These two links were helpful:

Adding the Registry key in HKEY_CURRENT_USER works for the current user:

  1. Open regedit.exe.
  2. Navigate to HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Explorer (create the Explorer key if it doesn't already exist).
  3. Create a DWORD value named DisableSearchBoxSuggestions and set it to 1.
  4. Restart your computer (or kill and restart all Explorer.exe process instances).
However, a limited user does not have permission to add registry keys. So, while logged in as an administrator, use this to show the SID for each user on the machine:

C:\>wmic useraccount get name,sid

That will give you the SID of each user. You can then look in HKEY_USERS to find their hive and create the key; however, they will only show up in HKEY_USERS if they are currently logged in to the computer. So switch to that limited user and login, then switch back to the administrator user and go into HKEY_USERS and find their SID, then create the DisableSearchBoxSuggestions as shown above.

Saturday, March 3, 2018

Printer friendly blogger posts

In a different blog, I had the need to print individual posts without all of the extra content (navigation, header, sidebar, comments, etc.). I found this post and adapted it as follows:


<style media='print' type='text/css'>
#header-wrapper, #header, .header, #sidebar-wrapper, .sidebar, #footer-wrapper, #footer, .post-meta-data, .comment-link, .comment-footer, #blog-pager, #backlinks-container, #navbar-section, .subscribe_notice, .noprint, .fauxcolumn-right-outer, .column-right-outer, .comments, #comments, .post-footer, .feed-links, .foot {display: none;}
#main-wrapper {width: 95%}
  .column-center-outer { width: 940px !important }
  /*.post-body {font-size:125% !important}*/
</style>

With the current version of Blogger, you need to edit your Theme and put this in the HTML <head> section.

Saturday, January 27, 2018

Synchronizing Photos between two Google Accounts

I have an interesting situation where I need to copy photos and videos from one Google Drive account (not Google Photos) into a separate Google Photos account. Without going into the contextual details of why I need to do this, here are the primary objectives:

  • Photos and videos are initially uploaded into Google Drive folders of account someone@domainA.com
  • Photos and videos need to end up in Google Photos of account someone@domainB.com
  • This is an ongoing activity (not a one-time activity)
  • I would prefer not to keep multiple copies of all files on my local machine
From what I have been able to tell, Google does not provide a simple way to accomplish the above objectives. The only way to accomplish these objectives is to download from one account and upload into the other account. However, I do not really want to do that manually on an ongoing basis. 

The solution is based on Google's Backup and Sync application. The application already allows you to add multiple accounts - but they must target different folders on your machine. With that limitation, I would need to manually copy all files from one synced folder to the other synced folder (and that would violate the objective of not keeping multiple copies of the files on my local machine). The solution is to use two different Windows accounts on your computer. The Backup and Sync application does not run as a Windows service at the operating system level; instead, it runs as a startup script for the Windows profile (e.g. it is only running while you are logged in). 

Setup steps:
  1. Make sure you have two different Windows accounts on your computer (e.g. one for each of the Google accounts that you want to sync.
  2. Create a file system folder that is outside of your Windows profile; perhaps you might call it C:\GoogleDriveAndPhotos
  3. Login to Windows as the first user (e.g. someone@domainA.com)
  4. Install Google Backup and Sync
  5. Add the someone@domainA.com account
  6. On step 2 of account configuration, add the folder that you created in step 2 (that is where you want all of your My Drive files downloaded to).
  7. On step 3 of account configuration, uncheck all options (you are not trying to upload anything from your computer into this Google Drive account)
  8. Complete the configuration and let the sync process complete (may take a while, if you have a lot of files/photos)
  9. Login to Windows as the second user (e.g. someone@domainB.com)
  10. Install Google Backup and Sync
  11. Add the someone@domainB.com account
  12. On step 2 of account configuration, uncheck all of the folders (you are not trying to download anything from this account to your computer)
  13. On step 3 of account configuration, choose the folder that you created in step 2 (that is where all of the photos/videos will be downloaded from the other account)
  14. Choose the option to only upload photos/videos (not all files). (I also chose the option to upload as "High Quality", not "Original")
  15. Complete the configuration and let the sync process complete (may take even longer, as upload speeds are often slower than download speeds)
Ongoing use:
  1. Periodically login to the first Windows account and let the sync process download new photos/videos
  2. Periodically login to the second Windows account and let the sync process upload new photos/videos

Tuesday, May 31, 2016

Windows Limited Connectivity (WLAN and LAN)

I was doing some work on a Windows 8.1 laptop for a friend. One of the problems was the WiFi did not work, and he also wanted to upgrade to Windows 10. It would "connect" to the network, but DHCP failed and the machine was never assigned an IP address. The connection was labeled as "Limited" or "Unidentified Network" (depending on where you looked) and the WiFi icon in the task bar had the yellow exclamation point overlay. The same issue (limited connectivity) happened with Ethernet (after plugging in a Cat5 cable).

I proceeded in the following order:
  • Uninstall Norton Security (subscription had expired, no longer needed)
  • I already had the Windows 10 installation files on a thumb drive, so I went ahead and did the upgrade to Windows 10 (hoping that would magically fix the connectivity issue)
After installing Windows 10, the connectivity issue persisted for both WiFi (WLAN) and Ethernet (LAN). I spent quite a while searching for solutions online and trying various driver configurations. I tried disabling DHCP and assigning an IP address manually. I tried various netsh commands. Nothing seemed to work and I was running out of ideas. I prayed for some divine help (from the omnipotent IT Guy - aka Heavenly Father). I kept trying various things and nothing worked, and I kept praying for help. I finally had the idea inspiration to disable Windows Firewall. And it came to pass ... that the issue was resolved.

Something in Windows Firewall was preventing network connectivity. Just to be certain, I enabled Windows Firewall ... and it broke again. I did not want to leave Windows Firewall off permanently (not a good idea, particular for a laptop that will be used on public networks). From Control Panel's Windows Firewall section, I clicked the "Restore Defaults" link to restore Windows Firewall to its original, default settings. After that, WiFi worked just fine (with Windows Firewall enabled). I cannot say for certain what Windows Firewall settings were causing the problem - but I can confirm that disabling Windows Firewall, and subsequently restoring the default settings, resolved the issue.

I am grateful for the divine inspiration that helped me get this issue resolved.

Friday, May 20, 2016

Use mklink for disk cleanup

Similar to my post from a few years ago, my SSD system drive was running low on disk space. I freed up 20+ GB of space by moving the following folders to a separate drive and using mklink to create a symbolic link:

C:\Users\Mathew\AppData\Local\Microsoft\Office\15.0\OfficeFileCache
(thanks to George B. Summers in his reply to this post)
C:\Users\Mathew\AppData\Local\Microsoft\Office\15.0>mklink /D OfficeFileCache D:\Users\Mathew\AppData\Local\Microsoft\Office\15.0\OfficeFileCache

C:\ProgramData\Package Cache
(thanks to Roel van Lisdonk in his post)
C:\ProgramData>mklink /D "Package Cache" "D:\ProgramData\Package Cache"

C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Update Cache
(thanks to Vinh Q Nguyen in his reply to this post)
C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap>mklink /D "Update Cache" "D:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Update Cache"

Tuesday, May 3, 2016

Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred

An ASP.NET button click event was generating this error (in client-side browser debug window):

Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred

I could not find anything server-side in the application's log file, or in IIS logs. However, in the Windows Application Log in Event Viewer, I found the exact error message (including stack trace).

Thanks to Neville for the suggestion.

Using both 32-bit and 64-bit Oracle Client

While trying to resolve Oracle Client bitness conflicts, I came across this post:

http://realfiction.net/2009/11/26/Use-32-and-64bit-Oracle-Client-in-parallel-on-Windows-7-64-bit-for-eg-NET-Apps/

I followed those instructions, using the 12c Instant Client downloads, and it resolved my error. In case that post disappears, here is a summary of the instructions (credit to Frank Quednau for his post):


  1. Download both Oracle Client packages (32-bit and 64-bit). I downloaded the following files (from Oracle.com):
    instantclient-basiclite-nt-12.1.0.2.0.zip
    instantclient-basiclite-windows.x64-12.1.0.2.0.zip
  2. Unblock both downloaded files before continuing
  3. Each of those .zip files contains a folder called instantclient_12_1; extract and rename that folder somewhere on the machine, e.g.:
    C:\oracle\12c_32   (this is instantclient_12_1 extracted from instantclient-basiclite-nt-12.1.0.2.0.zip)
    C:\oracle\12c_64  (this is instantclient_12_1 extracted from instantclient-basiclite-windows.x64-12.1.0.2.0.zip)
  4. Start an elevated Command Prompt (aka Run as Administrator)
  5. Change to %WINDIR%\system32, e.g.:
    C:\Windows\System32>
  6. Make a soft link that points to the 12c_64 folder:
    C:\Windows\System32>mklink /d 12c C:\oracle\12c_64
    symbolic link created for 12c <<==>> C:\oracle\12c_64
  7. Change to %WINDIR%\SysWOW64, e.g.:
    C:\Windows\SysWOW64>
  8. Make a soft link that points to the 12c_32 folder:
    C:\Windows\SysWOW64>mklink /d 12c C:\oracle\12c_32
    symbolic link created for 12c <<==>> C:\oracle\12c_32
  9. NOTE: Make sure that both symbolic links have the same name, e.g.:
    C:\Windows\System32\12c
    C:\Windows\SysWOW64\12c
  10. Edit your system %PATH% environment variable and add the full path (do not use %WINDIR%) to the first symbolic link:
    ...;C:\Windows\System32\12c;
  11. Restart your machine, or at least restart whatever application is connecting to Oracle
With this setup, TNSNAMES.ORA does not seem to work. Instead, put the full descriptor directly in the connection string:

Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)));User ID=someuser;Password=yourpassword;

Tuesday, April 12, 2016

Vertically Center HTML element via CSS

This CSS is helpful for centering an element vertically within a container:

Thanks to Sebastian Ekström: http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/

.parent-element {
  -webkit-transform-style: preserve-3d;
  -moz-transform-style: preserve-3d;
  transform-style: preserve-3d;
}

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

Wednesday, January 20, 2016

Microsoft Azure Web Role - RDP hangs at "Configuring Remote Session ..."

I have been researching Microsoft Azure recently, both Azure App Service Web Apps and Azure Cloud Services (Web Roles and Worker Roles). I created a very simple web application (in Visual Studio) and published to a Cloud Server. The application contained a single (one instance) Web Role. I configured Remote Desktop in the application before publishing.

After publishing, I looked in the Azure portal and found the public IP address. I opened RDP and tried to connect to that IP address. The connection appeared to start, but then it would hang on "Configuring Remote Session ..." and never complete. I could telnet to port 3389, so it was not a firewall issue. After much searching (and prayer), I tried logging into the classic Azure portal (https://manage.windowsazure.com) and reviewed the WebRole1_IN_0 instance. I clicked the "Connect" button, downloaded an *.rdp file, opened it ... and the RDP session worked just fine. I had tried the "Connect" button in the new portal (https://portal.azure.com), but it did not do anything (at least in Firefox).

I am not sure why a direct RDP connection will not work, but using the *.rdp file from the classic portal does work.

Tuesday, April 28, 2015

ORA-24344: success with compilation error

I have spent time recently working on some fairly lengthy Oracle PL/SQL scripts. The scripts are run via SQL*Plus (e.g. "SQL> @CreateOracle.sql"), and the main script references several other external scripts. One of the scripts creates a trigger on a table. The output shown in the log file is:

ORA-24344: success with compilation error 

However, by the time the rest of the scripts completed, SQL*Plus reported no errors on that trigger. It became a frustrating endeavor to try and find out what the actual compile error was. I finally had to remove all of the scripts that followed the failing script. With the failing script executing last, I was then able to use the USER_ERRORS view to see the actual compile errors (thanks to this post for the suggestion):

select * from user_errors

The actual error itself was very easy to fix ... once I was finally able to find it.

Wednesday, March 12, 2014

What is a "web service"?

I was recently asked a question at work about an application, EQuIS Professional, that uses TCP/IP to connect to Microsoft SQL Server (aka ADO.NET Sql Provider). The answer was somewhat lengthy, but may be useful for some discussions:

That is a great question. The answer to that question can be somewhat technical, and may vary depending on the context of the question. The term "web service" or "web service interface" can be defined in a variety of ways. Most definitions include the transfer of data between the client and the server. Often the term "web" implies HTTP (Hyper Text Transfer Protocol). One way of defining "web service" is a service that facilitates the transfer of data, typically in some text-based representation (e.g. XML or JSON), over the Internet via the HTTP protocol. The main benefit of sending the data in a text-based representation is to allow application integration. For example, text-based representation of data allows communication between a client application developed separately from and independent of the server application. Converting the data to/from the text-based representation incurs processing overhead; but that overhead may be a worthwhile cost for this type of web service.

When it comes to security, HTTP is no more secure than any other protocol. In fact, running a web service directly over HTTP would be very insecure (and not recommended). The security of a web service typically comes from SSL (Secure Sockets Layer). Using HTTP with SSL (i.e. HTTPS) is secure because all of the packets sent over the Internet are encrypted with SSL. That is why all secure websites use HTTPS; you would not, for example, want to use an online banking site that uses HTTP.

All network communications happen over a given port. There are "standard" ports used for specific protocols. For HTTP, the standard port is 80. For HTTPS, the standard port is 443. One reason that HTTPS-based web services are popular is because port 443 is typically already open in most firewalls; so using HTTPS does not require any additional firewall configuration. So an HTTPS-based web service takes advantage of the already open port. For a generic web service designed to facilitate the transfer of data between disparate systems, HTTPS is typically the best choice.

However when both the client and the server are designed to work together (e.g. EQuIS Professional and SQL Server), a text-based representation of the data is inefficient. HTTP is built on top of TCP/IP, and it is more efficient to transfer the data in well-defined binary representation that is known by both the client and the server. This type of communication is typically done directly over TCP/IP (without the additional HTTP layer). At this lower level, a "web service" may be a service that facilitates the transfer of data (in some mutually agreed binary representation) over the Internet via TCP/IP.

While transferring the data in binary form over TCP/IP is more secure than HTTP, it is still not inherently secure. So a web service using TCP/IP should still be encrypted with SSL. Microsoft SQL Server natively supports SSL encryption for all cient/server communications. When SQL Server acts as a web service using TCP/IP via forced SSL encryption, the communication is essentially as secure, and more efficient than, an HTTPS web service.

Because TCP/IP is lower in the network stack than HTTP/HTTPS, it does not have a "standard" port. Many different network protocols run over TCP/IP on different ports. When configuring SQL Server as an SSL-encrypted web service, it is important to consider the port that will be used. The default port for SQL Server is 1433. However, that is not the best choice for an Internet-facing instance of SQL Server (even if it is SSL-encrypted). One option is to use port 443, for the same reasons that an HTTPS-based web service uses port 443. Since most firewalls already have port 443 open, it greatly reduces the potential firewall related issues when establishing connections. Having SQL Server listen to port 443 on a public facing IP address is not much different than having IIS (aka HTTPS server) listen on port 443 on a public facing IP address. Another option is to have the public facing machine (or the firewall) use port forwarding from the public IP/port to the internal IP/port.

Given this background (I apologize if I have provided too much detail), let me answer your original question. If your question is "Can EQuIS Pro consume an HTTPS-based web service?", the answer is "not easily".  It would require a fair amount of implementation and testing to make something like that work, and the performance would likely degrade. Also, using HTTPS does not actually remove the dependency on TCP/IP ... it simply wraps TCP/IP in HTTP and in SSL (two additional layers) and runs it on a known port (port 443).


However, if your question is "Can EQuIS Pro (running externally) make a secure connection without requiring additional open firewall ports?", then the answer is "yes". By configuring SQL Server to force SSL encryption and to listen on port 443 (either directly or via port forwarding), you can achieve the same benefits of an HTTPS-based web service.

Monday, February 17, 2014

Editing a video (*.wmv) without re-encoding

I had a need recently to perform some simple editing of an existing Windows Media Video file (*.wmv). I did not want to re-encode the entire file, I just wanted to remove the first 20 seconds of the video. After some searching, I found the following helpful post:

http://itglyphs.blogspot.com/2010/09/what-happened-to-window-media-encoders.html

I did the following to successfully edit the video:


  1. Download and install Expression Encoder 4 (installing the free version without keys was sufficient)
  2. Created a new video project
  3. Import the existing *.wmv video
  4. On the Encode tab (at the right of the screen), chose "Source" for both Video and Audio (see screenshot)
  5. Clicked the Encode button at the bottom of the screen


The new *.wmv was automatically saved to:

C:\Users\user\Documents\Expression\Expression Encoder\Output\MACHINENAME 2-17-2014 9.04.31 AM


Tuesday, February 11, 2014

Hosting MSScriptControl in .NET

I am working on a project where I need to be able to execute VBScript from within a .NET application. Additionally, the VBScript needs to be able to call methods and manipulate values on a .NET object. There are several useful articles about how to do this:


I studied up and created a sample application, but the VBScript code was not able to see my object. I kept getting InvalidCastException whenever I tried to add my custom object using ScriptControl.AddObject. Using information from the above articles, and some trial and error, I was able to figure out the following requirements:
  1. Your object (and its methods/properties) needs to be public
  2. Your process must be an x86 process (COM Interop doesn't work well in x64)
  3. The assembly containing your class must be registered for COM interop (which means it must be a class library ... you cannot define the class within an executable and have it work)
With these requirements correctly implemented, the ScriptControl works well and can interact with my .NET object.

Friday, August 23, 2013

HTTP Error: 502 (Bad Gateway)

I started having some Internet connectivity issues this week. The symptoms varied from sluggishness to seemingly random errors. The most frustrating error was an HTTP Error: 502 (Bad Gateway) error that occurred when trying to use TortoiseHg to push changesets to a remote repository. I have been pushing changesets with TortoiseHg for years ... and just started getting this error this week.

I googled the error message and found all sorts of advice. I spent hours trying to figure out what was causing the 502 error during the Hg push. I upgraded Hg on my machine and the remote server. I switch hgweb from CGI to ISAPI. None of these things made any difference.

I finally got smart enough to pray for help. Moments after praying, I had the thought that I should unplug my machine from my router and plug it directly into my cable modem. At first I thought that sounded silly, so I kept searching online. The thought kept coming back to me, so I decided to try it. Sure enough, as soon as I bypassed my router, the error went away. I was able to push my changesets without any trouble whatsoever.

I did some additional testing and found that my speed was much faster without the router as well. Other random errors seemed to go away. I have learned two things from this experience:

(1) God knows what He is doing. He is willing to help, if we are only willing to ask. I should have asked a lot sooner.

(2) My Dell TrueMobile 2300 Wireless Broadband Router has some issues with Parental Control rules. I had setup some rules earlier this week to limit the time of day that our kids could be online. Even though the control rules were for entirely different IP addresses than my main machine, they were affecting all Internet traffic going through the browser. After removing the rules, everything was back to normal (no more 502 Bad Gateway error in Hg, no more random errors, twice as fast).

Bulk Unblock Files

Thanks to Nicholas Rogoff for these instructions to bulk unblock files:

  1. Download the Sysinternals Streams.exe from http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx
  2. I find Sysinternals so useful I create a ‘SysInternals’ folder on my C: drive and then put this into my ‘path’ environment variable so that I can run them from anywhere. However, if this is too much then the easiest is to copy the streams.exe to the root folder you wish to have files unblocked.
  3. In a command windows, use ‘cd’ to navigate to your folder.
  4. Type the command ‘streams –s –d subfoldername’ and press enter.

NOTE: You want to be running streams.exe one folder above the folder containing the files (e.g. subfoldername). For example, if your files to unblock are located in C:\app\bin, you would run your command as:

C:\app>streams -s -d bin

Thursday, August 15, 2013

listener.ora - localhost

While testing today, I had a scenario where I needed to connect to Oracle that was running on a remote machine (hosted by Skytap). I had configured the ports and firewalls, but I still could not connect from my machine to the remote Oracle database. I kept getting the following error:

ORA-12541: TNS: no listener

I finally determined that the problem was with the listener.ora file on the remote machine (where Oracle was running). It was setup to listen from localhost:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
 (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

Connections from the remote machine to itself were working fine, but connections from an external machine were not working. I changed listener.ora to listen on the machine name (instead of localhost):

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
 (ADDRESS = (PROTOCOL = TCP)(HOST = WN700014)(PORT = 1521))
    )
  )

After restarting the Oracle service and the TNSListener service, I was able to connect from my machine to the remote machine.

Monday, August 12, 2013

Windows 7 Cleanup Disk Usage

I have my desktop operating system on a 90 GB SSD (solid state drive). The SSD performs quite well. Over time, the system drive can accumulate a lot of extra stuff. Today, I was down to less than 10 GB of free space. I found a couple of links that were helpful:

http://forum.crucial.com/t5/Solid-State-Drives-SSD/Random-space-saving-tip-Windows-installer-cache/td-p/51150

http://www.hanselman.com/blog/GuideToFreeingUpDiskSpaceUnderWindows7.aspx

I moved my C:\Windows\Installer folder to E:\Windows\Installer by doing the following:

  1. Using Windows Explorer, cut and paste from C:\Windows to E:\Windows
  2. Using Command prompt (Run as Administrator), execute the following commands
    1. C:
    2. CD \
    3. CD Windows
    4. mklink /d Installer E:\Windows\Installer
That cleared up close to 10 GB of space.

Secondly, I turned off hibernate by executing the following command (in the same Command prompt):

powercfg -h off

That cleared up another 8 GB or so.

Wednesday, April 10, 2013

Corflags Shell Extension

When doing .NET development, particularly for both x64 and x86 platforms, it is often useful to use Corflags.exe to view/modify the PE header of a *.dll file. To make this more convenient, I created a Windows Explorer shell extension so I can right-click a *.dll file and click "Show Corflags" to see the corflags output for the *.dll.

Open Notepad and paste in the following (make sure the path to Corflags.exe is correct for your machine):

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\dllfile\shell]
[HKEY_CLASSES_ROOT\dllfile\shell\Show Corflags]
[HKEY_CLASSES_ROOT\dllfile\shell\Show Corflags\command]
@="cmd.exe /k \"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\Corflags.exe\" %1"

then save as a *.reg file. Double-click the *.reg file to add the registry keys to your registry.

Wednesday, February 27, 2013

Paint.NET and the Grim (Color) Reaper

I have been using Paint.NET for image editing. It is a low cost, high featured image processing application. The one feature that I had trouble finding was making a color transparent. The Grim Color Reaper plugin does a great job of making a color transparent. All you need to do is:

  • Download the Grim Color Reaper plugin
  • Extract the DLL into your ./Paint.NET/effects folder
  • Restart Paint.NET
  • Click Effects ... Color ... Grim Color Reaper
Thank you, Grim Color Reaper (and Paint.NET).

Thursday, January 12, 2012

Testing IE Versions

I am updating this post to include a couple of other ways to test a website in multiple browser versions.

(1) https://spoon.net/browsers

Of the various methods I have tried, using spoon.net is by far the quickest and simplest way to run older browser versions (as well as many different browsers). It is simple to get up and running. It is also easy to debug web applications running on localhost (using IIS or Visual Studio's development web server). You will need to pay a small fee (~ $5/month), but that is well worth the time it saves.

(2) Windows XP Mode and Virtual PC

The following article explains how to use Windows XP Mode and Virtual PC to run IE6 and IE7:

http://www.sitepoint.com/ie6-ie7-ie8-win7-xp-mode/

It took an hour or two to get everything installed and configured, but it was fairly straight forward. I created a third XP virtual machine for IE8; so I can run IE6, IE7, and IE8 on my development machine. A couple of things to consider:
  (a) If you want to run more than one of the virtual machines simultaneously, you should rename each machine (from within the XP guest OS) to avoid NetBIOS naming conflicts
  (b) Since the browser is running in a virtual guest OS, it is not straight forward to access a web application running on localhost of the host OS. I am sure it can be done, but I have not yet take the time to figure it out.

(3) IETester:

IETester is a nifty tool for testing websites in various versions of Internet Explorer. It seems to work some of the time, but it crashed on my several times and did not seem to handle Javascript very well.