<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.orcsweb.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Jeff's Blog</title><subtitle type="html" /><id>http://blogs.orcsweb.com/jeff/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.orcsweb.com/jeff/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61129.2">Community Server</generator><updated>2007-02-02T11:59:00Z</updated><entry><title>Closing open file handles</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2008/05/29/closing-open-file-handles.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2008/05/29/closing-open-file-handles.aspx</id><published>2008-05-29T21:26:00Z</published><updated>2008-05-29T21:26:00Z</updated><content type="html">&lt;p&gt;Every now and then we have problems deleting or changing permissions on a file because it is open by a process. However, we often times have trouble finding that process. There is a neat sysinternals (now MS) utility called &amp;quot;&lt;a href="http://www.microsoft.com/technet/sysinternals/ProcessesAndThreads/Handle.mspx" title="Handle" target="_blank"&gt;handle&lt;/a&gt;&amp;quot; that will show you all open handles on a file, and, more importantly, let you close that handle. Below is the syntax of how to find the handle, and close it:&lt;/p&gt;&lt;p&gt;To find the handle:&lt;/p&gt;&lt;p&gt;O:\Tools&amp;gt;handle C:\Test\Example.dll&lt;/p&gt;&lt;p&gt;Handle v3.31&lt;br /&gt;Copyright (C) 1997-2008 Mark Russinovich&lt;br /&gt;Sysinternals - &lt;a href="http://www.sysinternals.com/"&gt;www.sysinternals.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;svchost.exe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pid: 1388&amp;nbsp;&amp;nbsp;&amp;nbsp; 240: C:\Test\Example.dll&lt;/p&gt;&lt;p&gt;The above output shows us the name of the process, the pid, and file handle (in hex) and the file name. If we wanted to see all handles by a particular process, we could use the &amp;ndash;p option:&lt;/p&gt;&lt;p&gt;O:\Tools&amp;gt;handle -p 1388&lt;/p&gt;&lt;p&gt;Handle v3.31&lt;br /&gt;Copyright (C) 1997-2008 Mark Russinovich&lt;br /&gt;Sysinternals - &lt;a href="http://www.sysinternals.com/"&gt;www.sysinternals.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\System32&lt;br /&gt;&amp;nbsp;&amp;nbsp; 74: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\System32\en-US\svchost.exe.mui&lt;br /&gt;&amp;nbsp; 194: Section&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \BaseNamedObjects\__ComCatalogCache__&lt;br /&gt;&amp;nbsp; 198: Section&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \BaseNamedObjects\__ComCatalogCache__&lt;br /&gt;&amp;nbsp; 1A4: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\Registration\R00000000000f.clb&lt;br /&gt;&amp;nbsp; 1B0: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\System32\en-US\crypt32.dll.mui&lt;br /&gt;&amp;nbsp; 1B4: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\winsxs\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_152e7382f3bd50c6&lt;br /&gt;&amp;nbsp; 1C0: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\winsxs\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_152e7382f3bd50c6&lt;br /&gt;&amp;nbsp; 1CC: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\System32\inetsrv\config\schema&lt;br /&gt;&amp;nbsp; 1D8: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\CONFIG&lt;br /&gt;&amp;nbsp; 1DC: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\CONFIG&lt;br /&gt;&amp;nbsp; 1E0: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\System32\inetsrv\config&lt;br /&gt;&amp;nbsp; 1E8: Section&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \RPC Control\DSEC56c&lt;br /&gt;&amp;nbsp; 1FC: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\winsxs\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_152e7382f3bd50c6&lt;br /&gt;&amp;nbsp; 200: Section&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \BaseNamedObjects\windows_shell_global_counters&lt;br /&gt;&amp;nbsp; 240: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\Test\Example.dll&lt;br /&gt;&amp;nbsp; 264: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\System32\en-US\kernel32.dll.mui&lt;br /&gt;&amp;nbsp; 284: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\WINDOWS\System32\inetsrv\config&lt;/p&gt;&lt;p&gt;This happens to be a Windows 2008 box, so I can take it one step further and find the service via task manager:&lt;/p&gt;&lt;p&gt;&lt;img alt="Process" height="32" src="http://blogs.orcsweb.com/jeff/images/process.gif" style="width:278px;height:32px;" title="Process" width="278" /&gt;&lt;/p&gt;&lt;p&gt;Since we need to delete or change this file and windows is not allowing me to since it is locked by the FTP service, I can forcefully close the handle by specifying the handle and pid (*Note: This should be used with care as it can cause the process to crash. Consider using this as a last resort instead of restarting a service or rebooting to free the lock):&lt;/p&gt;&lt;p&gt;O:\Tools&amp;gt;handle -c 240 -p 1388&lt;/p&gt;&lt;p&gt;Handle v3.31&lt;br /&gt;Copyright (C) 1997-2008 Mark Russinovich&lt;br /&gt;Sysinternals - &lt;a href="http://www.sysinternals.com/"&gt;www.sysinternals.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 240: File&amp;nbsp; (---)&amp;nbsp;&amp;nbsp; C:\Test\Example.dll&lt;br /&gt;Close handle 240 in svchost.exe (PID 1388)? (y/n) y&lt;/p&gt;&lt;p&gt;Handle closed.&lt;/p&gt;&lt;p&gt;The file can now be modified/deleted.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=33743" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Using IIS Debug Diagnostics to troubleshoot Worker Process CPU usage in II6</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2008/05/29/using-iis-debug-diagnostics-to-troubleshoot-worker-process-cpu-usage-in-ii6.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2008/05/29/using-iis-debug-diagnostics-to-troubleshoot-worker-process-cpu-usage-in-ii6.aspx</id><published>2008-05-29T21:18:00Z</published><updated>2008-05-29T21:18:00Z</updated><content type="html">&lt;p&gt;Failed request tracing in IIS7 can help track down many performance issues with websites, but we still have a broad customer base on IIS6. Troubleshooting performance issues in IIS6 has been quite difficult until Microsoft released a set of tools that gave greater insight into analyzing a stack trace.&lt;/p&gt;&lt;p&gt;The &lt;a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1286" title="IIS Debug Diagnostics Tool" target="_blank"&gt;IIS Debug Diagnostics Tool&lt;/a&gt;&amp;nbsp;can help track down CPU and memory issues from a worker process. Microsoft has a nice kb article that goes over the basics as well: &lt;a href="http://support.microsoft.com/kb/919791"&gt;http://support.microsoft.com/kb/919791&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;1. Install the IIS Debug Diagnostics locally on the system.&lt;/p&gt;&lt;p&gt;2. Open the Debug Diagnostics Tool under Start &amp;gt; Programs &amp;gt; IIS Diagnostics &amp;gt; Debug Diagnostics Tool &amp;gt; Debug Diagnostics Tool.&lt;/p&gt;&lt;p&gt;3. Click Tools &amp;gt; Options And Settings &amp;gt; Performance Log tab. Select the Enable Performance Counter Data Logging option. Click OK.&lt;/p&gt;&lt;p&gt;4. Use task manager to find the PID of the worker process.&lt;/p&gt;&lt;p&gt;5. Select the Processes tab and find the process in the list.&lt;/p&gt;&lt;p&gt;6. Right-click on the process and select Create Full Userdump. This will take a few minutes and a box will pop-up giving you the path to the dump file.&lt;/p&gt;&lt;p&gt;7. Select the Advanced Analysis tab and click the Add Data Files button. Browse to the dump file that was jump created and click OK.&lt;/p&gt;&lt;p&gt;8. Select Crash/Hang Analyzers from the Available Analysis Scripts box for CPU Performance and crash analysis. Click Start Analysis.&lt;/p&gt;&lt;p&gt;After a few minutes, a report should be generated containing stack trace information&amp;nbsp;as well as information about any requests executing for longer than 90 seconds. Note that the memory dump with use a few hundred megabytes of space, so be sure to install the tool on a drive with sufficient debugging space. Also, if the box is under heavy load, you can create the user dump on the system, copy the file to your workstation, and perform the analysis locally.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=33742" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>IIS6: 404 Error serving content with .com in URL</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2008/03/17/iis6-404-error-serving-content-with-com-in-url.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2008/03/17/iis6-404-error-serving-content-with-com-in-url.aspx</id><published>2008-03-17T15:49:00Z</published><updated>2008-03-17T15:49:00Z</updated><content type="html">&lt;p&gt;We ran into an issue today where a customer was having problems serving content from a folder named &amp;quot;example.com&amp;quot;. IIS6 was simply returning a 404 error. I immediately suspected something like URLScan but I eventually found it was due to the execute permissions configured on the parent&amp;nbsp;virtual directory. When the customer configured the virtual directory, they set the execute permissions to &amp;quot;Scripts and executables&amp;quot;. This means that IIS will try to run any cgi compliant&amp;nbsp;executables (.com and .exe files by default) in the virtual directory. In order to run the application, the executable also needs to be authorized in Web Service Extensions.&lt;/p&gt;&lt;p&gt;However, in this case, the URL simply contained &amp;quot;example.com&amp;quot; in the URL: &lt;a href="http://server/example.com/images/image1.jpg"&gt;http://server/example.com/images/image1.jpg&lt;/a&gt;&amp;nbsp;and we were not trying to run an application. IIS was seeing the &amp;quot;example.com&amp;quot; in the URL and assuming it was a cgi executable and attempting to run the application. However, the&amp;nbsp;file &amp;quot;example.com&amp;quot;&amp;nbsp;did not exist and was therefore returning a 404 error. To correct the issue, we simply set the execute permissions to &amp;quot;None&amp;quot; since the customer was attempting to serve static content, though you can also use &amp;quot;Scripts only&amp;quot;.&lt;/p&gt;&lt;p&gt;The key to this is that there does not need to be a specifc mapping for executables. IIS 6 will attempt to run any executable if the vdir is configured with &amp;quot;Scripts and executables&amp;quot; permissions.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=32268" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Calculating disk usage and capacity using Diskmon</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2008/01/09/disk-usage-and-capacity.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2008/01/09/disk-usage-and-capacity.aspx</id><published>2008-01-09T14:18:00Z</published><updated>2008-01-09T14:18:00Z</updated><content type="html">&lt;p&gt;While evaluating SAN storage solutions for our VMWare environment, we found ourselves asking the question &amp;quot;How many systems can we fit on this system before IOPs and/or throughput become a bottleneck?&amp;quot; Come to find out, the answer is not a simple one. In fact, all of the vendors we posed this question to were only able to give us vauge performance numbers based on perfect conditions. We set out on a quest to quantify the capacity of each of the backend storage systems we tested.&lt;/p&gt;&lt;p&gt;Generally speaking IOPs&amp;nbsp;is&amp;nbsp;inversely proportional to the request size while throughput is proportional. This means that as the request size descreases the total number of IOPs increases while throughput decreases and vice&amp;nbsp;versa.&amp;nbsp;So when you see performance numbers that claim very high IOPs those are based on small requests and therefore throughput will be very minimal. In additional, disk latency and rotational speed can play a role in skewing these numbers as well. Sequential operations will produce much higher numbers than random operations. When we add RAID to the equation, we will see a difference in numbers depending upon whether the operation is a read or a write.&lt;/p&gt;&lt;p&gt;What does all this mean? It means that the performance capacity of a disk or storage device&amp;nbsp;is determined by 3 main factors: Request Size, Random/Sequential operation, and Read/Write operation. There are other factors that can play a role, but focusing on these three factores will provide an estimation of the capacity of a&amp;nbsp;disk, array or storage system. There are differing opinions as to what these numbers are in &amp;quot;real life.&amp;quot; The generally accepted view is that the average request size is 32K, 60% of transactions are random while 40% are sequential, and 65% are&amp;nbsp;reads while 35% are writes. However, these numbers differ depending upon the application. The best way to determine these numbers for your environment is to capture statistics from production systems and average them together.&lt;/p&gt;&lt;p&gt;Fortunately, there is a nice utility for Windows that will allow you to get this information. The Diskmon utility: &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896646.aspx"&gt;http://technet.microsoft.com/en-us/sysinternals/bb896646.aspx&lt;/a&gt;&amp;nbsp;available from SysInternals (now part of Microsoft), will log every disk transaction with the necessary information.&lt;/p&gt;&lt;p&gt;&lt;img alt="Diskmon from SysInternals (now Microsoft)" height="313" src="http://blogs.orcsweb.com/jeff/images/diskmon_1.gif" style="width:501px;height:313px;" title="Diskmon from SysInternals (now Microsoft)" width="501" /&gt;&lt;/p&gt;&lt;p&gt;Diskmon will begin capturing data immediately. To stop Diskmon from capturing data, click the magnifying glass in the toolbar:&lt;/p&gt;&lt;p&gt;&lt;img alt="Stop capture" height="52" src="http://blogs.orcsweb.com/jeff/images/diskmon_2.gif" style="width:66px;height:52px;" title="Stop capture" width="66" /&gt;&lt;/p&gt;&lt;p&gt;You can then save the output to a text file by clicking the save button. I recommend capturing data during normal usage over a reasonable period of time. Also, it is best to minimize the Diskmon window to keep CPU usage to a minimum. The next step is to import the text file into Excel. I have provided a sample excel spreadsheet you can use as a template to perform the necessary calculations: &lt;a href="http://blogs.orcsweb.com/jeff/content/server_diskmon.zip"&gt;http://blogs.orcsweb.com/jeff/content/server_diskmon.zip&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt="Diskmon output to Excel spreadsheet" height="425" src="http://blogs.orcsweb.com/jeff/images/sample_server.gif" style="width:500px;height:425px;" title="Diskmon output to Excel spreadsheet" width="500" /&gt;&lt;/p&gt;&lt;p&gt;By taking a sampling from various systems on our network and using a weighted average, we&amp;nbsp;calculated&amp;nbsp;average of usage on our systems. In our case, we were using a common storage backend, and we wanted to categorize different systems into low (L), medium (M), and high (H) usage systems. We then assigned a percentage to each. By doing this, we can calculate the disk usage on the system if x% are low usage, y% medium usage, and z% high usage.&lt;/p&gt;&lt;p&gt;&lt;img alt="Weighted average of several systems on our network" height="330" src="http://blogs.orcsweb.com/jeff/images/sample_disk_usage.gif" style="width:500px;height:330px;" title="Weighted average of several systems on our network" width="500" /&gt;&lt;/p&gt;&lt;p&gt;We now have an accurate estimation of the&amp;nbsp;Read Request Size, Random/Sequential percentages, and Read/Write percentages. If we feed these numbers into &lt;a href="http://www.iometer.org/" target="_blank"&gt;IOMeter&lt;/a&gt;, we can get a baseline of what the backend storage system can support. Divide that&amp;nbsp;by our weighted average and we can find exactly how many systems our backend can support. If we look at point in time numbers, we can figure out the percentage of disk capacity being used:&lt;/p&gt;&lt;p&gt;&lt;img alt="Capacity of storage backend" height="472" src="http://blogs.orcsweb.com/jeff/images/sample_disk_capacity.gif" style="width:500px;height:472px;" title="Capacity of storage backend" width="500" /&gt;&lt;/p&gt;&lt;p&gt;I have put together a &lt;a href="http://blogs.orcsweb.com/jeff/content/iometer_reallife.zip" target="_blank"&gt;sample IOMeter configuration file&lt;/a&gt; containing the &amp;quot;real life&amp;quot; specification of 32K requests, 60% Random / 40% Sequential, and 65% Reads / 35% Writes. &lt;/p&gt;&lt;p&gt;Also, there&amp;#39;s a great comparison of SAN backends for VMWare environments here: &lt;a href="http://communities.vmware.com/message/584154"&gt;http://communities.vmware.com/message/584154&lt;/a&gt;. Users have run the same real life test against their backend storage systems which will allow you to compare your devices performance with other vendors. &lt;/p&gt;&lt;p&gt;One side note when using IOMeter, be sure to set your disk size to something greater than the amount of cache in your backend storage systems in order to calculate raw disk performance. The configuration file I have provided uses a 8GB test file which should suffice for most installations.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=31816" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>SQL Server Authentication Channnel Encryption</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2008/01/08/sql-server-authentication-channnel-encryption.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2008/01/08/sql-server-authentication-channnel-encryption.aspx</id><published>2008-01-08T21:56:00Z</published><updated>2008-01-08T21:56:00Z</updated><content type="html">&lt;p&gt;We had a customer recently inquire as to whether the authentication channel between a client and a SQL Server was encrypted by default. While we know that SSL is supported on SQL Server 2005, we did not have a certificate installed. However, it was rumored that the system would use a self-signed certificate. Also, we wanted to explore the differences between SQL Server 2000 and SQL Server 2005, as well as the differences between different providers.&lt;/p&gt;&lt;p&gt;I searched for documentation confirming that the authentication channel was indeed encrypted and was able to come up with the following from this MSDN article: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms189067.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms189067.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;ldquo;Microsoft SQL Server 2005 can use Secure Sockets Layer (SSL) to encrypt data that is transmitted across a network between an instance of SQL Server and a client application. The SSL encryption is performed within the protocol layer and is available to all SQL Server clients except DB Library and MDAC 2.53 clients.&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;ldquo;Credentials (in the login packet) that are transmitted when a client application connects to SQL Server 2005 are always encrypted. SQL Server will use a certificate from a trusted certification authority if available. If a trusted certificate is not installed, SQL Server will generate a self-signed certificate when the instance is started, and use the self-signed certificate to encrypt the credentials. This self-signed certificate helps increase security but it does not provide protection against identity spoofing by the server. If the self-signed certificate is used, and the value of the ForceEncryption option is set to Yes, all data transmitted across a network between SQL Server and the client application will be encrypted using the self-signed certificate.&amp;rdquo;&lt;/p&gt;&lt;p&gt;Well, this contradicted some posts I had read but did point us in the right direction. So, we decided to test this. I setup two Virtual Machines, one running a .NET web application and a .NET windows application, and one running SQL Server 2005 Express Edition. I then installed Network Monitor 3.1 and captured the traffic on the NIC as we tested the connection using the SQL Native Client (SQLNCLI) and OLEDB (System.Data.SqlClient).&lt;/p&gt;&lt;p&gt;We saw the server send a self-signed certificate to the client and after which, the authentication channel was encrypted. We also ran the same test on SQL Server 2000. While the authentication channel is not encrypted with SQL Server 2000, the password is not sent in clear text. Rather, it appears obfuscated - most likely using an offset of some kind. We did see the username come across in clear text.&lt;/p&gt;&lt;p&gt;To summarize, when using SQL Server 2005, the authentication channel is completely encrypted when using any clients except DB Library and MDAC 2.53 clients regardless of whether the server has a SSL certificate installed.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=31639" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Clear stale ESX iSCSI targets</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/12/17/clear-stale-esx-iscsi-targets.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/12/17/clear-stale-esx-iscsi-targets.aspx</id><published>2007-12-17T22:00:00Z</published><updated>2007-12-17T22:00:00Z</updated><content type="html">&lt;p&gt;During our beta testing of our new VMWare environment, we created various volumes and then deleted them. After removing them from the Equallogic SAN, we found ESX server was still trying to login to those targets. After some research, I stumbled across the following files containing the stale entries:&lt;/p&gt;&lt;p&gt;[root@vmware root]# cd /var/lib/iscsi&lt;br /&gt;[root@vmware iscsi]# ls -la&lt;br /&gt;total 16&lt;br /&gt;drwx------&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Dec 17 12:11 .&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp; 11 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096 Oct 23 09:17 ..&lt;br /&gt;-rw-------&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 830 Dec 17 11:22 vmkbindings&lt;br /&gt;-rw-------&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 474 Dec 17 12:16 vmkdiscovery&lt;br /&gt;[root@vmware iscsi]#&lt;/p&gt;&lt;p&gt;Put the host into maintenance mode, then edit both the /var/lib/iscsi/vmkbindings and /var/lib/iscsi/vmkdiscovery files to remove the stale entries. Reboot the host&amp;nbsp;and exit maintenance mode. Lastly, rescan the HBA:&lt;/p&gt;&lt;p&gt;esxcfg-swiscsi -s&lt;/p&gt;&lt;p&gt;Repeat for all hosts that are attempting to&amp;nbsp;use the stale entries.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=26432" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Windows 2003 SP2 Network Issues</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/11/12/windows-2003-sp2-network-issues.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/11/12/windows-2003-sp2-network-issues.aspx</id><published>2007-11-12T16:39:00Z</published><updated>2007-11-12T16:39:00Z</updated><content type="html">&lt;p&gt;Included with SP2 is the Scalable Networking Pack which was a redeisgn of some major networking components to offload some of the processing to onboard components of certain network cards. Unfortunately, this seems to still be in its infancy and we started noticing very strange problems right away. A colleauge found this post on the MS Exchange team&amp;#39;s blog which ultimately led us to the answer: &lt;a href="http://msexchangeteam.com/archive/2007/07/18/446400.aspx"&gt;http://msexchangeteam.com/archive/2007/07/18/446400.aspx&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The symptoms we noted on our side were specifically that OS X users behind certain NAT firewalls would timeout when trying to retrieve pages from our web servers. After weeks of troublehsooting, we finally narrowed it down to a problem where pages&amp;nbsp;less than 1440 bytes worked fine, but larger pages simply timed out. We also noticed that some of our technicians had problems connecting via RDP to various servers. The initial connection would drop, but sub-sequent connections worked find. Most of our Dell systems have onboard Broadcom NIC&amp;#39;s. Supposedly, this new Networking Pack which is enabled by default works only with the latest drivers. However, we found that even using the latest drivers provided directly from Broadcom, we were still having problems. &lt;/p&gt;&lt;p&gt;&amp;nbsp;Luckily, the fix does not require a reboot and is easily implemented. Simply disabling the tcp chimney offload solved all of our issues:&lt;/p&gt;&lt;p&gt;&amp;nbsp;netsh int ip set chimney disabled&lt;/p&gt;&lt;p&gt;You can view the state of each of the connections to the server and their offload state by running the netstat -t command.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=16300" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Emulating keyboard events in .NET</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/10/01/emulating-keyboard-events-in-net.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/10/01/emulating-keyboard-events-in-net.aspx</id><published>2007-10-01T19:33:00Z</published><updated>2007-10-01T19:33:00Z</updated><content type="html">&lt;p&gt;Every now and then, you may need to emulate pressing keys on a keyboard to accomplish things through code. I found I needed to utilize this method for an Outlook programming project. After a little searching, I was able to emulate a user pressing the &amp;quot;ALT&amp;quot; button twice. You can use the keybd_event&amp;nbsp;function (&lt;a href="http://msdn2.microsoft.com/en-us/library/ms646304.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms646304.aspx&lt;/a&gt;) to&amp;nbsp;emulate keyboard events:&lt;/p&gt;&lt;p&gt;&amp;nbsp;Imports System.Runtime.InteropServices&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;#39;List of virtual key codes: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms645540.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms645540.aspx&lt;/a&gt;&lt;br /&gt;&amp;nbsp;Const VK_SHIFT = &amp;amp;H10&lt;br /&gt;&amp;nbsp;Const VK_NUMLOCK = &amp;amp;H90&lt;br /&gt;&amp;nbsp;Const VK_ESC = &amp;amp;H1B&lt;br /&gt;&amp;nbsp;Const VK_MENU = &amp;amp;H12 &amp;#39;This is the ALT key&lt;br /&gt;&amp;nbsp;Const KEYEVENTF_KEYUP As Integer = &amp;amp;H2&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;lt;DllImport(&amp;quot;user32&amp;quot;)&amp;gt; _&lt;br /&gt;&amp;nbsp;Public Sub keybd_event(ByVal vk As Byte, ByVal sc As Byte, ByVal Flags As Integer, ByVal dwExtraInfo As Integer)&lt;br /&gt;&amp;nbsp;End Sub&lt;/p&gt;&lt;p&gt;&amp;nbsp;Public Sub PressAltKeyTwice()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;#39;Simulate Key Press&lt;br /&gt;&amp;nbsp;&amp;nbsp; keybd_event(VK_MENU, vbNull, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;#39;Simulate Key Release&lt;br /&gt;&amp;nbsp;&amp;nbsp; keybd_event(VK_MENU, vbNull, KEYEVENTF_KEYUP, 0)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; Application.DoEvents() &amp;#39;This was needed in my code to register the first keypress. If I did not have this, the system acted as though I press it only once.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;#39;Simulate Key Press&lt;br /&gt;&amp;nbsp;&amp;nbsp; keybd_event(VK_MENU, vbNull, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;#39;Simulate Key Release&lt;br /&gt;&amp;nbsp;&amp;nbsp; keybd_event(VK_MENU, vbNull, KEYEVENTF_KEYUP, 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Application.DoEvents()&lt;/p&gt;&lt;p&gt;&amp;nbsp;End Sub&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=8434" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Enabling two-way communication between javascript and parent WebBroswer class</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/10/01/enabling-two-way-communication-between-javascript-and-parent-webbroswer-class.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/10/01/enabling-two-way-communication-between-javascript-and-parent-webbroswer-class.aspx</id><published>2007-10-01T19:13:00Z</published><updated>2007-10-01T19:13:00Z</updated><content type="html">&lt;p&gt;When I began looking for a way to do this, I thought it was going to be very difficult. What I wanted, was a javascipt method inside a WebBrowser object hosted in&amp;nbsp;a Custom Task Pane, to call a method in the parent object&amp;#39;s class that would then call a method in the web page view of a folder, which would then execute client-side javascript inside that HTML document object. Fortunately, this is a very easy task by utilizing two methods: window.external and HTMLDoc.parentWindow.execScript.&lt;/p&gt;&lt;p&gt;Getting a client-side javascript method to invoke a method inside the parent class is as simple as using:&lt;/p&gt;&lt;p&gt;- In the HTML code:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;lt;a href=&amp;quot;http://blogs.orcsweb.com/ControlPanel/Blogs/posteditor.aspx?SelectedNavItem=NewPost#&amp;quot; onclick=&amp;quot;BLOCKED SCRIPTwindow.external.MyMethod(var1, var2);&amp;quot;&amp;gt;Invoke MyMethod&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;- In parent object&amp;#39;s class&amp;nbsp;&lt;/p&gt;&lt;p&gt;Public Sub MyMethod(ByVal var1 As String, ByVal var2 As String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(&amp;quot;Var1: &amp;quot; &amp;amp; var1 &amp;amp; &amp;quot;, Var2: &amp;quot; &amp;amp; var2)&lt;br /&gt;End Sub&lt;/p&gt;&lt;p&gt;In Outlook, if the current folder is set to use a web view instead of the standard folder list, the Application.ActiveExplorer.HTMLDocument reference will contain a valid mshtml.HTMLDocument object (it will throw an exception otherwise). Executing client-side javascript (or vbscript in my case) is as easy as calling the parentWindow.execScript method:&lt;/p&gt;&lt;p&gt;&amp;nbsp;Dim oHTMLDoc As mshtml.HTMLDocument&lt;/p&gt;&lt;p&gt;oHTMLDoc = Application.ActiveExplorer.HTMLDocument&lt;/p&gt;&lt;p&gt;oHTMLDoc.parentWindow.execScript(&amp;quot;ClientSideMethod(&amp;#39;&amp;quot; &amp;amp; Var1 &amp;amp; &amp;quot;&amp;#39;,&amp;#39;&amp;quot; &amp;amp; var2 &amp;amp; &amp;quot;&amp;#39;)&amp;quot;)&lt;/p&gt;&lt;p&gt;The point of doing this is that the web page view of the folder contains an Outlook View Control object, and using the above methods, we are able to set the &amp;quot;Restriction&amp;quot; property of the object from a web page hosted inside a custom task pane.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=8433" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Resource Protocol in .NET</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/10/01/resource-protocol-in-net.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/10/01/resource-protocol-in-net.aspx</id><published>2007-10-01T18:12:00Z</published><updated>2007-10-01T18:12:00Z</updated><content type="html">&lt;p&gt;I never liked deploying an application that had numerous dependencies as there just seemed to be more room for error. When I discovered the resource protocol (res://), it seemed like a great way to embed HTML files I needed to distribute with my Outlook add-in. The nice part is that there is a single file deployed to the user&amp;#39;s system and you avoid any issues of users accidentally removing dependency files or similar headaches. I originally thought it would be as easy as adding my HTML file as a resource in my Visual Studio project, but come to find out that would create a managed resource (resx:// protocol). Unfortunately, the resx protocol has two glaring limitations:&lt;/p&gt;&lt;p&gt;From MSDN (&lt;a href="https://msdn2.microsoft.com/en-us/library/bb189724.aspx"&gt;https://msdn2.microsoft.com/en-us/library/bb189724.aspx&lt;/a&gt;):&lt;/p&gt;&lt;p&gt;The resx:// protocol is designed to load resources from .resx files that are embedded into managed assemblies, with the following limitations: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;The resx:// protocol is used to load resources from a managed assembly, which must be strong-name signed and located in either %windir%\ehome or the global assembly cache (GAC). &lt;/li&gt;&lt;li&gt;In the syntax resx://&lt;em&gt;myassembly&lt;/em&gt;/&lt;em&gt;myresourcefile&lt;/em&gt;/&lt;em&gt;myresourceidentifier&lt;/em&gt;, the &lt;em&gt;myassembly&lt;/em&gt; parameter does not have a file extension, so you cannot have a managed DLL and EXE with the same name and be able to load resources from both of them. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So I set out on a quest to figure out how to embed&amp;nbsp;a HTML file into my DLL&amp;nbsp;and access it using the resource protocol. It actually isn&amp;#39;t that difficult, but the documentation is scarce. Thanks to Wouter van Vugt&amp;#39;s&amp;nbsp;post (&lt;a href="http://tinyurl.com/34pezy"&gt;http://tinyurl.com/34pezy&lt;/a&gt;), I was able to stumble my way through it. Here are the steps:&lt;/p&gt;&lt;p&gt;&amp;nbsp;1. Edit your project file (.vbproj or .csproj) and add the following:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;PropertyGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Win32Resource&amp;gt;NameOfResourceFile.res&amp;lt;/Win32Resource&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/PropertyGroup&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;2. Create a resource script file named NameOfResourceFile.rc and add it to your project. It should look something like this:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* standard resource # for HTML */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define HTML 23&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* include all resources from external files */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RES_REF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HTML&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;NameOfHTMLFile.html&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* end */&lt;/p&gt;&lt;p&gt;3. Add the HTML file named NameOfHTMLFile.html to your project.&lt;/p&gt;&lt;p&gt;4. Add the following to the prebuild commandline (Project Properties &amp;gt; Compile &amp;gt; Build Events):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;C:|Program Files|Microsoft Visual Studio 8|SDK|v2.0|Bin|rc&amp;quot; /r &amp;quot;$(ProjectDir)NameOfResourceFile.rc&amp;quot;&lt;/p&gt;&lt;p&gt;5. Compile you project.&lt;/p&gt;&lt;p&gt;6. Test it. Put this in a browser to load the file: res://NameOfDLL.dll/RES_REF&lt;/p&gt;&lt;p&gt;You can also embed graphics into the resource dll and reference them in the embedded HTML file. Note that you need to specify the resource&amp;nbsp;type in the URL if it is not a HTML resource (the default). For example, if you embed a bitmap, you would reference it like so: res://NameOfDLL.dll/2/NameOfBitmapFile.bmp.&amp;nbsp;You can find a list of common resource types here: &lt;a href="http://msdn2.microsoft.com/en-us/library/aa365064.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa365064.aspx&lt;/a&gt;.&amp;nbsp;Images don&amp;#39;t have an associated resource type, so you would use res://NameOfDLL.dll/GIF/NameOfGIFImage.gif to access the image.&amp;nbsp;Also, you can&amp;#39;t use the resource protocol to access .xsl or .xml files.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=8430" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Remote Debugging in VS 2005</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/08/24/remote-debugging-in-vs-2005.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/08/24/remote-debugging-in-vs-2005.aspx</id><published>2007-08-24T20:05:00Z</published><updated>2007-08-24T20:05:00Z</updated><content type="html">&lt;p&gt;What do you do when you cannot reproduce an issue that is occuring in production in your development environment? Enter the nightmare that is Remote Debugging. For the better part of a day, I have been trying to remotely debug my Exchange transport agent on a production system. Unfortunately, I cannot reproduce the error in our development environment and I cannot install VS 2005 on the Exchange server, so I am forced to pull apart the DLL in production to see exactly what is going on. Well, to my surprise, Microsoft apparently wanted to make this as difficult as possible to accomplish. After scouring the Internet, I seem to have found a solution. Some notes that may save you some time:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;To enable Remote Debugging, you need to run the MSVCMON.EXE file for your platform located under Program Files\Microsoft Visual Studio 8\Common 7\IDE\Remote Debugger (if you are on an x64 machine, the x86 version will be under Program Files (x86) and the x64 version under Program Files).&lt;/li&gt;&lt;li&gt;Be sure that the version of MSVCMON.EXE matches the version of VS 2005 on the debugging system. &lt;/li&gt;&lt;li&gt;The system running VS 2005 will need to know the path to the symbols file on the remote system. It is best to copy the symbols file to the same location as your DLL and set the path under Tools &amp;gt; Options &amp;gt; Debugging (tick Show all settings) &amp;gt; Symbols. Click the folder icon and enter the UNC path to the appropriate location. It is also best to browse to that folder via My Computer to ensure the debugging system can connect to the UNC share properly.&lt;/li&gt;&lt;li&gt;If your system running VS 2005 is behind a NAT firewall, forget about using Remote Debugging. All the testing I have performed and all the information I have found simply says this will not work. Furthermore, you will run into all kinds of problems if there is a firewall between the systems. It is best to use a system on the same subnet as the remote system.&lt;/li&gt;&lt;li&gt;Debugging managed code will not work using&amp;nbsp;the &amp;quot;Remote (Native only with no authentication)&amp;quot; transport or &amp;quot;No Authentication&amp;quot; mode (as indicated by the &amp;quot;native only&amp;quot;) meaning you will have to enable authentication (use &amp;quot;Default&amp;quot; transport). Note that you can view the output of debug messages using the No Authenticate mode, but you will not be able to step through code or set breakpoints.&lt;/li&gt;&lt;li&gt;If the systems are not in the same domain or in domains that do not have trusts configured in both directions, you will need to create local users on each system so neither box can be a domain controller. The local users will need to have the same username and password.&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=4374" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry><entry><title>Outlook 2007 Form Regions</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/04/04/outlook-2007-form-regions.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/04/04/outlook-2007-form-regions.aspx</id><published>2007-04-04T19:00:00Z</published><updated>2007-04-04T19:00:00Z</updated><content type="html">&lt;p&gt;New to Microsoft Outlook 2007 is Form Regions. These nice little pieces of code attach as &amp;quot;sub-forms&amp;quot; to existing forms in Outlook 2007. You can have them display adjoining to the standard Outlook form, as a separate tab, or replace the Outlook form entirely. Technet has a few great samples to play with:&lt;/p&gt;&lt;p&gt;Walkthrough: Creating an Outlook Form Region&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa942741(VS.80).aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa942741(VS.80).aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Building an Outlook 2007 Form Region with a Managed Add-In &lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb226713.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb226713.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Outlook 2007 Sample Add-ins: Rules Add-in, Travel Agency Add-in, and Prepare for Meeting Add-in&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb226710.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb226710.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You really have free reign with what you can do here ... except that form regions do not currently support managed controls, meaning you&amp;#39;ll need to stick with ActiveX controls for now ... though any ActiveX control will work. Here&amp;#39;s a screenshot from an &amp;quot;alpha&amp;quot; version of our ticketing system that uses form regions:&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.orcsweb.com/jeff/images/ol07fr_screen1.gif" target="_blank"&gt;&lt;img alt="Screen1" border="0" height="211" src="http://blogs.orcsweb.com/jeff/images/ol07fr_small1.gif" style="width:474px;height:211px;" title="Screen1" width="474" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The nice thing with forms regions is that they can attach to a standard Outlook form or to a customized form and they finally look and feel like part of Outlook. No more Office 97 style controls. The controls can access user defined fields or, like in our case, we populate them with data from SQL.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=1170" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author><category term="Outlook" scheme="http://blogs.orcsweb.com/jeff/archive/tags/Outlook/default.aspx" /></entry><entry><title>Create a Mail-Enabled Public Folder in Exchange 2007</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/04/04/create-a-mail-enabled-public-folder-in-exchange-2007.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/04/04/create-a-mail-enabled-public-folder-in-exchange-2007.aspx</id><published>2007-04-04T18:57:00Z</published><updated>2007-04-04T18:57:00Z</updated><content type="html">&lt;p&gt;Microsoft is threatening to deprecate Public Folders, though they claim they will maintain support through 2016. The alternative, Windows Sharepoint Services, isn&amp;#39;t a good fit for all circumstances ... specifically when you would like to use a Public Folder as a mailing list. Use the commands below to create a new Mail-Enabled Public Folder:&lt;/p&gt;&lt;p&gt;Create public folder:&lt;br /&gt;- New-PublicFolder &amp;quot;Folder Name&amp;quot;&lt;br /&gt;- Enable-MailPublicFolder &amp;quot;\Folder Name&amp;quot;&lt;br /&gt;- Set-MailPublicFolder -Identity &amp;quot;\Folder Name&amp;quot; -EmailAddressPolicyEnabled 0&lt;br /&gt;- Set-MailPublicFolder -Identity &amp;quot;\Folder Name&amp;quot; -PrimarySMTPAddress &amp;quot;&lt;a href="mailto:foldername@aliasdomain.com"&gt;foldername@aliasdomain.com&lt;/a&gt;&amp;quot;&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=1169" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author><category term="Exchange" scheme="http://blogs.orcsweb.com/jeff/archive/tags/Exchange/default.aspx" /></entry><entry><title>MS Exchange 2007 Transport Agents</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/04/04/ms-exchange-2007-transport-agents.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/04/04/ms-exchange-2007-transport-agents.aspx</id><published>2007-04-04T18:23:00Z</published><updated>2007-04-04T18:23:00Z</updated><content type="html">&lt;p&gt;I haven&amp;#39;t blogged in a while because I have been buried in work writing a new ticketing system based on Exchange 2007 and Outlook 2007. Most of what we&amp;#39;re doing is fairly unexplored (or at least undocumented) territory. For those who have used Event Sinks in previous versions of Exchange, you maybe be happy (or disappointed depending upon your point of view) to find out that Microsoft is deprecating Event Sinks and replacing them with Transport Agents. In my numerous hours scouring the Internet looking for information on how these are implemented, I found just two worthwhile resources:&lt;/p&gt;&lt;p&gt;Transport Agent Tutorial&lt;br /&gt;&lt;a href="http://msexchangeteam.com/archive/2006/12/04/431755.aspx"&gt;http://msexchangeteam.com/archive/2006/12/04/431755.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Transport Agent Sample&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa579185.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa579185.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The first is a blog post from a member of the MS Exchange team, on the other is a sample listed in Technet. Furthermore, nearly all code you&amp;#39;ll find regarding Transport Agents in written in C#. While I have nothing against C# and actually come from a Java background, more of our team is familiar with VB.NET and I feel it&amp;#39;s more human readable. According to Microsoft and the Exchange team, &amp;quot;Agents have full access to all messages they process.&amp;quot; You&amp;#39;ll quickly find out that this isn&amp;#39;t the case. Rather, I should say they don&amp;#39;t &amp;quot;easily&amp;quot; have full access rights to all the messages they process. In fact, strangely&amp;nbsp;most of the properties of the message are read-only which posed some particular issues for our development. Luckily, we found a few workarounds that suited our needs for our environment.&lt;/p&gt;&lt;p&gt;You have two basic types of Transport Agents: Smtp Receive agents and Routing agents. A custom Smtp Receive agent will fire on incoming messages to the Smtp server while they would not fire on outgoing messages on our test environment (a single Exchange 2007 Server running in Hub Transport mode).&amp;nbsp;A&amp;nbsp;custom&amp;nbsp;Routing Agent will fire after a Smtp Receive agent and on outgoing messages. Though I haven&amp;#39;t proven this theory, I would also assume that a Smtp Receive agent would fire on messages transmitted to an Edge Transport Exchange 2007 server. You can find a list of available events your agent can call here: &lt;a href="http://technet.microsoft.com/en-us/library/e7389d63-3172-40d5-bf53-0d7cd7e78340.aspx"&gt;http://technet.microsoft.com/en-us/library/e7389d63-3172-40d5-bf53-0d7cd7e78340.aspx&lt;/a&gt;. You&amp;#39;ll also notice from this page that Microsoft provides numerous built-in agents to handle various tasks.&lt;/p&gt;&lt;p&gt;One of the first snags I had in&amp;nbsp;trying to get the sample agent from Technet running, was the Namespace. VB.NET does not behave in the same manner as C# when it comes to namespaces. In order to use the install&amp;nbsp;command specified in the Technet article, I had to clear the root namespace:&lt;/p&gt;&lt;p&gt;&lt;img alt="Screen1" height="144" src="http://blogs.orcsweb.com/jeff/images/ex07ta_screen1.gif" style="width:521px;height:144px;" title="Screen1" width="521" /&gt;&lt;/p&gt;&lt;p&gt;Another big snag we ran into was changing the MessageClass to the our custom form. Thankfully, Yuri from Microsoft was able to provide a workaround: &lt;a href="http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=1381211&amp;amp;SiteID=17"&gt;http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=1381211&amp;amp;SiteID=17&lt;/a&gt;. I highly recommend using this forum as not only the MVP&amp;#39;s but many of the MS product teams patrol with tons of helpful information.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=1168" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author><category term="Exchange" scheme="http://blogs.orcsweb.com/jeff/archive/tags/Exchange/default.aspx" /></entry><entry><title>SQL Update failure with hidden GridView column</title><link rel="alternate" type="text/html" href="http://blogs.orcsweb.com/jeff/archive/2007/02/02/sql-update-failure-with-hidden-gridview-column.aspx" /><id>http://blogs.orcsweb.com/jeff/archive/2007/02/02/sql-update-failure-with-hidden-gridview-column.aspx</id><published>2007-02-02T16:59:00Z</published><updated>2007-02-02T16:59:00Z</updated><content type="html">&lt;p&gt;As I&amp;#39;m still fairly new to ASP.NET, I came across what seemed to be a rather simple task that didn&amp;#39;t seem possible. I wanted to use&amp;nbsp;a GridView control to display information from an SQL query and allow the user to edit the values in the GridView control. My update SQL statement included a WHERE clause referencing the primary key, an identity field. While it was not necessary to display the value to the user, it is necessary to reference the value in order to update the underlying data. I added the column to my GridView and marked it as hidden. To my surprise, any changes to the data in Edit mode were not saved. I checked and re-checked my update query and everything looked right. I set the column back to visible and voil&amp;agrave;, the edit worked properly. After scouring google for a solution and wading through numerous posts that suggested using CSS to hide the data, I finally came across this little blurb in the ASP.NET GridView&amp;nbsp;documentation on the MSDN site:&lt;br /&gt;&lt;br /&gt;If the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.datacontrolfield.visible.aspx"&gt;Visible&lt;/a&gt; property of a column field is set to &lt;strong&gt;false&lt;/strong&gt;, the column is not displayed in the &lt;strong&gt;GridView&lt;/strong&gt; control and the data for the column does not make a round trip to the client. If you want the data for a column that is not visible to make a round trip, add the field name to the &lt;strong&gt;DataKeyNames&lt;/strong&gt; property.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx"&gt;http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I checked the properties of GridView and surely, no fields were listed in the DataKeyNames property. I added my primary key and removed the column entirely from the GridView. The data was then updated successfully.&lt;/p&gt;&lt;img src="http://blogs.orcsweb.com/aggbug.aspx?PostID=693" width="1" height="1"&gt;</content><author><name>jeff</name><uri>http://blogs.orcsweb.com/members/jeff.aspx</uri></author></entry></feed>