<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.iis.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Blog of &amp;quot;Brian Murphy-Booth&amp;quot; a.k.a. &amp;quot;Brian Booth&amp;quot;</title><subtitle type="html" /><id>http://blogs.iis.net/brian-murphy-booth/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.iis.net/brian-murphy-booth/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2007-03-09T14:07:00Z</updated><entry><title>The object identifier does not represent a valid object.</title><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/archive/2008/06/03/visual-studio-2008-unable-to-debug-asp-net-app-on-iis-7-0.aspx" /><id>http://blogs.iis.net/brian-murphy-booth/archive/2008/06/03/visual-studio-2008-unable-to-debug-asp-net-app-on-iis-7-0.aspx</id><published>2008-06-03T12:14:00Z</published><updated>2008-06-03T12:14:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;&lt;STRONG&gt;PROBLEM:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp; When attempting to&amp;nbsp;"run" an ASP.NET&amp;nbsp;project on IIS 7.0 using Visual Studio 2008 the following error is displayed:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/0x800710D8.jpg"&gt;&lt;IMG title="Unable to start debugging on the web server. The object identifier does not represent a valid object. (Exception from HRESULT: 0x800710D8)" alt="Unable to start debugging on the web server. The object identifier does not represent a valid object. (Exception from HRESULT: 0x800710D8)" src="http://blogs.iis.net/blogs/brian-murphy-booth/0x800710D8.jpg" border=0 mce_src="http://blogs.iis.net/blogs/brian-murphy-booth/0x800710D8.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;RESOLUTION:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp; Make sure that "Windows Authentication" is enabled in IIS on the applicable&amp;nbsp;web application (web site or folder).&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;NOTES:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;That was a little frustrating for me at first. No hits anywhere in our knowledge base or on &lt;A class="" href="http://www.live.com/" mce_href="http://www.live.com"&gt;Live&lt;/A&gt;. I figured I would ignore this and come back to it later but after about a week I finally decided this isn't something I wanted to deal with constantly.&amp;nbsp;I started&amp;nbsp;to troubleshoot it versus waiting to find somebody else's solution. One of the first things Visual Studio does when trying to debug an ASP.NET application is make a DEBUG request (versus a GET or POST) to IIS. If all goes well for the DEBUG request, VS automatically attaches as a debugger to the ASP.NET worker process (w3wp.exe in this case) and to IEXPLORE.exe. So into the&amp;nbsp;IIS logs I went to see the result of that DEBUG request. Here was the entry for my failed debug attempt:&lt;/P&gt;
&lt;P mce_keep="true"&gt;#Software: Microsoft Internet Information Services 7.0&lt;BR&gt;#Version: 1.0&lt;BR&gt;#Date: 2008-06-03 12:11:16&lt;BR&gt;#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Cookie) sc-status sc-substatus sc-win32-status time-taken&lt;BR&gt;2008-06-03 12:11:16 ::1 DEBUG /WebApp/Default.aspx - 80 - ::1 - - 401 0 0 157&lt;/P&gt;
&lt;P mce_keep="true"&gt;You may notice that this is a&amp;nbsp;401.0. Normally when a "browser" (VS2008 in this case) first makes a request it is always anonymous. Then after&amp;nbsp;seeing a 401, it will follow&amp;nbsp;up the first request with a second request that includes credentials. In the IIS logs&amp;nbsp;we'd expect to see a 401.2 (unauthorized due to sever configuration - i.e. I'm not accepting anonynous), then if using NTLM we'd see a 401.1 (NTLM challenge - i.e. you have only sent me half the credentials for that NTLM handshake) then finally a success status such as 200 (OK), 302 (Moved/Redirect), or 304 (Not Modified). Or if using Basic authentication or Kerberos there would be the 401.2 then the success status for the next log entry since those methods don't have a handshake. In my case here there was only a single 401 with no follow up attempt. Hmm... Why no follow up request with credentials? Next stop - IIS manager.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/0x800710D8.Authentication.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/0x800710D8.Authentication.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/0x800710D8.Authentication.jpg"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/0x800710D8.Authentication.jpg" border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;After highlighting my "WebApp" folder and double-clicking "Authentication" (shown above)&amp;nbsp;in the IIS manager I saw that only Anonymous was enabled. Oh right... IIS 7.0 is secure by default. VS was making it's anonymous request and since IIS returned no "WWW-Authentication" headers specifying which auth method it is accepting, VS quit there. IIS 7.0&amp;nbsp;has only anonymous enabled by default and administrators have to consciously open up their server by enabling additional authentication types. After enabling "Windows Authentication" as well leaving&amp;nbsp;"Anonymous" enabled, debugging worked fine. Thanks for the great error!!&lt;/P&gt;
&lt;P mce_keep="true"&gt;Hope this helped somebody.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=2397652" width="1" height="1"&gt;</content><author><name>brian-murphy-booth</name><uri>http://blogs.iis.net/members/brian_2D00_murphy_2D00_booth.aspx</uri></author></entry><entry><title>Remote debugging ASP.NET applications using Visual Studio 2008</title><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/archive/2008/05/23/remoting-debugging-asp-net-applications-using-visual-studio-2008.aspx" /><id>http://blogs.iis.net/brian-murphy-booth/archive/2008/05/23/remoting-debugging-asp-net-applications-using-visual-studio-2008.aspx</id><published>2008-05-23T14:21:00Z</published><updated>2008-05-23T14:21:00Z</updated><content type="html">&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/Find.AppPool.Name.JPG"&gt;&lt;/A&gt;If you have recently upgraded a &lt;STRONG&gt;Visual Studio .NET 2003 ASP.NET application&lt;/STRONG&gt; project&amp;nbsp;or a&amp;nbsp;&lt;STRONG&gt;Visual Studio 2005&amp;nbsp;Web Application&lt;/STRONG&gt; project&amp;nbsp;to a &lt;STRONG&gt;Visual Studio 2008 ASP.NET Web Application&lt;/STRONG&gt; project you may have noticed the following popup. Needless to say this&amp;nbsp;makes&amp;nbsp;it&amp;nbsp;a little more difficult to connect remotely to your project in order to run and debug it:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/Remote.Debug.Error.jpg"&gt;&lt;IMG title="Unable to create the virtual directory. Could not find the server 'http://remoteMachine' on the local machine. Creating a virtual directory is only supported on the local IIS server." alt="Unable to create the virtual directory. Could not find the server 'http://remoteMachine' on the local machine. Creating a virtual directory is only supported on the local IIS server." src="http://blogs.iis.net/blogs/brian-murphy-booth/Remote.Debug.Error.jpg" border=0 mce_src="http://blogs.iis.net/blogs/brian-murphy-booth/Remote.Debug.Error.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;At this point I can only guess as to why connecting to a remote web application project no longer seems to work.&amp;nbsp;I do have a few guesses but I&amp;nbsp;won't bother mentioning what they are because inevitably somebody will tell me my guesses are&amp;nbsp;wrong. Instead I thought I would share with you a relatively simple way to get back to work and remotely debug anyway.&lt;/P&gt;
&lt;P mce_keep="true"&gt;In a nutshell, to remotely debug we want to run &lt;U&gt;&lt;STRONG&gt;two instances of Visual Studio&lt;/STRONG&gt;&lt;/U&gt;. One will be the "debugger" instance, and the other will be the "editor/compiler" instance.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Here are the steps.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Install the &lt;STRONG&gt;Visual Studio 2008 Remote Debugger&lt;/STRONG&gt; on your remote machine. You can find the installation file in the &lt;STRONG&gt;Remote Debugger&lt;/STRONG&gt; folder on your Visual Studio 2008 installation disk.&lt;/LI&gt;
&lt;LI&gt;Once you have the remote debugger installed, run &lt;STRONG&gt;Visual Studio 2008 Remote Debugger Configuration Wizard&lt;/STRONG&gt;&amp;nbsp;from the start menu of the remote machine.&lt;/LI&gt;
&lt;LI&gt;Choose &lt;STRONG&gt;Run the "Visual Studio 2008 Remote Debugger" service&lt;/STRONG&gt;. You could try running individual instances of the debugger but you may into&amp;nbsp;user rights or permissions related issues. Personally I prefer easy versus difficult. Your choice though.&lt;/LI&gt;
&lt;LI&gt;Leave the service user as &lt;STRONG&gt;LocalSystem&lt;/STRONG&gt; and leave the password &lt;EM&gt;blank&lt;/EM&gt; then click &lt;STRONG&gt;Next.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;If you see a &lt;STRONG&gt;Configure the Windows Firewall for Debugging&lt;/STRONG&gt; option, choose the available option to suit your needs then click &lt;STRONG&gt;Next&lt;/STRONG&gt; then &lt;STRONG&gt;Finished.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Next in order to prepare your old project to be opened with minimal problems, open your vbproj or csproj file in notepad and remove the "IISUrl" related settings then save the project file.&lt;/LI&gt;
&lt;LI&gt;Back on your &lt;STRONG&gt;local workstation&lt;/STRONG&gt;, open Visual Studio 2008 then click &lt;STRONG&gt;File --&amp;gt; Open --&amp;gt; Project\Solution...&lt;/STRONG&gt; and browse to the UNC path where the project or solution file resides.&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Example: \\someserver\C$\inetpub\wwwroot\RemoveWebApp\myapp.csproj&lt;/LI&gt;
&lt;LI&gt;Note: If you are not an administrator on the remote machine then you cannot use the adminitrative "C$" share. Instead you will need to ask the administrator to create a share for you.&lt;/LI&gt;
&lt;LI&gt;Note: If you are not an administrator on the remote machine you will also need to ask the administrator to add you to the "Debugger Users" group.&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;You can leave the &lt;STRONG&gt;Web&lt;/STRONG&gt; settings for the project properties set to &lt;STRONG&gt;Use Visual Studio Development Server&lt;/STRONG&gt; or &lt;STRONG&gt;Use IIS Web server&lt;/STRONG&gt;. It does not matter since we aren't going to be launching the project that way. If you do choose to create a virtual directory you will to create it &lt;EM&gt;locally&lt;/EM&gt; on your workstation of course to avoid the error mentioned above.&amp;nbsp;This will&amp;nbsp;actually create a virtual directory&amp;nbsp;that points to the UNC path where your content lives.&lt;/LI&gt;
&lt;LI&gt;This&amp;nbsp;first instance of Visual Studio will be used to edit source files and compile the application as necessary.&lt;/LI&gt;
&lt;LI&gt;From your local workstation, open a second instance of Visual Studio 2008 but do not open any projects.&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Tools --&amp;gt; Attach to process...&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Enter the appropriate remote server name in the &lt;STRONG&gt;Qualifier&lt;/STRONG&gt; textbox&amp;nbsp;then click the &lt;STRONG&gt;Refresh&lt;/STRONG&gt; button near the bottom.&lt;/LI&gt;
&lt;LI&gt;Choose the correct remote process (aspnet_wp.exe or w3wp.exe for example) and click &lt;STRONG&gt;Attach&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;If there are multiple w3wp.exe processes running and you aren't sure which to pick you can run "cscript c:\Windows\System32\iisapp.vbs" on the remote machine to get the right PID. iisapp.vbs simply lists the running W3WP.exe processes along with their Application Pool name and PID.&lt;/LI&gt;
&lt;LI&gt;If there are *no* processes running that you know you need to attach to, then you should make at least one request to http://someServer/RemoteWebApp" in order to spawn the worker process.&lt;/LI&gt;
&lt;LI&gt;To make retrieving the PID a little easier I have included some sample VBS code below to get it for you.&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Click &lt;STRONG&gt;File --&amp;gt; Open --&amp;gt; File&lt;/STRONG&gt; and open the source file that you want to debug from your UNC path.&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Example: \\remotemachine\C$\inetpub/wwwroot\RemoveWebApp\Default.aspx.cs&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Set a breakpoint somewhere.&lt;/LI&gt;
&lt;LI&gt;This second instance of Visual Studio will be used to "debug" your project&lt;/LI&gt;
&lt;LI&gt;Open IE and request your page and you should break at the desired location.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;NOTE: Something you might want to do to avoid the need to attach over and over while&amp;nbsp;writing your code is to disable the idle timeout settings and possibly the recycling settings of the application pool that your ASP.NET application is using in IIS. To find which application pool your application is using you need to go to the remote server and open the IIS manager. Then go your application's properties and look at either the "[Virtual] Directory" tab or "Home Directory" tab depending on whether it is a web site or directory level application.&lt;/P&gt;
&lt;P&gt;To find the application pool name go into the properties of your application.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/Find.AppPool.Name.JPG"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/Find.AppPool.Name.JPG" border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;To disable the AppPool idle timeout go into the properties of the correct AppPool:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/Disable.Idle.Timeout.JPG"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/Disable.Idle.Timeout.JPG" border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And finally... here is a script I wrote to make obtaining your remote PID a little easier. To use this:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Copy/paste the text below&amp;nbsp;into notepad&lt;/LI&gt;
&lt;LI&gt;Save the file with a&amp;nbsp;VBS extension&lt;/LI&gt;
&lt;LI&gt;Edit the first 3 variables machineName, appPoolName, and url so they are correct for your remote server.&lt;/LI&gt;
&lt;LI&gt;Run this from your workstation.&lt;/LI&gt;&lt;/OL&gt;&lt;PRE&gt;''''''''''''''''''''''''''''''''
' Variables
machineName = "remoteMachineName"      'This to your remote machine.
appPoolName = "DefaultAppPool"  'This is the AppPool your ASP.NET is using.
url = "http://remoteMachineName/"       'This is the URL that will launch your AppPool

wmiPath = "winmgmts://" &amp;amp; machineName &amp;amp; "/root/cimv2"
wmiQuery = "SELECT * FROM Win32_Process WHERE Name='w3wp.exe'"

''''''''''''''''''''''''''''''''
' Code execution begins
Set wmiObj = GetObject(wmiPath)
Set wpList = wmiObj.ExecQuery(wmiQuery)

ShowAppPoolPid()

response = AskAboutRequestingPage()
If (response = vbYes) Then
	SpawnWorkerProcess()
	MsgBox "Unable to locate PID for '" &amp;amp; appPoolName &amp;amp; "'"
End If

''''''''''''''''''''''''''''''''
'Methods
Sub ShowAppPoolPid()
	message = ""
	For Each wp In wpList
		name = GetAppPoolId(wp.CommandLine)
		If (UCase(appPoolName) = UCase(name)) Then
			message = message &amp;amp; vbCrLf &amp;amp; "   " &amp;amp; wp.ProcessID
		End If
	Next
    
	If (message &amp;lt;&amp;gt; "") Then
		MsgBox "'" &amp;amp; appPoolName &amp;amp; "' is running under the following PID(s):" &amp;amp; message
		WScript.Quit()
	End If
End Sub

Function GetAppPoolId(strArg)
	Dim Submatches
	Dim strPoolId
	Dim re
	Dim Matches

    On Error Resume Next

	Set re = New RegExp
	re.Pattern = "-ap ""(.+)"""
	re.IgnoreCase = True
	Set Matches = re.Execute(strArg)
	Set SubMatches = Matches(0).Submatches
	strPoolId = Submatches(0)
	
	GetAppPoolId = strPoolId
End Function

Function AskAboutRequestingPage()
	message = "'" &amp;amp; appPoolName &amp;amp; "' is not currently running on '" &amp;amp; machineName &amp;amp; "'. Would you like to make a request to '" &amp;amp; url &amp;amp; "' in order to spawn the process?"
	style = vbYesNo + vbCritical + vbDefaultButton2
	title = "AppPool not running"
	AskAboutRequestingPage = MsgBox(message, style, title)
End Function

Sub SpawnWorkerProcess
	Dim ie: Set ie = WScript.CreateObject("InternetExplorer.Application", "Ie_")
	ie.Navigate url
	
	ie.Visible = True
	Set ie = Nothing
End Sub

Sub Ie_NavigateComplete2(ByVal pDisp, URL)
    ShowAppPoolPid()
End Sub 
&lt;/PRE&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=2376958" width="1" height="1"&gt;</content><author><name>brian-murphy-booth</name><uri>http://blogs.iis.net/members/brian_2D00_murphy_2D00_booth.aspx</uri></author></entry><entry><title>Static variable, Shared variable... does it matter?</title><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/archive/2007/06/15/static-shared-or-not-who-cares.aspx" /><id>http://blogs.iis.net/brian-murphy-booth/archive/2007/06/15/static-shared-or-not-who-cares.aspx</id><published>2007-06-15T10:27:00Z</published><updated>2007-06-15T10:27:00Z</updated><content type="html">&lt;P style="FONT-SIZE: 20px" mce_keep="true"&gt;Introduction&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Occasionally I am challenged with the task of needing to explain&amp;nbsp;what the difference is between a "regular" variable and a "static" variable (called "Shared" in VB.NET). I use the term "challenged" not because the people I explain to aren't intelligent, but because it honestly is not a concept that is immediately clear for people that haven't had it explained to them before. Many people partially understand the concept of "object oriented" programming. But static variables are sort of like a step backwards from that which gets confusing. Anyway... last night I was working on&amp;nbsp;a Severity A case (i.e. server is down... people are running around in a panic,&amp;nbsp;thousands of dollars per hour are lost, CEO's are standing around looking for people to fire) where I found the root of the problem to be because of&amp;nbsp;a static variable and I was having a tough time getting the concept across to the people I was helping. So I figured I'd see if I could come up with a good explanation here to save some time in the future. &lt;/P&gt;
&lt;P&gt;So first... what is an "object"? If you don't know what an "object" is then you have no hope of understanding what a "static object" is.&lt;/P&gt;
&lt;P&gt;You may have heard or read somewhere that "everything in .NET is an object." Okay great. But what the heck does that mean? Well, an object is basically like... I don't know... an object! Like a "real" object, as in a "noun". Maybe like a house. A house has parts in it that are always moving (refrigerator perhaps), things that just sit there (the couch), maybe has things that only do something when you turn them on or&amp;nbsp;off (TV or faucet). So a house is an "object" that can have other objects in it. Or maybe it doesn't have other objects in it (house ready to be sold?).&amp;nbsp;It all depends on the particular object that we've designed. Although "House" gives us a basic description of what this object is, there can be many different houses that are all still called "House". This is much the same as a programming object. It is basically a container of a particular format that can have other objects contained within it.&lt;/P&gt;
&lt;P&gt;Okay, so let's make a "House" object in pseudo c# terms. It might look like this.&amp;nbsp;&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;class House&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string StreetAddress;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string ResidentName;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int ResidentCount;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function TurnOn(string itemName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (itemName == "TV")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code to turn on the TV&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (itemName == "Washer")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code to turn on the Washer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code to turn on all the Lights&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Just the layout of a "House" object doesn't tell me a ton about any *specific* house. That's because this "class" is just a description of what a "House" should have. We can "create an instance" of one or more "House" objects like this:&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;House myHouse = new House();&lt;BR&gt;House yourHouse = new House();&lt;BR&gt;House dogHouse = new House();&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;The above&amp;nbsp;code has setup a "new" section of memory that is used to store information about a particular House. Then we can perhaps set some of the values of each house:&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;myHouse.StreetAddress = "123 Street";&lt;BR&gt;myHouse.ResidentName = "Brian Murphy-Booth";&lt;BR&gt;myHouse.ResidentCount = 3; &lt;/P&gt;
&lt;P&gt;yourHouse.StreetAddress = "456 Another Street";&lt;BR&gt;yourHouse.ResidentName = "Some Person";&lt;BR&gt;yourHouse.ResidentCount = 5;&lt;/P&gt;
&lt;P&gt;dogHouse.StreetAddress = "Back Yard";&lt;BR&gt;dogHouse.ResidentName = "Ollie";&lt;BR&gt;dogHouse.ResidentCount = 1; &lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;And finally... we can call our method to do something.&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;myHouse.TurnOn("lights");&lt;BR&gt;yourHouse.TurnOn("TV");&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;As I go around and run the TurnOn("whatever") method of the different House objects that I have, those values affect only that specific "instance" of the "House" that I'm setting the value on. Each "House" has its own space in memory that has its own unique values. Therefore, calling myHouse.TurnOn("Lights") will only effect *my* house. Not yours. That's because there are 3 places in memory that holds an isolated "instance" of House.&lt;/P&gt;
&lt;P&gt;Okay. We're almost ready to look at what a "static" object is. But before I do, let's fix up our pseudo class so it looks closer to&amp;nbsp;valid C# syntax.&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;public class House&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string StreetAddress;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string ResidentName;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ResidentCount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool Initialized;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void TurnOn(string itemName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (itemName == "TV")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code to turn on the TV&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (itemName == "Washer")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code to turn on the Washer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Code to turn on all the Lights&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;You can see that all I've really done is added some "access modifiers" like "public" and "private" to control who can get or set the variable values. The behavior of setting "ResidentName" etc is essentially unchanged. The only difference now is that I've added an "Initialized" variable that can only be set by other methods inside of "House". For example... I cannot do:&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;myHouse.Initialized = true; // Can't do this&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;...since it is private. That's not really the important part of this Blog though, so let's move on. What if we "mistakenly" set one of our variables as "static"? Let's look at the following declarations that include that mistake.&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;public class House&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string&amp;nbsp;StreetAddress;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string ResidentName;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ResidentCount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool Initialized;&lt;/P&gt;
&lt;P&gt;... etc etc...&lt;/P&gt;
&lt;P&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Uh oh... that's trouble. "What will happen?", you ask. Let's look again at our example of setting the values on the different House objects that we've created.&lt;BR&gt;&lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;myHouse.StreetAddress = "123 Street";&lt;BR&gt;myHouse.ResidentName = "Brian Murphy-Booth";&lt;BR&gt;myHouse.ResidentCount = 3;&lt;/P&gt;
&lt;P&gt;yourHouse.StreetAddress = "456 Another Street";&lt;BR&gt;yourHouse.ResidentName = "Some Person";&lt;BR&gt;yourHouse.ResidentCount = 5; &lt;/P&gt;
&lt;P&gt;dogHouse.StreetAddress = "Back Yard";&lt;BR&gt;dogHouse.ResidentName = "Ollie";&lt;BR&gt;dogHouse.ResidentCount = 1; &lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;The end result here would be that "myHouse.StreetAddress", "yourHouse.StreetAddress", and "dogHouse.StreetAddress" would all have a value of "Back Yard". That's because when a variable is "static" there is only ONE version of the StreetAddress variable in all of the memory!! It is no longer associated with some unique "instance" of House. Think of a "static" variable as being similar to calling the local police station. It doesn't matter which House you call them from. The same phone will ring in the police station up the road. Ahh... but if there is only *1* copy of that StreetAddress variable (no "instance" versions) then there is actually a coding mistake above. Attempting to compile the above code would generate a compile error. It can actually only be like this: &lt;/P&gt;
&lt;DIV style="COLOR: black; BACKGROUND-COLOR: white"&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;BR&gt;House.StreetAddress = "123 Street";&lt;BR&gt;myHouse.ResidentName = "Brian Murphy-Booth";&lt;BR&gt;myHouse.ResidentCount = 3;&lt;/P&gt;
&lt;P&gt;House.StreetAddress = "456 Another Street";&lt;BR&gt;yourHouse.ResidentName = "Some Person";&lt;BR&gt;yourHouse.ResidentCount = 5; &lt;/P&gt;
&lt;P&gt;House.StreetAddress = "Back Yard";&lt;BR&gt;dogHouse.ResidentName = "Ollie";&lt;BR&gt;dogHouse.ResidentCount = 1; &lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;In reality, since making it "static" means there can only be one copy, StreetAddress cannot be accessed using an "instance" name anymore (such as "myHouse"). There is one and only one version of StreetAddress in all of memory so we just say which object type we're referring to (House is a "type" of object) then set it directly (House.StreetAddress).&lt;/P&gt;
&lt;P style="FONT-SIZE: 20px"&gt;Abbreviated Real World Example:&lt;/P&gt;
&lt;P&gt;I'll walk you through what was happening with the customer that I was helping last night. The configuration was something like this:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;ShowInfo.aspx and ShowInfo.aspx.cs&lt;/LI&gt;
&lt;LI&gt;DataBaseStuff.cs.&lt;/LI&gt;
&lt;LI&gt;In DataBaseStuff there was a "static" SqlConnection *variable* called myConnection&lt;/LI&gt;
&lt;LI&gt;In DataBaseStuff there was a "static" SqlCommand *variable* called myCommand&lt;/LI&gt;
&lt;LI&gt;In DataBaseStuff there was a "static" *method* named GetDataTable().&lt;/LI&gt;
&lt;LI&gt;Page_Load was calling DataBaseStuff.GetDataTable(string userName) to get some data.&lt;/LI&gt;
&lt;LI&gt;GetDataTable made use of the static myConnection object to retrieve data from SQL.&lt;/LI&gt;
&lt;LI&gt;Page_Load assigned the resulting DataTable to a DataGrid.&lt;/LI&gt;
&lt;LI&gt;Personal information for the logged in user was displayed on the web page.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The result? During peak hours for the web site, information for UserA was being shown to UserB. How did this happen?&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;ShowInfo.Page_Load() begins to execute for UserA.&lt;/LI&gt;
&lt;LI&gt;ShowInfo.Page_Load() begins to execute for UserB&lt;/LI&gt;
&lt;LI&gt;UserA has DataBaseStuff.GetDataTable("UserA") called for them.&lt;/LI&gt;
&lt;LI&gt;UserB has DataBaseStuff.GetDataTable("UserB") called for them.&lt;/LI&gt;
&lt;LI&gt;UserA has something like "SELECT * FROM Users WHERE username='UserA';" assigned to the static myCommand object.&lt;/LI&gt;
&lt;LI&gt;UserB has something like "SELECT * FROM Users WHERE username='UserB';" assigned to the static myCommand object.&lt;/LI&gt;
&lt;LI&gt;UserA starts to pull data from SQL.&lt;/LI&gt;
&lt;LI&gt;UserB starts to pull data from SQL.&lt;/LI&gt;
&lt;LI&gt;Result: Since UserB's SQL query was the last one assigned to myCommand (which remember... there is only one version of this in all of memory), the myConnection object is using UserB's query for both users. UserB sees UserB's data. UserA sees UserB's data too.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Here are some questions I asked my customer after finding the problem.&lt;/P&gt;
&lt;P&gt;Me: Why are the myCommand and myConnection variables "static"? &lt;BR&gt;Customer: Because there was a compile error in GetDataTable when they weren't static. &lt;BR&gt;I think: Hmm... not the best of reasons. But okay.&lt;/P&gt;
&lt;P&gt;Me: That's because GetDataTable is static. Why is the GetDataTable method "static"? &lt;BR&gt;Customer: Because when it is static I don't have to use "new" when calling it from ShowInfo.aspx. &lt;BR&gt;I think: Okay. That's a valid reason.&lt;/P&gt;
&lt;P&gt;Me: Well... that's a good reason to make it static. But... [So then I try for 20 minutes to explain what a static variable is.]&lt;/P&gt;
&lt;P&gt;*The* reason you want to make a variable static is for scalability reasons. In my customer's example, it would not make sense to user the same SqlConnection and SqlCommand for multiple users because of the types of problems it could cause. It would, however, make sense to use the same connection string for multiple users. If you had 100 instances of DataBaseStuff in memory, you would not want to waste space by having 100 copies of the same connection string assigned to all 100 versions of DataBaseStuff Instead, we'd make myConnectionString static so that it exists in memory only once (yes, I know what an "interned" string is. For all you experts: don't complicate my example!!).&lt;/P&gt;
&lt;P style="FONT-SIZE: 20px"&gt;Summary:&lt;/P&gt;
&lt;P&gt;There are many different features of C# (and VB.net). Using "static" methods and variables can be a big plus relative to performance and scalability. The important caveat is just that you make sure you use the features in the way they were intended on being used! Doing something "just because" can cause unexpected results.&lt;/P&gt;
&lt;P&gt;I'm interested in your feedback. If my explanation above doesn't make sense, let me know. Leave a comment with your email address and I'll see if there is something I can do to make it easier to understand. All comments must be approved by me first so I'll be sure not to publish your address.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=1756588" width="1" height="1"&gt;</content><author><name>brian-murphy-booth</name><uri>http://blogs.iis.net/members/brian_2D00_murphy_2D00_booth.aspx</uri></author></entry><entry><title>How to troubleshoot an IIS "Event ID: 1009" error.</title><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/22/how-to-troubleshoot-an-iis-event-id-1009-error.aspx" /><id>http://blogs.iis.net/brian-murphy-booth/archive/2007/03/22/how-to-troubleshoot-an-iis-event-id-1009-error.aspx</id><published>2007-03-22T16:20:00Z</published><updated>2007-03-22T16:20:00Z</updated><content type="html">&lt;P&gt;An error that most IIS 6.0 administrators have probably encountered is "Event ID: 1009" which usually leads to a "503 Service Unavailable" error being displayed in a browser. "503" usually indicates the Application Pool has been disabled for some reason. The IIS support team frequently gets support calls to help resolve this issue and over the years&amp;nbsp;I have compiled a list of steps I use to troubleshoot this. If the following information seems too confusing please let me know and I'll clarify any confusing points. The follow list is broken down into different sections for the various "exit codes" that are in the Event 1009.&lt;/P&gt;
&lt;P&gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&lt;/P&gt;
&lt;P&gt;*** Problem Description ***&lt;BR&gt;Many times when an IIS6 application pool terminates the following will be logged.&lt;/P&gt;&amp;nbsp; 1. The Name of the App Pool&lt;BR&gt;&amp;nbsp; 2. The PID&lt;BR&gt;&amp;nbsp; 3.&amp;nbsp;The exit code.&lt;BR&gt;&lt;BR&gt;The &lt;STRONG&gt;&lt;U&gt;&lt;EM&gt;exit code&lt;/EM&gt;&lt;/U&gt;&lt;/STRONG&gt; is the most useful part of the event entry. 
&lt;P&gt;&amp;nbsp; Event Type:&amp;nbsp;Warning&lt;BR&gt;&amp;nbsp; Event Source:&amp;nbsp;W3SVC&lt;BR&gt;&amp;nbsp; Event Category:&amp;nbsp;None&lt;BR&gt;&amp;nbsp; Event ID:&amp;nbsp;1009&lt;BR&gt;&amp;nbsp; Date:&amp;nbsp;&amp;nbsp;1/29/2004&lt;BR&gt;&amp;nbsp; Time:&amp;nbsp;&amp;nbsp;10:01:14 AM&lt;BR&gt;&amp;nbsp; User:&amp;nbsp;&amp;nbsp;N/A&lt;BR&gt;&amp;nbsp; Computer:&amp;nbsp;COMPUTERNAME&lt;BR&gt;&amp;nbsp; Description:&lt;BR&gt;&amp;nbsp; A process serving application pool 'DefaultAppPool' terminated unexpectedly. The &lt;BR&gt;process id was '3908'. The process exit code was '0x80'.&lt;/P&gt;
&lt;P&gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&lt;/P&gt;
&lt;P&gt;*** Resolution ***&lt;/P&gt;
&lt;P&gt;Constants:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;// the WAS killed the worker process&lt;BR&gt;#define KILLED_WORKER_PROCESS_EXIT_CODE 0xFFFFFFFD&lt;/P&gt;
&lt;P&gt;// the worker process exited ok&lt;BR&gt;#define CLEAN_WORKER_PROCESS_EXIT_CODE&amp;nbsp; 0xFFFFFFFE&lt;/P&gt;
&lt;P&gt;// the worker process exited due to a fatal error&lt;BR&gt;#define ERROR_WORKER_PROCESS_EXIT_CODE&amp;nbsp; 0xFFFFFFFF&lt;/P&gt;
&lt;P&gt;-----------------------------------------------------------&lt;BR&gt;Concepts that apply to exit codes of both 0x80 and 0xffffffff&lt;BR&gt;&amp;nbsp; · Make sure "Network Service" and "IWAM_MACHINE" are members of IIS_WPG&lt;BR&gt;&amp;nbsp; · If a custom identity is being used for the app pool ensure it is in IIS_WPG&lt;BR&gt;&amp;nbsp; · Make sure that IIS_WPG is included somehow in these User Rights assignments &lt;BR&gt;(example: Everyone group includes IIS_WPG so that is sufficient)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a. Access this computer from network&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b. Log on as batch job&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c. Bypass traverse checking&lt;BR&gt;&amp;nbsp; · Ensure that IIS_WPG or members of that group are not in any of the &lt;BR&gt;corresponding "Deny" User Rights&lt;BR&gt;&amp;nbsp; · Ensure that "NT AUTHORITY\Authenticated Users" and "NT AUTHORITY\Interactive" &lt;BR&gt;are part of the "Users" group.&lt;BR&gt;&amp;nbsp; · Use FileMon.exe and RegMon.exe to identify ACC DENIED's.&lt;BR&gt;&amp;nbsp; · If customer has more than ~60 app pools with unique identities, set the &lt;BR&gt;following key:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HKLM\System\CurrentControlSet\Services\W3SVC\Parameters\UseSharedWPDesktop &lt;BR&gt;(REG_DWORD with value of 1)&lt;BR&gt;-----------------------------------------------------------&lt;BR&gt;The process exit code was '0x80'.&lt;BR&gt;&amp;nbsp; Means the W3WP.exe never started at all which could be User-Rights related or &lt;BR&gt;NTFS permissions.&lt;BR&gt;&amp;nbsp; If it is NTFS permissions, that means the AppPool identity doesn't have read &lt;BR&gt;permission to the w3wp.exe file.&lt;BR&gt;&amp;nbsp; - Use FileMon to troubleshoot&lt;BR&gt;&amp;nbsp; If it is User Rights related then the AppPool identity failed to logon.&lt;BR&gt;&amp;nbsp; - Check the 3 User Rights listed above.&lt;BR&gt;-----------------------------------------------------------&lt;BR&gt;The process exit code was '0xffffffff'.&lt;BR&gt;&amp;nbsp; Means the W3WP.exe process partially started but could not load a dependancy for &lt;BR&gt;some reason.&lt;BR&gt;&amp;nbsp; This is either permissions/security related or due to mismatched DLL's.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; Try running the AppPool as "Local System"&lt;BR&gt;&amp;nbsp; - If this works it is a permissions problem for the AppPool Identity. Check the &lt;BR&gt;following "Scenarios" section then follow the "concepts" section above&lt;BR&gt;&amp;nbsp; - If this fails using System it is a mismatch or missing DLL problem. Check &lt;BR&gt;scenario #1 below then follow the "Loader Snaps" section&lt;/P&gt;
&lt;P&gt;Scenarios for 0xffffffff&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 1. The first thing that should be checked is whether SP1 is installed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - If it is, verify that "c:\windows\System32\instsrv\w3core.dll" is either the &lt;BR&gt;RTM version or SP1 version.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - If it is the RTM version then reapplying SP1 should fix the problem.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - This issue is said to be fixed for SP2&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 2. Is this IIS server a DC and have you reinstalled IIS on another DC?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I have had two cases where there was a permissions failure reading nodes in the &lt;BR&gt;metabase&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; When installing IIS it creates an IIS_WPG group with a somewhat random SID.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Permissions in the metabase are then set using this unique version of &lt;BR&gt;IIS_WPG.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; When removing IIS on a DC&amp;nbsp;it will delete the IIS_WPG group, if Win2k3 SP1 is &lt;BR&gt;not installed, which is used by all the other DC's running IIS&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; When then adding IIS back on to this DC, a new IIS_WPG group is created that &lt;BR&gt;has a new SID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The pre-existing permissions (older SID) in the other metabases will have &lt;BR&gt;"Unknown User" for the permissions and spawning W3WP.exe under anything other than &lt;BR&gt;SYSTEM will fail with 0xffffffff&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - I found this by enabling Tracing then searching through source code.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - If you get a Debug Trace using DbgView.exe look for a line that says:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; w3core!W3_SERVER::Initialize [\w3server.cxx @ 526]:Error reading &lt;BR&gt;UseDigestSSP property.&amp;nbsp; hr = 80070005&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - However It would be easy enough to skip Debug Tracing and just look at the &lt;BR&gt;following nodes using Metabase Explorer.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - IIS_WPG needs permissions to the following nodes: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. MachineName - Read&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. w3svc/1/Filters (or any other filters node) - Read/Write&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. w3svc/AppPools - Special (Query Unsecure Property)&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 3. Has the customer modified default DCOM security?&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - We&amp;nbsp;have run into an issue where the customer had modified &lt;BR&gt;the default Launch and Activation Permissions in Component Services.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - The customer removed Local Launch and Local Activation for the Everyone &lt;BR&gt;group.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Here is the section of loader snaps output that is a hint of this scenario:&lt;/P&gt;
&lt;P&gt;LDR: LdrGetProcedureAddress by NAME - CoMarshalInterface&lt;BR&gt;LDR: LdrGetProcedureAddress by NAME - CoUnmarshalInterface&lt;BR&gt;LDR: LdrGetProcedureAddress by NAME - CoReleaseMarshalData&lt;BR&gt;(15c8.914): Unknown exception - code 80070005 (first chance)&lt;BR&gt;LDR: UNINIT LIST&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1) [iisres.dll] c:\windows\system32\inetsrv\iisres.dll (0) deinit 0&lt;BR&gt;LDR: Unmapping [iisres.dll]&lt;BR&gt;LDR: Derefcount IISMAP.dll (0)&lt;/P&gt;
&lt;P&gt;-----------------------------------------------------------&lt;BR&gt;The process exit code was '0xc0000005'.&lt;BR&gt;&amp;nbsp; This is a crash.&lt;BR&gt;&amp;nbsp; Troubleshoot using a Debugger. (Debug Diagnostics)&lt;BR&gt;-----------------------------------------------------------&lt;BR&gt;The process exit code was '0xff'.&lt;BR&gt;&amp;nbsp; Process shut down "gracefully" for some reason.&lt;BR&gt;&amp;nbsp; Troubleshoot as a crash and see who called TerminateProcess or ExitProcess.&lt;BR&gt;-----------------------------------------------------------&lt;BR&gt;The process exit code was '0x0'.&lt;BR&gt;&amp;nbsp; This would be typical if you had w3wp.exe configured to launch under a debugger &lt;BR&gt;and you never did a "Go" in the debugger windows.&lt;BR&gt;&amp;nbsp; Launch gflags.exe and clear the debugger setting for w3wp.exe&lt;BR&gt;-----------------------------------------------------------&lt;BR&gt;Loader Snaps Section - These steps are not for getting memory dumps. This explains &lt;BR&gt;how to easily get the reason that a module (DLL) failed to load which is one reason for a 0xffffffff.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 1. Send customer "gflags.exe" (can be obtained from Debugging Tools for &lt;BR&gt;Windows)&lt;BR&gt;&amp;nbsp; 2. Double-click gflags.exe&lt;BR&gt;&amp;nbsp; 3. Go to the "Image File" tab&lt;BR&gt;&amp;nbsp; 4. Enter "w3wp.exe" for the image then press "tab"&lt;BR&gt;&amp;nbsp; 5. Put a check in "Show loader snaps"&lt;BR&gt;&amp;nbsp; 6. Put a check in "Debugger" and enter&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "NTSD.exe -logo c:\temp\LDR.log -g -G -r 0" (&amp;lt;-- that is a zero)&lt;BR&gt;&amp;nbsp; 7. Ensure the folder from the previous step has adequate read/write permissions &lt;BR&gt;for the Identity that is launching the AppPool.&lt;BR&gt;&amp;nbsp; 8. Ensure that the AppPool is enabled&lt;BR&gt;&amp;nbsp; 9. Reproduce the problem. - At this point w3wp.exe should spawn under NTSD.exe, &lt;BR&gt;write to the log, then shut down.&lt;BR&gt;&amp;nbsp; 10. Have customer send the LoaderSnaps.log output found in the c:\temp folder.&lt;BR&gt;&amp;nbsp; 11. Search for the text of "exception" or "failed" (you'll probably find what you &lt;BR&gt;want near the end of the log)&lt;BR&gt;&amp;nbsp; 12. Lookup the listed error number using err.exe or hrplus.exe. The DLL that it &lt;BR&gt;is having trouble on is the line just previous to the "exception/failed" line.&lt;BR&gt;&amp;nbsp; 13. Take the logical steps to address whatever the error is describing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; Notes - Don't forget to reverse these settings when done.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - If you identify a DLL that is the wrong version usually simply &lt;BR&gt;reapplying the relevant hotfix or service pack will resolve the issue.&lt;BR&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=1632552" width="1" height="1"&gt;</content><author><name>brian-murphy-booth</name><uri>http://blogs.iis.net/members/brian_2D00_murphy_2D00_booth.aspx</uri></author><category term="IIS News Item" scheme="http://blogs.iis.net/brian-murphy-booth/archive/tags/IIS+News+Item/default.aspx" /><category term="iis 6 troubleshooting" scheme="http://blogs.iis.net/brian-murphy-booth/archive/tags/iis+6+troubleshooting/default.aspx" /></entry><entry><title>DelegConfig (Kerberos/Delegation Configuration Reporting Tool)</title><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/delegconfig-delegation-configuration-reporting-tool.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="113045" href="http://blogs.iis.net/brian-murphy-booth/attachment/1613802.ashx" /><id>http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/delegconfig-delegation-configuration-reporting-tool.aspx</id><published>2007-03-09T19:10:00Z</published><updated>2007-03-09T19:10:00Z</updated><content type="html">&lt;P&gt;&lt;STRONG&gt;Where is the tool?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; &lt;A href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1434"&gt;http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1434&lt;/A&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;What is this tool?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; This is an ASP.NET application that I wrote a couple years ago that&amp;nbsp;is meant&amp;nbsp;to be called from Internet Explorer on an actual client machine. The tool (aspx page)&amp;nbsp;attempts to&amp;nbsp;look at all the common settings that contribute towards successful Kerberos authentication and delegation. I had originally written&amp;nbsp;a&amp;nbsp; simple&amp;nbsp;ASP page for my co-workers to&amp;nbsp;demonstrate how to see whether a request had authenticated with Kerberos or NTLM by doing Response.Write Request.ServerVariables("HTTP_AUTHORIZATION"). After a little while I decided "why stop there?!" The tool will now check all the common pitfalls of Kerberos authentication except for a couple issues that I can't check for when the web request fails entirely (if my page won't even run, how can I check those settings?).&lt;/P&gt;
&lt;P&gt;I'd like to hear your feedback!! If you have problems, constructive criticism, or praise&amp;nbsp;please&amp;nbsp;let me know. If you have comments or suggestions that will benefit the masses, I'll try to find time to implement your suggestions into the tool.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Usage Tips:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;READ THE "Explanation" SECTIONS!! This tool is meant to be a teacher. If you don't read your material, you probably aren't going to understand what to do or at least why you're doing something that it suggests you do.&lt;/LI&gt;
&lt;LI&gt;Did I mention that you should read the "Explanation" sections?? Do it!!&lt;/LI&gt;
&lt;LI&gt;There are some "Fix This" buttons that help automate addressing issues. Although it isn't 100% clear in some of the output, it is probably easiest to use the "Fix This" buttons instead of manually following any KB articles that are also included in the output. You can, however, do whichever you prefer since either method should fix the applicable configuration problem.&lt;/LI&gt;
&lt;LI&gt;If the DelegConfig tool doesn't work as expected, please see the "KNOWN PROBLEMS AND WORKAROUNDS" section below&lt;/LI&gt;
&lt;LI&gt;If you end up making changes to your configuration based on what the tool reports, it is common that you'll need to log on/off the workstation machine and/or restart the IIS service or back-end service before you see Kerberos/Delegation start to work as desired.&lt;/LI&gt;
&lt;LI&gt;Part of "Delegation" is authenticating with a back-end service. Don't forget to add the back-end server information with the applicable hyperlink to make sure everything looks good there too.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;---------------------------------------------------------------&lt;BR&gt;REQUIRED COMPONENTS:&lt;BR&gt;---------------------------------------------------------------&lt;BR&gt;&amp;nbsp; 1. All files in this ZIP are required for the ASPX page to operate properly.&lt;BR&gt;&amp;nbsp; 2. ASP.NET version 1.1.4322.2300 or higher (also works with&amp;nbsp;v2.0.50727)&amp;nbsp;must be installed on the IIS server.&lt;/P&gt;
&lt;P&gt;---------------------------------------------------------------&lt;BR&gt;OPTIONAL COMPONENTS:&lt;BR&gt;---------------------------------------------------------------&lt;BR&gt;&amp;nbsp; 1. For more accurate results&amp;nbsp;the .Net framework should be installed on the Workstation/Client&lt;/P&gt;
&lt;P&gt;---------------------------------------------------------------&lt;BR&gt;SETUP:&lt;BR&gt;---------------------------------------------------------------&lt;BR&gt;&amp;nbsp; 1. Unzip files to desired location that is *local* to the IIS server.&lt;BR&gt;&amp;nbsp; 2. In the IIS MMC create a new virtual directory that points to the folder with the unzipped files.&lt;BR&gt;&amp;nbsp; 3. Configure the virtual directory as an IIS application&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a. In the IIS MMC right-click the vDir and choose Properties.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; b. On the "Virtual Directory" tab click "Create" (if already configured as an IIS app you'll see a "Remove" button instead)&lt;BR&gt;&amp;nbsp; 4. Ensure that "Scripts Only" (recommended) or "Scripts and Executables" is enabled for this vDir.&lt;/P&gt;
&lt;P&gt;---------------------------------------------------------------&lt;BR&gt;USAGE:&lt;BR&gt;---------------------------------------------------------------&lt;BR&gt;&amp;nbsp; 1. View the Default.aspx page through a web browser with an address such as "&lt;A href="http://myserver/MyVirtualDirectory/" mce_href="http://myserver/MyVirtualDirectory/"&gt;http://MyServer/MyVirtualDirectory/&lt;/A&gt;"&lt;/P&gt;
&lt;P&gt;---------------------------------------------------------------&lt;BR&gt;KNOWN PROBLEMS AND WORKAROUNDS.&lt;BR&gt;---------------------------------------------------------------&lt;BR&gt;General:&lt;BR&gt;&amp;nbsp; Generally speaking if there are any problems running this tool's Default.aspx page (errors of any sort) it is probably because Kerberos isn't working yet. :-p. In that case it is best to start by requesting the page locally from the IIS server. Certain types of problems only exist when IE attempts to connect to IIS using Kerberos and&amp;nbsp;Kerberos&amp;nbsp;is usually not used when local to the IIS server. Requesting the Default.aspx&amp;nbsp;locally from the server&amp;nbsp;will avoid many types of problems this DelegConfig tool can encounter. Once you can get this page working locally from the IIS server the tool will then report some of the problems that could affect Kerberos and/or Delegation. Once some of those items are addressed and Kerberos is closer to working you may be able to do additional checks by requesting the ASPX page from a remote IE machine.&lt;/P&gt;
&lt;P&gt;--------------&lt;BR&gt;Problem:&lt;BR&gt;[HttpException (0x8007052e): Failed to start monitoring changes to '\\ServerName\ShareName'.]&lt;/P&gt;
&lt;P&gt;&amp;nbsp; ASP.net uses a hierarchical system of reading configuration files starting with Machine.Config, then web.config from the root of the web site, then finally web.config file from the virtual directory the ASPX application is running. Any time one of these files changes, IIS wants to be able to reload the file and restart the web application to ensure the most recent configuration is being used. If the dot net framework is not able to read from the root of the web site using the ASPNET account, this error will be returned. This is typical of when the home directory is a UNC path.&lt;/P&gt;
&lt;P&gt;Workaround:&lt;BR&gt;&amp;nbsp; 1. If running IIS 6.0 this can sometimes be fixed by disabling "Run www service in IIS 5.0 Isolation Mode".&lt;BR&gt;&amp;nbsp; OR&lt;BR&gt;&amp;nbsp; 2. To ensure that ASPNET can read from the root of the web site, temporarily change the "Home Directory" of the site to a local path. Once you have resolved the Kerberos and Delegation issues based on the results of the ASPX application you can change the home directory back to the desired UNC path.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;--------------&lt;BR&gt;Problem:&lt;BR&gt;&amp;nbsp; Continuous password prompt with underlying 401.1 response. There are 2 common possibilities for this.&lt;/P&gt;
&lt;P&gt;Additional Information:&lt;BR&gt;&amp;nbsp; Looking in the security event logs shows:&lt;/P&gt;
&lt;P&gt;POSSIBILITY ONE (notice the Logon Process of Kerberos):&lt;BR&gt;&amp;nbsp; Event Type:&amp;nbsp;Failure Audit&lt;BR&gt;&amp;nbsp; Event Source:&amp;nbsp;Security&lt;BR&gt;&amp;nbsp; Event Category:&amp;nbsp;Logon/Logoff &lt;BR&gt;&amp;nbsp; Event ID:&amp;nbsp;529&lt;BR&gt;&amp;nbsp; Date:&amp;nbsp;&amp;nbsp;1/1/2005&lt;BR&gt;&amp;nbsp; Time:&amp;nbsp;&amp;nbsp;6:00:00 PM&lt;BR&gt;&amp;nbsp; User:&amp;nbsp;&amp;nbsp;NT AUTHORITY\SYSTEM&lt;BR&gt;&amp;nbsp; Computer:&amp;nbsp;COMPUTERNAME&lt;BR&gt;&amp;nbsp; Description:&lt;BR&gt;&amp;nbsp; Logon Failure:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reason:&amp;nbsp;&amp;nbsp;Unknown user name or bad password&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; User Name:&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Domain:&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Logon Type:&amp;nbsp;3&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; Logon Process:&amp;nbsp;Kerberos&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Authentication Package:&amp;nbsp;Kerberos&lt;/P&gt;
&lt;P&gt;Workaround:&lt;BR&gt;&amp;nbsp; You receive an "HTTP Error 401.1 - Unauthorized: Access is denied due to invalid credentials" error message when you try to access a Web site that is part of an IIS 6.0 application pool&lt;BR&gt;&amp;nbsp; &lt;A href="http://support.microsoft.com/?id=871179" mce_href="http://support.microsoft.com/?id=871179"&gt;http://support.microsoft.com/?id=871179&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;POSSIBILITY TWO (notice the strange Logon Process):&lt;BR&gt;&amp;nbsp; Event Type:&amp;nbsp;Failure Audit&lt;BR&gt;&amp;nbsp; Event Source:&amp;nbsp;Security&lt;BR&gt;&amp;nbsp; Event Category:&amp;nbsp;Logon/Logoff &lt;BR&gt;&amp;nbsp; Event ID:&amp;nbsp;537&lt;BR&gt;&amp;nbsp; Date:&amp;nbsp;&amp;nbsp;1/1/2005&lt;BR&gt;&amp;nbsp; Time:&amp;nbsp;&amp;nbsp;6:00:00 PM&lt;BR&gt;&amp;nbsp; User:&amp;nbsp;&amp;nbsp;NT AUTHORITY\SYSTEM&lt;BR&gt;&amp;nbsp; Computer:&amp;nbsp;COMPUTERNAME&lt;BR&gt;&amp;nbsp; Description:&lt;BR&gt;&amp;nbsp; Logon Failure:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reason:&amp;nbsp;&amp;nbsp;An error occurred during logon&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; User Name:&amp;nbsp;someuser&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Domain:&amp;nbsp;&amp;nbsp;SOMEDOMAIN&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Logon Type:&amp;nbsp;3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Logon Process:&amp;nbsp;Ðù²&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Authentication Package:&amp;nbsp;NTLM&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Workstation Name:&amp;nbsp;COMPUTERNAME&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status code:&amp;nbsp;0xC000006D&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Substatus code:&amp;nbsp;0x0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source Network Address:&amp;nbsp;127.0.0.1&lt;/P&gt;
&lt;P&gt;Workaround:&lt;BR&gt;&amp;nbsp; You receive error 401.1 when you browse a Web site that uses Integrated Authentication and is hosted on IIS 5.1 or IIS 6&lt;BR&gt;&amp;nbsp; &lt;A href="http://support.microsoft.com/?id=896861" mce_href="http://support.microsoft.com/?id=896861"&gt;http://support.microsoft.com/?id=896861&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=1613802" width="1" height="1"&gt;</content><author><name>brian-murphy-booth</name><uri>http://blogs.iis.net/members/brian_2D00_murphy_2D00_booth.aspx</uri></author><category term="IIS News Item" scheme="http://blogs.iis.net/brian-murphy-booth/archive/tags/IIS+News+Item/default.aspx" /><category term="Kerberos" scheme="http://blogs.iis.net/brian-murphy-booth/archive/tags/Kerberos/default.aspx" /><category term="ServicePrincipalName" scheme="http://blogs.iis.net/brian-murphy-booth/archive/tags/ServicePrincipalName/default.aspx" /><category term="Delegation" scheme="http://blogs.iis.net/brian-murphy-booth/archive/tags/Delegation/default.aspx" /></entry><entry><title>The biggest mistake: ServicePrincipalName’s</title><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/the-biggest-mistake-serviceprincipalname-s.aspx" /><id>http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/the-biggest-mistake-serviceprincipalname-s.aspx</id><published>2007-03-09T19:09:00Z</published><updated>2007-03-09T19:09:00Z</updated><content type="html">&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;Note: All of your Kerberos configuration questions can be answered by using the DelegConfig tool that I wrote. You can find that&amp;nbsp;tool &lt;A class="" href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/delegconfig-delegation-configuration-reporting-tool.aspx" mce_href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/delegconfig-delegation-configuration-reporting-tool.aspx"&gt;here&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;Literally 99% of all Kerberos problems revolve around an incorrect, missing, or duplicate ServicePrincipalName (SPN).&amp;nbsp; To be honest, the concept of an SPN is so simple that I am often confused&amp;nbsp;that other people don't understand even after I explain. I suppose it is the&amp;nbsp;5+ years that I've had of helping people configure and troubleshoot Kerberos related issues that have finally made it all clear to me ;-p. I like to think in simple terms instead of making things complex . This is a carry-over from my Algebra-1 days when my teacher used to pick the easiest problem possible when explaining a concept.&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;Think of an SPN as a “username” used to identify a program&amp;nbsp;that is busy dealing&amp;nbsp;with credentials. And we're only allowed to talk to this program using its “username”. PERIOD. Simple! Yes, that's all an SPN is: a "username". And as with any username, the name itself isn't really that important. It is merely to make identifying a person (or entity) easier to remember to humans. In this particular case, however, there are some naming conventions for this "username". Okay, so what username (SPN) is the right one? And where do we set it? These 2 questions are&amp;nbsp;where all the confusion lies. We split the SPN into 2 parts and occasionally 3 parts: The first part is the “service type” and the second part is the “host name”. And sometimes the&amp;nbsp;3rd part is present which is the “port”. In the end, however, all these different parts are simply used to come up with this "username" that we call the ServicePrincipalName. &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;Let’s say I wanted to connect to a process called BrianService.exe. And the DNS name to route my connection was blah.overthere.com. As the designer of this weird service I might come up with a “service type” of BRIAN. So the SPN would be BRIAN/blah.overthere.com. Okay, and where do we set that? Simple, simple, simple. If my BrianService.exe process is running under “DOMAINNAME\someAccount” then we’d set the BRIAN/blah.overthere.com SPN on “DOMAINNAME\someAccount”. If my process (BrianService.exe) were running as something like “Network Service”, “Local Service”, or “Local System” then I’d set BRIAN/blah.overthere.com on the computer account itself that is running that process. If you ever change the account&amp;nbsp;that is running your program then you need to remove the SPN from the original account and set it on the new account because we can't have the same username assigned to multiple "people" (or accounts in our case).&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;Recap. An SPN is just a *name* that we've given to a "service"&amp;nbsp;which is in the format of ServiceType/HostName and occasionally ServiceType/HostName:PortNumber. And it is set on which ever account is handling authentication for that service. I should also note that&amp;nbsp;you as an administrator don’t get to pick whether you use a port. I used to think that maybe I could throw a port number on an SPN if I wanted to make it more secure. But&amp;nbsp;it is the client application that has the decision built in on whether to use a port. &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;Okay, so let’s make this more complicated by using more realistic names. But while I do that I want you to maintain faith in what I just explained above regarding how simple these concepts are. Let’s say you’re connecting to an IIS server with a machine name of “iis-prod-01”. And let’s say the active directory domain name is “company.com.” In Internet Explorer you use an address of http://someInventedName. The “application pool” (i.e. the w3wp.exe process) is running under the account of “COMPANY\myserviceAccount”. With the knowledge that the web service’s Kerberos “service type” is “HTTP” (don’t confuse this with the browser’s protocol type) you’re probably thinking we can set an SPN of “HTTP/someInventedName” on “COMPANY\myserviceAccount”.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Doh!! Sorry no. Almost, but Kerberos would probably not work with that. The problem with that idea is that you have to know how name resolution is working also because it is ultimately name resolution that dictates what the "host name" part of the SPN should be. If you open a CMD prompt and ping someInventedName, it will most likely resolve to someInventedName.company.com. Therefore the SPN that “IE” will request is “HTTP/someInventedName.company.com”. IE was not programmed to request an SPN using the port so that part of the SPN is not needed nor can it ever be used. What if the ping did show the name as just “someInventedName”? Then IE would in-fact use Kerberos with an SPN of “HTTP/someInventedName” When dealing with NetBIOS names, because name resolution can be affected by many things, the key is to make sure an SPN of both “HTTP/someInventedName” and “HTTP/someInventedName.company.com” are set on the “COMPANY\myserviceAccount” account. Or the way I prefer to say that is you need to create an SPN that represents both the NetBIOS name and the Fully Qualified name.&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;FONT face=Calibri&gt;Okay, so I can hear what many of you are thinking. “But I thought that KB article said to set the SPN on the computer account!” Well, yes, that would be accurate *IF* the process handling authentication was running as “SYSTEM”. If the process for that service is not running as SYSTEM (or Network Service, or Local Service) then you can’t set the SPN on the computer account (well you can but Kerberos isn’t going to work).&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;Recap 2: An SPN should actually be in the format of ServiceType/NetBIOSName *and* ServiceType/FQDN. And we *always* set that on whatever account is running the process that is handling the authentication. Read the above paragraphs a couple times and just maintain faith that it is really that simple. Don’t complicate it with questions!!&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;FONT face=Calibri&gt;I want to mention one last thing before I go. Whenever a computer is joined to a domain, it is assigned 2 SPN's by default: HOST/netbiosName, and HOST/FQDN.com. netbiosName being the machine name of the computer you're joining to the domain, and FQDN.com being the fully qualified machine name. These two SPN's use the generic "HOST" service type which includes all the various services that *come* with Windows. Therefore, if you connect to http://machineName or http://machineName.company.com, you will already have SPN's set that will handle Kerberos when using those names. Or if you connected to \\machineName\SomeShareName you'd also be all set for Kerberos (UNC's need a "CIFS" SPN which is included under "HOST" also). For a full list of the different service types included in HOST please see Table 1 of &lt;/FONT&gt;&lt;A href="http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/tkerbdel.mspx" target=_blank mce_href="http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/tkerbdel.mspx"&gt;&lt;SPAN style="COLOR: orange"&gt;&lt;FONT face=Calibri&gt;this&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;FONT face=Calibri&gt; technet article.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;FONT face=Calibri&gt;--Brian Murphy-Booth&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=1613799" width="1" height="1"&gt;</content><author><name>brian-murphy-booth</name><uri>http://blogs.iis.net/members/brian_2D00_murphy_2D00_booth.aspx</uri></author><category term="Kerberos SPN ServicePrincipalName" scheme="http://blogs.iis.net/brian-murphy-booth/archive/tags/Kerberos+SPN+ServicePrincipalName/default.aspx" /></entry><entry><title>How to setup ASP.NET v1.1 (Visual Studio .NET 2003) projects on IIS7 (Vista)</title><link rel="alternate" type="text/html" href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/how-to-setup-asp-net-v1-1-visual-studio-net-2003-projects-on-iis7-vista.aspx" /><id>http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/how-to-setup-asp-net-v1-1-visual-studio-net-2003-projects-on-iis7-vista.aspx</id><published>2007-03-09T19:07:00Z</published><updated>2007-03-09T19:07:00Z</updated><content type="html">&lt;P&gt;Note: Although you can get Visual Studio .NET 2003 to work properly on Vista, Microsoft does not support this scenario. "Not supported" doesn't mean "won't work". It just means if you run into any trouble you just can't call the MS support line for assistance with this issue. Microsoft does, however, fully support *running* a .NET v1.1 app on Vista.&lt;/P&gt;
&lt;P&gt;Because I support both IIS and ASP.NET here at Microsoft, I find it necessary to have both "Visual Studio .NET 2003" and "Visual Studio 2005" installed. I need to be able effectively troubleshoot issues for whatever product our customers need help with. But like any other tech junky, I like to have the latest-and-greatest OS installed so that I can learn the various features of the OS through day-to-day use. For this reason, I have Windows Vista installed on my primary machine. But, particularly when I was less familiar with the IIS 7.0 UI, getting ASP.NET 1.1 to run on IIS 7.0 was frustrating. Here are some of the errors I encountered while trying to get this setup:&lt;/P&gt;
&lt;HR&gt;
Microsoft Development Environment&lt;BR&gt;Error while trying to run project: Unable to start debugging on the web server. Could not start ASP.NET or ATL Server debugging.&lt;BR&gt;Verify that ASP.NET or ATL Server is correctly installed on the server.&lt;BR&gt;
&lt;HR&gt;
Microsoft Developement Environment&lt;BR&gt;Error while trying to run project: Unable to start debugging on the web server. You do not have permissions to debug the server.&lt;BR&gt;Verify that you are a member of the "Debugger Users" group on the server.&lt;BR&gt;
&lt;HR&gt;
ASP.NET Version Mismatch&lt;BR&gt;Visual Studio .NET has detected that the Web server is running ASP.NET version 1.0. The Web application you are creating or opening can be configured to be compliant with ASP.NET 1.0.&lt;BR&gt;However, the application will not be able to use new features from ASP.NET 1.1.&lt;BR&gt;
&lt;HR&gt;

&lt;P&gt;To set this up properly so the above errors don't occur, follow these steps.&lt;/P&gt;
&lt;TABLE class=""&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top width="33%"&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN class=style2&gt;1. Ensure that .NET 1.1 ---&amp;gt;&lt;/SPAN&gt;&lt;U&gt;&lt;EM&gt;&lt;SPAN class=style1&gt;SP1&lt;/SPAN&gt;&lt;/EM&gt;&lt;/U&gt;&lt;SPAN class=style2&gt;&amp;lt;--- or higher is properly installed.&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;LI&gt;Vista does not include .NET v1.1 by default.&lt;/LI&gt;
&lt;LI&gt;Because .NET 1.1 is not included by default, .NET v1.1 *SP1* is also not included.&lt;/LI&gt;
&lt;LI&gt;Without SP1, W3WP.exe will crash when running an appPool under v1.1 due to DEP&lt;/LI&gt;
&lt;LI&gt;To check this, make sure that &lt;STRONG&gt;c:\Windows\Microsoft.NET\Framework\v1.1.4322\mscorsvr.dll&lt;/STRONG&gt; is version &lt;STRONG&gt;1.1.4322.2032&lt;/STRONG&gt; or higher.&lt;/LI&gt;
&lt;LI&gt;Unless you are 100% sure that SP1 for .NET is installed, you &lt;STRONG&gt;&lt;U&gt;&lt;EM&gt;*really*&lt;/EM&gt;&lt;/U&gt;&lt;/STRONG&gt; should double-check this.&lt;/LI&gt;&lt;/OL&gt;&lt;/TD&gt;
&lt;TD class="" width="67%"&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/01.mscorsvr.version.jpg" mce_href="http://blogs.iis.net/blogs/brian-murphy-booth/01.mscorsvr.version.jpg"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/01.mscorsvr.version.jpg" border=0 mce_src="http://blogs.iis.net/blogs/brian-murphy-booth/01.mscorsvr.version.jpg"&gt;&lt;/A&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;&amp;nbsp; &lt;/TD&gt;
&lt;TD class=""&gt;&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;
&lt;P class=style1&gt;&lt;B&gt;2. Enable IIS 6.0 compatibility&lt;/LI&gt;&lt;/B&gt;&lt;/P&gt;
&lt;OL style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Control Panel&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Double-click &lt;STRONG&gt;Programs and Features&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Expand &lt;STRONG&gt;Internet Information Services&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Expand &lt;STRONG&gt;Web Management Tools&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Check &lt;STRONG&gt;IIS 6 Management Compatibility&lt;/STRONG&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/TD&gt;
&lt;TD class=""&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/02.IIS6.Compatibility.jpg" mce_href="http://blogs.iis.net/blogs/brian-murphy-booth/02.IIS6.Compatibility.jpg"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/02.IIS6.Compatibility.jpg" border=0 mce_src="http://blogs.iis.net/blogs/brian-murphy-booth/02.IIS6.Compatibility.jpg"&gt;&lt;/A&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;&amp;nbsp; &lt;/TD&gt;
&lt;TD class=""&gt;&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;
&lt;P class=style2&gt;&lt;STRONG&gt;3. Register v1.1 with IIS&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;LI&gt;Open a CMD prompt&lt;/LI&gt;
&lt;LI&gt;Change your directory to &lt;STRONG&gt;c:\Windows\MIcrosoft.net\Framework\v1.1.4322&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Run "&lt;STRONG&gt;aspnet_regiis -ir&lt;/STRONG&gt;"&lt;/LI&gt;
&lt;LI&gt;"ir" registers v1.1 with IIS but doesn't change any existing script mappings&lt;/LI&gt;
&lt;LI&gt;aspnet_regiis should also create a new AppPool under "&lt;STRONG&gt;Application Pools&lt;/STRONG&gt;" called "&lt;STRONG&gt;ASP.NET 1.1&lt;/STRONG&gt;" that is configured with the "&lt;STRONG&gt;Classic&lt;/STRONG&gt;" pipline, and "&lt;STRONG&gt;Enable32BitAppOnWin64&lt;/STRONG&gt;" set to true if a 64-bit OS.&lt;/LI&gt;&lt;/OL&gt;&lt;/TD&gt;
&lt;TD class=""&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/03.aspnet_regiis.jpg" mce_href="http://blogs.iis.net/blogs/brian-murphy-booth/03.aspnet_regiis.jpg"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/03.aspnet_regiis.jpg" border=0 mce_src="http://blogs.iis.net/blogs/brian-murphy-booth/03.aspnet_regiis.jpg"&gt;&lt;/A&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;&amp;nbsp; &lt;/TD&gt;
&lt;TD class=""&gt;&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top colSpan=2&gt;
&lt;P class=style2&gt;&lt;STRONG&gt;4. Make sure IIS permits running ASP.NET.&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;LI&gt;Open the IIS manager.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Highlight your &lt;STRONG&gt;Computer Name&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Double-click &lt;STRONG&gt;ISAPI and CGI Restrictions&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Select &lt;STRONG&gt;ASP.NET v1.1.4322&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Allow&lt;/STRONG&gt; in the &lt;STRONG&gt;Actions&lt;/STRONG&gt; section in the upper right.&lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/04.ISAPI.Restrictions.jpg" mce_href="http://blogs.iis.net/blogs/brian-murphy-booth/04.ISAPI.Restrictions.jpg"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/04.ISAPI.Restrictions.jpg" border=0 mce_src="http://blogs.iis.net/blogs/brian-murphy-booth/04.ISAPI.Restrictions.jpg"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;&amp;nbsp; &lt;/TD&gt;
&lt;TD class=""&gt;&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top colSpan=2&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN&gt;5. Make the new ASP.NET 1.1&lt;/SPAN&gt;&lt;SPAN class=style1&gt; appPool the default.&lt;/LI&gt; &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;LI&gt;Open the IIS manager&lt;/LI&gt;
&lt;LI&gt;Select the&amp;nbsp;&lt;STRONG&gt;Sites&lt;/STRONG&gt; folder.&lt;/LI&gt;
&lt;LI&gt;Under &lt;STRONG&gt;Actions&lt;/STRONG&gt; on the upper right, click &lt;STRONG&gt;Set Web Site Defaults...&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Change the &lt;STRONG&gt;Application Pool&lt;/STRONG&gt; setting to &lt;STRONG&gt;ASP.NET 1.1&lt;/STRONG&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/brian-murphy-booth/05.Default.AppPool.jpg" mce_href="http://blogs.iis.net/blogs/brian-murphy-booth/05.Default.AppPool.jpg"&gt;&lt;IMG src="http://blogs.iis.net/blogs/brian-murphy-booth/05.Default.AppPool.jpg" border=0 mce_src="http://blogs.iis.net/blogs/brian-murphy-booth/05.Default.AppPool.jpg"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;&amp;nbsp; &lt;/TD&gt;
&lt;TD class=""&gt;&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" vAlign=top&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;6. **ALTERNATIVE&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt; step to 5**&amp;nbsp;-&amp;nbsp;Change the AppPool to ASP.NET 1.1 --&amp;gt;after&amp;lt;-- creating the ASP.NET project instead of making it the default.&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;OL style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;LI&gt;Create the v1.1 ASP.NET project via Visual Studio. Attempting to run the project at this point will fail if the 1.1 appPool is not the default.&lt;/LI&gt;
&lt;LI&gt;Open the IIS manager.&lt;/LI&gt;
&lt;LI&gt;Right-click the newly create application directory and choose &lt;STRONG&gt;Advanced Settings&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Change the &lt;STRONG&gt;Application Pool&lt;/STRONG&gt; to &lt;STRONG&gt;ASP.NET 1.1&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Go back to Visual Studio and attempt to run/debug project.&lt;/LI&gt;&lt;/OL&gt;&lt;/TD&gt;
&lt;TD class=""&gt;&amp;nbsp; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Happy coding!!&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=1613798" width="1" height="1"&gt;</content><author><name>brian-murphy-booth</name><uri>http://blogs.iis.net/members/brian_2D00_murphy_2D00_booth.aspx</uri></author></entry></feed>