<?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>Arnout's Eclectica &#187; Windows</title>
	<atom:link href="http://grootveld.com/archives/category/windows/feed" rel="self" type="application/rss+xml" />
	<link>http://grootveld.com</link>
	<description>But I digress...</description>
	<lastBuildDate>Wed, 10 Feb 2010 20:00:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Microsoft Forefront in action&#8230;</title>
		<link>http://grootveld.com/archives/61/microsoft-forefront-in-action</link>
		<comments>http://grootveld.com/archives/61/microsoft-forefront-in-action#comments</comments>
		<pubDate>Mon, 28 Sep 2009 19:07:18 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/?p=61</guid>
		<description><![CDATA[How to disable Outlook:

Thanks, eh.
]]></description>
			<content:encoded><![CDATA[<p>How to disable Outlook:</p>
<p><img src='/images/Forefront.png' width='618' height='328' alt='Microsoft Forefront deleting one of Outlook&apos;s files...'/></p>
<p>Thanks, eh.</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/61/microsoft-forefront-in-action/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Troubleshooting a scheduled task</title>
		<link>http://grootveld.com/archives/30/troubleshooting-a-scheduled-task</link>
		<comments>http://grootveld.com/archives/30/troubleshooting-a-scheduled-task#comments</comments>
		<pubDate>Fri, 28 Nov 2008 22:59:14 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Reminder]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/30</guid>
		<description><![CDATA[How to run <code>cmd.exe</code> non-interactively if you're not an admin.]]></description>
			<content:encoded><![CDATA[<p>Earlier today, I was trying to run a batch file as a scheduled task, using a non-admin service account. It didn't work, but the scheduled tasks interface didn't provide a lot of info to go on.</p>
<p>After double-checking file system permissions, and running Filemon to try and figure out where stuff was failing, I found out that the task scheduler actually creates a log file. By default it seems to live at <code>%SystemRoot%\Tasks\SchedLgU.Txt</code>, but that location can be changed in the registry by modifying the <code>LogPath</code> value at <code>HKLM\SOFTWARE\Microsoft\SchedulingAgent</code>.</p>
<p>That log file contained an error message (well, several...) that quickly lead me to Microsoft Knowledgebase article <a href='http://support.microsoft.com/kb/867466' title='Microsoft Knowledgebase article about &#39;Access Denied&#39; errors in scheduled tasks'>KB867466</a>. Turns out that on Windows Server 2003 member servers, non-admin users running non-interactively don't have Read or Execute permissions to <code>cmd.exe</code>...</p>
<p>After fixing the permissions, the job ran fine.</p>
<p>That's when I discovered that the batch file was making some assumptions w.r.t. the user's regional settings, so I switched to a VBScript instead. If I'd done that in the first place, I wouldn't have had to spend 15 minutes fighting with the task scheduler, since the permissions issue doesn't apply to <code>cscript.exe</code>...</p>
<p>Oh well.</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/30/troubleshooting-a-scheduled-task/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synchronizing two batch files using WAITFOR.exe</title>
		<link>http://grootveld.com/archives/28/synchronizing-two-batch-files-using-waitforexe</link>
		<comments>http://grootveld.com/archives/28/synchronizing-two-batch-files-using-waitforexe#comments</comments>
		<pubDate>Thu, 28 Aug 2008 20:58:08 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Reminder]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/28</guid>
		<description><![CDATA[I was writing some unit tests today where I wanted to start some process asynchronously, but have it automatically exit after a specified number of seconds. Preferably something that's available on a standard W2K3 box, so that I wouldn't be creating any additional prerequisites for other developer boxes or the build machine.
Usually I just use [...]]]></description>
			<content:encoded><![CDATA[<p>I was writing some unit tests today where I wanted to start some process asynchronously, but have it automatically exit after a specified number of seconds. Preferably something that's available on a standard W2K3 box, so that I wouldn't be creating any additional prerequisites for other developer boxes or the build machine.</p>
<p>Usually I just use <code>ping -t -n <i>count</i> <i>host</i></code> for this, but I was also thinking that it would be nice to be able to terminate the process before the timeout. Not sure exactly how I came across it, but somehow I found <code>waitfor.exe</code> lying around in my <code>system32</code> directory.</p>
<p><code>WAITFOR</code> uses a <a href='http://msdn.microsoft.com/en-us/library/aa365576(VS.85).aspx' title='Documentation for Win32 mailslots at Microsoft'>mailslot</a> to wait on or send a signal to. The waiting and sending can happen on the same machine, or the signal can be sent across the network.</p>
<p>In one command prompt, you perform the wait:</p>
<pre class="dosbox">C:\\> WAITFOR /T 42 SignalName</pre>
<p>In another, you send the signal:</p>
<pre class="dosbox">C:\\> WAITFOR /SI SignalName</pre>
<p>Way nicer than the old-fashioned approach of having process A poll a directory until process B has created a particular file. And, no less important, if the signal is not received within the specified timeout, you get:</p>
<pre class="dosbox">C:\\> WAITFOR /T 1 Godot
ERROR: Timed out waiting for 'Godot'.

C:\\>_</pre>
<p>:-)</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/28/synchronizing-two-batch-files-using-waitforexe/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>*UPDATE* on REGEDIT experiments</title>
		<link>http://grootveld.com/archives/27/update-on-regedit-experiments</link>
		<comments>http://grootveld.com/archives/27/update-on-regedit-experiments#comments</comments>
		<pubDate>Thu, 21 Aug 2008 20:03:01 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Regedit]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/27</guid>
		<description><![CDATA[In my previous post, I wrote about some findings w.r.t. REGEDIT. One of them was about a limitation on the depth of key hierarchies during a registry export.
When I found out about this limitation, I was actually encountering stack overflows in REGEDIT. However, shortly afterwards I wasn't able to reproduce that behaviour, so I considered [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href='http://grootveld.com/archives/26/regedit-experiments' title='My first post about REGEDIT experiments'>previous post</a>, I wrote about some findings w.r.t. REGEDIT. One of them was about a limitation on the depth of key hierarchies during a registry export.</p>
<p>When I found out about this limitation, I was actually encountering stack overflows in REGEDIT. However, shortly afterwards I wasn't able to reproduce that behaviour, so I considered it to be some fluke and just wrote about the limitation itself.</p>
<p>However, today I managed to overflow REGEDIT's stack again by just having it export a deep hierarchy to <code>.REG</code>, and this time I captured a crash dump:</p>
<pre class='codesample'>
0:000> kb 300
ChildEBP RetAddr  Args to Child
0004308c 77f60938 000002b8 00000000 000430b8 ADVAPI32!LocalBaseRegEnumKey+0x13
000430c4 0100bb37 000002b8 00000000 00043654 ADVAPI32!RegEnumKeyW+0x8c
00043890 0100bb08 000002b8 000438a0 004b0048 regedit!PutBranch+0x124
0004404c 0100bb08 000002bc 0004405c 004b0048 <strong>regedit!PutBranch+0xf5</strong>
00044800 0100bb08 000002c0 00044810 004b0048 <strong>regedit!PutBranch+0xf5</strong>
00044fac 0100bb08 000002c4 00044fbc 004b0048 <strong>regedit!PutBranch+0xf5</strong>

       <em>... Removed 190 lines that all end in</em> <strong>regedit!PutBranch+0xf5</strong>

0007f1d4 0100bb08 00000578 0007f1e4 004b0048 <strong>regedit!PutBranch+0xf5</strong>
0007f458 0100bb08 0000057c 0007f468 004b0048 <strong>regedit!PutBranch+0xf5</strong>
0007f6c8 0100be1b 80000001 0007f6f0 00070e54 <strong>regedit!PutBranch+0xf5</strong>
0007f944 01006be3 0007f974 01059de0 00070e54 regedit!ExportWinNT50RegFile+0x16d
0007f958 01007272 00070e54 00000000 0007f974 regedit!RegEdit_ExportRegFile+0x2e
0007fb80 010062eb 00070e54 0000110a 7739c2ee regedit!RegEdit_OnCommandExportRegFile+0x65
0007fb98 01009751 00070e54 00000293 00000000 regedit!RegEdit_OnCommand+0x7f
0007fbbc 01009947 00070e54 00000293 000ad310 regedit!RegEdit_OnKeyTreeCommand+0xc4
0007fc24 010045ba 00070e54 00160c39 0007fc50 regedit!RegEdit_OnKeyTreeContextMenu+0x1a1
0007fc34 0100689f 00130dc2 00070e54 000002c4 regedit!RegEdit_OnContextMenu+0x2a
0007fc50 7739b6e3 00130dc2 0000007b 00070e54 regedit!RegEditWndProc+0x128
0007fc7c 7739b874 01006777 00130dc2 0000007b USER32!InternalCallWinProc+0x28
0007fcf4 7739c2d3 00000000 01006777 00130dc2 USER32!UserCallWinProcCheckWow+0x151
0007fd30 7739c337 00615210 00615118 00070e54 USER32!SendMessageWorker+0x4bd
0007fd50 7745b0ee 00130dc2 0000007b 00070e54 USER32!SendMessageW+0x7f
0007fd74 7745bcfc 00070e54 00000062 00000025 COMCTL32!TV_SendRButtonDown+0xad
0007fdc4 7739b6e3 00070e54 00000204 00000002 COMCTL32!TV_WndProc+0x616
0007fdf0 7739b874 7745b6e6 00070e54 00000204 USER32!InternalCallWinProc+0x28
0007fe68 7739ba92 00000000 7745b6e6 00070e54 USER32!UserCallWinProcCheckWow+0x151
0007fed0 7739bad0 0007fef8 00000000 0007ff1c USER32!DispatchMessageWorker+0x327
0007fee0 01009cb9 0007fef8 ffffffff 00000000 USER32!DispatchMessageW+0xf
0007ff1c 01016e04 01000000 00000000 000a24a6 regedit!WinMain+0x154
0007ffc0 77e6f23b 00000000 00000000 7ffdf000 regedit!WinMainCRTStartup+0x182
0007fff0 00000000 01016c82 00000000 78746341 kernel32!BaseProcessStart+0x23
</pre>
<p>If somebody wants to dive into the crash dump, let me know.</p>
<p>Exporting a deep key hierarchy on W2K8 X64 didn't work either, BTW:</p>
<p><img src='/images/RegeditStackOverflowW2K8X64.png' width='471' height='385' alt='Screen shot of REGEDIT crashing on W2K8 X64 while trying to export a deep key hierarchy' /></p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/27/update-on-regedit-experiments/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REGEDIT experiments</title>
		<link>http://grootveld.com/archives/26/regedit-experiments</link>
		<comments>http://grootveld.com/archives/26/regedit-experiments#comments</comments>
		<pubDate>Tue, 12 Aug 2008 21:11:16 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Regedit]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/26</guid>
		<description><![CDATA[NOTE (2008-08-21): Also see the update to this post.
I've been working on a tool that can export registry information in REGEDIT's .REG format. Since that format doesn't seem to be fully documented, I spent quite some time experimenting with REGEDIT. Here are some of my more interesting findings (all on W2K3).
No expansion beyond 32 levels
When [...]]]></description>
			<content:encoded><![CDATA[<p><span style='background-color: #ffffaa;border-style: solid; border-width: 1px; padding: 3px'><strong>NOTE</strong> (2008-08-21): Also see the <a href='http://grootveld.com/archives/27/update-on-regedit-experiments' title='Update about the export limitations'>update</a> to this post.</span></p>
<p>I've been working on a tool that can export registry information in REGEDIT's <code>.REG</code> format. Since that format doesn't seem to be fully documented, I spent quite some time experimenting with REGEDIT. Here are some of my more interesting findings (all on W2K3).</p>
<p><strong>No expansion beyond 32 levels</strong><br />
When you expand a key in REGEDIT, it passes the "root" <code>HKEY</code> (like <code>HKLM</code>) and the full path to <code>RegOpenKey()</code> instead of the immediate parent and just the name of the key you're trying to expand. This means that it will run into the <a href='http://msdn.microsoft.com/en-us/library/ms724872(VS.85).aspx' title='Registry Element Size Limits'>"up to 32 levels at a time" limitation</a> of the registry API:</p>
<p><img src='/images/Registry33levels.png' height='159' width='568' alt='Error message when opening level 33'/></p>
<p><strong>No export beyond 200 levels</strong><br />
Although the registry supports 512 levels of keys, REGEDIT will only export upto a depth of about 200, silently ignoring anything beyond that...<br />
Granted, that's not a very common scenario, but I would expect at least a warning message or something.</p>
<p><strong>Importing values of non-existing types</strong><br />
<a href='http://source.winehq.org/source/include/winnt.h#L4178' title='Registry value type definitions at Wine HQ'><code>WinNT.h</code> defines 12 value types</a>, ranging from <code>REG_NONE</code> (0) to <code>REG_QWORD</code> (11). REGEDIT however, will gladly accept all other 32-bit values as well...</p>
<p><code>[HKEY_CURRENT_USER\RegistryTest]<br />
"Type Test"=hex(42):47,11</code></p>
<p>results in</p>
<p><img src='/images/RegistryValueTypes.png' width='302' height='75' alt='A value of type 0x42...'/></p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/26/regedit-experiments/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making HttpWebRequest work while having Fiddler decrypt SSL</title>
		<link>http://grootveld.com/archives/22/making-httpwebrequest-work-while-having-fiddler-decrypt-ssl</link>
		<comments>http://grootveld.com/archives/22/making-httpwebrequest-work-while-having-fiddler-decrypt-ssl#comments</comments>
		<pubDate>Thu, 29 May 2008 11:54:49 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Reminder]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/22</guid>
		<description><![CDATA[Just a quick reminder to myself, so that I can forget about it...
Fiddler can act as a man-in-the-middle and decrypt SSL traffic, but then System.Net.Security rightfully complains about an invalid remote certificate ("The remote certificate is invalid according to the validation procedure."). This results in a System.Net.WebException "The underlying connection was closed: Could not establish [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick reminder to myself, so that I can forget about it...</p>
<p><a href='http://www.fiddlertool.com'>Fiddler</a> can act as a man-in-the-middle and decrypt SSL traffic, but then System.Net.Security rightfully complains about an invalid remote certificate ("The remote certificate is invalid according to the validation procedure."). This results in a System.Net.WebException "The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.".</p>
<p>To prevent this from happening:</p>
<pre class="codesample">
<span style="color: #2b91af;">ServicePointManager</span>.ServerCertificateValidationCallback = <span style="color: blue;">delegate</span> { <span style="color: blue;">return</span> <span style="color: blue;">true</span>; };
</pre>
<p>Just be sure to not include this in production code :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/22/making-httpwebrequest-work-while-having-fiddler-decrypt-ssl/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Registration-free COM</title>
		<link>http://grootveld.com/archives/16/registration-free-com</link>
		<comments>http://grootveld.com/archives/16/registration-free-com#comments</comments>
		<pubDate>Fri, 30 Mar 2007 22:40:25 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[COM]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/16</guid>
		<description><![CDATA[A while ago, I had the following problem:

The build system needed to run a unit test of some code that depended on some COM object.

That COM object was not installed on the build system (it wasn't a part of the system we were developing).

Installing that COM object would mean having to install a large system [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago, I had the following problem:</p>
<ul>
<li>The build system needed to run a unit test of some code that depended on some COM object.
</li>
<li>That COM object was not installed on the build system (it wasn't a part of the system we were developing).
</li>
<li>Installing that COM object would mean having to install a large system with all kinds of dependencies &mdash; not exactly something I wanted to do on the build machine...</li>
</ul>
<p>Fortunately, the interaction with the particular COM object was very basic. I made a fake implementation of it, just returning hard-coded responses for the few calls I needed. With the fake COM object in place, the unit tests passed.</p>
<p>I added some logic to the build file that checks whether a particular ProgID existed in the registry. If not, the build script registers the fake object, runs the specific tests, and then unregisters it again.<br />If the ProgID is found in the registry, however, just the tests are executed. This allows the build to be also run on a developer's machine containing the back-end system (and not mess up its COM registration). Works great.</p>
<p>Fast-forward to yesterday.</p>
<p>Triggered by a discussion with a co-worker about the fact that the unit tests aren't nicely isolated from the back-end system this way, I suddenly remembered reading about registration-free COM on <a href='http://blogs.msdn.com/junfeng/archive/2006/04/20/579748.aspx' title='Junfeng Zhang&apos;s blog post about registration-free COM'>Junfeng Zhang&apos;s blog</a>.</p>
<h3>Registration-free COM</h3>
<p>As the name implies, registration-free COM makes it possible to use COM objects without registering them. An application gets all activation information (typelib, ProgID-to-CLSID mapping, threading model and the like) from a <a href='http://msdn2.microsoft.com/en-us/library/aa375632.aspx' title='Description of side-by-side manifest and configuration files at http://www.microsoft.com'>manifest file</a>, instead of reading it from the registry. This allows multiple applications to use different versions of a COM object, with the same ProgID and/or CLSID.</p>
<p>That's a much nicer solution for my original problem &mdash; I no longer have to dynamically register and unregister my fake implementation, and I can use the fake implementation on systems containing the real one as well.</p>
<h3>A sample manifest file</h3>
<p>The manifest file I'm using looks like this:</p>
<pre class='codesample'>
<span class='TPXMLkw1'>&lt;</span>?xml <span class='TPXMLkw2'>version</span>=<span class='TPXMLstr'>&apos;1.0&apos; </span><span class='TPXMLkw2'>encoding</span>=<span class='TPXMLstr'>&apos;utf-8&apos;</span>?<span class='TPXMLkw1'>&gt;</span>
<span class='TPXMLkw1'>&lt;</span>assembly <span class='TPXMLkw2'>manifestVersion</span>=<span class='TPXMLstr'>&apos;1.0&apos; </span><span class='TPXMLkw2'>xmlns</span>=<span class='TPXMLstr'>&apos;urn:schemas-microsoft-com:asm.v1&apos;</span><span class='TPXMLkw1'>&gt;</span>
  <span class='TPXMLkw1'>&lt;</span>assemblyIdentity <span class='TPXMLkw2'>type</span>=<span class='TPXMLstr'>&apos;win32&apos; </span><span class='TPXMLkw2'>name</span>=<span class='TPXMLstr'>&apos;RegFreeCOM-sample.exe&apos; </span><span class='TPXMLkw2'>version</span>=<span class='TPXMLstr'>&apos;1.0.0.0&apos; </span>/<span class='TPXMLkw1'>&gt;</span>
  <span class='TPXMLkw1'>&lt;</span>file <span class='TPXMLkw2'>name</span>=<span class='TPXMLstr'>&apos;FakeTCMXML.dll&apos;</span><span class='TPXMLkw1'>&gt;</span>
    <span class='TPXMLkw1'>&lt;</span>comClass <span class='TPXMLkw2'>clsid</span>=<span class='TPXMLstr'>&apos;{69c2082a-61b1-4a83-a947-88420fac54fa}&apos;
              </span><span class='TPXMLkw2'>threadingModel</span>=<span class='TPXMLstr'>&apos;Apartment&apos;
              </span><span class='TPXMLkw2'>progid</span>=<span class='TPXMLstr'>&apos;TCMXML.XMLResponder&apos; </span>/<span class='TPXMLkw1'>&gt;</span>
  <span class='TPXMLkw1'>&lt;</span>/file<span class='TPXMLkw1'>&gt;</span>
<span class='TPXMLkw1'>&lt;</span>/assembly<span class='TPXMLkw1'>&gt;</span>
</pre>
<p>I've saved this as <code>RegistrationFreeCOM.exe.manifest</code> in the same directory as my test application <code>RegistrationFreeCOM.exe</code>, and also copied my fake implementation <code>FakeTCMXML.dll</code> into that directory. The test application will activate <code>TCMXML.XMLResponder</code> from <code>FakeTCMXML.dll</code>, regardless of whether that ProgID already occurs in the registry, and without affecting that registration.</p>
<h3>Creating a manifest file</h3>
<p>For many scenarios, the sample manifest file is sufficient: just update the 'name', 'clsid' and 'progid' attributes. You can find the value for 'clsid' in the IDL for your component, or by using OleView.<br />
You can also have Visual Studio 2005 create a manifest file for you: create a throw-away project, reference your COM dll, view the properties of that reference, and toggle the 'Isolated' flag to 'True'. When you build the project, the manifest file will be generated.</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/16/registration-free-com/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Copying message box text to the clipboard</title>
		<link>http://grootveld.com/archives/13/copying-message-box-text-to-the-clipboard</link>
		<comments>http://grootveld.com/archives/13/copying-message-box-text-to-the-clipboard#comments</comments>
		<pubDate>Tue, 09 May 2006 20:22:26 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/13</guid>
		<description><![CDATA[
(This post triggered by receiving a lovely screen dump of a message box. A message box covering almost the complete screen, and containing lots of serialized XML. XML containing lots of entitified HTML...)
]]></description>
			<content:encoded><![CDATA[<p><img src='/images/Dialog2Clipboard.png' width='314' height='100' alt='Screen dump of standard Windows message box containing the text &quot;Did you know that CTRL-C copies this text to the clipboard?&quot;'/></p>
<p>(This post triggered by receiving a lovely <em>screen dump</em> of a message box. A message box covering almost the complete screen, and containing lots of serialized XML. XML containing lots of entitified HTML...)</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/13/copying-message-box-text-to-the-clipboard/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Displaying VMWare Server status on the desktop</title>
		<link>http://grootveld.com/archives/7/displaying-vmware-server-status-on-the-desktop</link>
		<comments>http://grootveld.com/archives/7/displaying-vmware-server-status-on-the-desktop#comments</comments>
		<pubDate>Tue, 02 May 2006 19:55:00 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[VMWare]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/blog/archives/7</guid>
		<description><![CDATA[In another post, I provided a VB script that outputs the status of the guests running on a VMWare Server. With a tiny modification that script can be used within Sysinternals' BGInfo, to display this information on the host's desktop:

In order to do this, change the line "WScript.Echo s" to "Echo s". In BGInfo, create [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="/archives/6" title="Using VmCOM to display the status of VMWare Server guests">another post</a>, I provided a VB script that outputs the status of the guests running on a VMWare Server. With a tiny modification that script can be used within Sysinternals' <a href="http://www.sysinternals.com/Utilities/BgInfo.html" title="Links to the BGInfo page on http://www.sysinternals.com">BGInfo</a>, to display this information on the host's desktop:</p>
<p><img class='screenshot' src="/images/vmware-bginfo.png" width='400' height='139' alt="Screenshot showing information about VMWare guests on the desktop"/></p>
<p>In order to do this, change the line "<code>WScript.Echo s</code>" to "<code>Echo s</code>". In BGInfo, create a VBScript Custom field, by clicking "Custom...", "New...", selecting "VB Script file" and entering a field name and the path to your script.</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/7/displaying-vmware-server-status-on-the-desktop/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using VmCOM to display the status of VMWare Server guests</title>
		<link>http://grootveld.com/archives/6/displaying-the-status-of-vmware-server-guests</link>
		<comments>http://grootveld.com/archives/6/displaying-the-status-of-vmware-server-guests#comments</comments>
		<pubDate>Sat, 29 Apr 2006 13:17:05 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[VMWare]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/blog/archives/6</guid>
		<description><![CDATA[VmCOM is a COM-based API that allows you to control VMWare Server from your own software. As an example, the following script displays the status of each registered guest:

Option Explicit
Dim cp, server, vmCollection, vmName, vm, s

Const vmErr_VMBusy = &#38;H80040215
Const vmExecutionState_On = 1
Const vmExecutionState_Off = 2
Const vmExecutionState_Suspended = 3
Const vmExecutionState_Stuck = 4

Set cp = CreateObject("VmCOM.VmConnectParams")
Set server [...]]]></description>
			<content:encoded><![CDATA[<p>VmCOM is a COM-based API that allows you to control <a href="http://www.vmware.com/products/server/" title="Links to the VMWare Server page on http://www.vmware.com">VMWare Server</a> from your own software. As an example, the following script displays the status of each registered guest:</p>
<pre class='codesample'>
<span class="TPVBkw1">Option Explicit</span>
<span class="TPVBkw1">Dim </span>cp, server, vmCollection, vmName, vm, s

<span class="TPVBkw1">Const </span>vmErr_VMBusy = &amp;H80040215
<span class="TPVBkw1">Const </span>vmExecutionState_On = 1
<span class="TPVBkw1">Const </span>vmExecutionState_Off = 2
<span class="TPVBkw1">Const </span>vmExecutionState_Suspended = 3
<span class="TPVBkw1">Const </span>vmExecutionState_Stuck = 4

<span class="TPVBkw1">Set </span>cp = <span class="TPVBkw2">CreateObject</span><span class="TPVBbrkt">(</span><span class="TBVBstr">"VmCOM.VmConnectParams"</span><span class="TPVBbrkt">)</span>
<span class="TPVBkw1">Set </span>server = <span class="TPVBkw2">CreateObject</span><span class="TPVBbrkt">(</span><span class="TBVBstr">"VmCOM.VmServerCtl"</span><span class="TPVBbrkt">)</span>

server.Connect cp
<span class="TPVBkw1">Set </span>vmCollection = server.RegisteredVmNames

<span class="TPVBkw1">For Each </span>vmName <span class="TPVBkw1">in </span>vmCollection
   <span class="TPVBkw1">Set </span>vm = <span class="TPVBkw2">CreateObject</span><span class="TPVBbrkt">(</span><span class="TBVBstr">"VmCOM.VmCtl"</span><span class="TPVBbrkt">)</span>
   <span class="TPVBkw1">On error resume next</span>
   vm.Connect cp, vmName
   <span class="TPVBkw1">If </span><span class="TPVBkw2">Err</span>.Number = vmErr_VMBUSY <span class="TPVBkw1">Then</span>
      s = Basename<span class="TPVBbrkt">(</span>vmName<span class="TPVBbrkt">) </span>&amp; <span class="TBVBstr">":      BUSY"</span>
   <span class="TPVBkw1">ElseIf </span><span class="TPVBkw2">Err</span>.Number &lt;&gt; 0 <span class="TPVBkw1">Then</span>
      s = Basename<span class="TPVBbrkt">(</span>vmName<span class="TPVBbrkt">) </span>&amp; <span class="TBVBstr">":     ERROR"</span>
   <span class="TPVBkw1">Else</span>
      <span class="TPVBkw1">On Error Goto </span>0
      s = vm.Config<span class="TPVBbrkt">(</span><span class="TBVBstr">"displayName"</span><span class="TPVBbrkt">) </span>&amp; <span class="TBVBstr">": " </span>&amp; State2Str<span class="TPVBbrkt">(</span>vm<span class="TPVBbrkt">)</span>
   <span class="TPVBkw1">End if</span>
   WScript.Echo s
<span class="TPVBkw1">next</span>

<span class="TPVBkw1">Function </span>State2Str<span class="TPVBbrkt">(</span><span class="TPVBkw1">ByVal </span>vm<span class="TPVBbrkt">)</span>
  <span class="TPVBkw1">Select Case </span>vm.ExecutionState
      <span class="TPVBkw1">Case </span>vmExecutionState_On
         State2Str = <span class="TBVBstr">"       ON"</span>
      <span class="TPVBkw1">Case </span>vmExecutionState_Off
         State2Str = <span class="TBVBstr">"      OFF"</span>
      <span class="TPVBkw1">Case </span>vmExecutionState_Suspended
         State2Str = <span class="TBVBstr">"SUSPENDED"</span>
      <span class="TPVBkw1">Case </span>vmExecutionState_Stuck
         State2Str = <span class="TBVBstr">"    STUCK"</span>
      <span class="TPVBkw1">Case else</span>
         State2Str = <span class="TBVBstr">"  UNKNOWN"</span>
   <span class="TPVBkw1">End Select</span>
<span class="TPVBkw1">End Function</span>

<span class="TPVBkw1">Function </span>Basename<span class="TPVBbrkt">(</span><span class="TPVBkw1">ByVal </span>path<span class="TPVBbrkt">)</span>
   <span class="TPVBkw1">Dim </span>pos
   pos = <span class="TPVBkw2">InstrRev</span><span class="TPVBbrkt">(</span>path, <span class="TBVBstr">"\"</span><span class="TPVBbrkt">)</span>
   <span class="TPVBkw1">If </span>pos &gt; 0 <span class="TPVBkw1">Then</span>
      Basename = <span class="TPVBkw2">Mid</span><span class="TPVBbrkt">(</span>path, pos + 1<span class="TPVBbrkt">)</span>
   <span class="TPVBkw1">Else</span>
      Basename = path
   <span class="TPVBkw1">End If</span>
<span class="TPVBkw1">End Function</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/6/displaying-the-status-of-vmware-server-guests/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMD does not support UNC paths as current directories. Use PUSHD instead.</title>
		<link>http://grootveld.com/archives/5/test-post</link>
		<comments>http://grootveld.com/archives/5/test-post#comments</comments>
		<pubDate>Tue, 25 Apr 2006 18:41:43 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/blog/archives/5</guid>
		<description><![CDATA[CMD.exe does not allow changing the current directory to a UNC path. If you try, it complains that "CMD does not support UNC paths as current directories.".
PUSHD to the rescue:
C:\\> pushd \\\\serendipity\\D$
Z:\\>

   Do something here with the files on Z:

Z:\\> popd
C:\\> _
PUSHD temporarily maps a drive letter to the specified UNC share (starting [...]]]></description>
			<content:encoded><![CDATA[<p><code>CMD.exe</code> does not allow changing the current directory to a UNC path. If you try, it complains that "CMD does not support UNC paths as current directories.".</p>
<p><code>PUSHD</code> to the rescue:</p>
<pre class="dosbox">C:\\> pushd \\\\serendipity\\D$
Z:\\>

   <em>Do something here with the files on Z:</em>

Z:\\> popd
C:\\> _</pre>
<p><code>PUSHD</code> temporarily maps a drive letter to the specified UNC share (starting from <code>Z:</code> on down until it finds one that's available). Until you call <code>POPD</code>, you can access the share via that drive letter (also from other DOS boxes and Windows Explorer).</p>
<p>Sure beats mapping and unmapping shares all the time, but keep in mind that the <code>PUSHD</code> trick only works if you don't need to specify credentials to access the share.</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/5/test-post/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
