title: Setup Identity for an Application Pool as LocalSystem in Azure
body: <p>Is there a way to do this in <code>ServiceDefinition.csdef</code> or other place without go to the IIS and adjust by hand?</p>
  
  <p>I tried <code>executionContext="elevated"</code> for webrole, not working.</p>
  
  <p><strong>UPDATE</strong></p>
  
  <p>If you install "IIS 6 Metabase Compatibility" on Azure IIS, the error I shown below will gone.</p>
  
  <p><strong>This raise another issue, howto install "IIS 6 Metabase Compatibility" automatically at deployment stage on Azure.</strong></p>
  
  <hr>
  
  <p><em>@astaykov, I like to comment but the code below too big, so I use this place.</em></p>
  
  <p>I use the same code that wrote by Wade Wagner as:</p>
  
  <pre><code>public override bool OnStart()
          {
              // http://code.msdn.microsoft.com/windowsazure/CSAzureChangeAppPoolIdentit-27099828
              // This variable is used to iterate through list of Application pools 
              string metabasePath = "IIS://localhost/W3SVC/AppPools";
              string appPoolName;
              using (ServerManager serverManager = new ServerManager())
              {
                  //Get the name of the appPool that is created by Azure 
                  appPoolName = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"].Applications.First().ApplicationPoolName;
                  // Get list of appPools at specified metabasePath location 
                  using (DirectoryEntry appPools = new DirectoryEntry(metabasePath))
                  {
                      // From the list of appPools, Search and get the appPool that is created by Azure  
                      using (DirectoryEntry azureAppPool = appPools.Children.Find(appPoolName, "IIsApplicationPool"))
                      {
                          if (azureAppPool != null)
                          {
                              // Refer to: 
                              // http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e3a60d16-1f4d-44a4-9866-5aded450956f.mspx?mfr=true,  
                              // http://learn.iis.net/page.aspx/624/application-pool-identities/  
                              // for more info on AppPoolIdentityType 
                              azureAppPool.InvokeSet("AppPoolIdentityType", new Object[] { 0 });  // MD_APPPOOL_IDENTITY_TYPE_LOCALSYSTEM
                              // Write above settings to IIS metabase 
                              azureAppPool.Invoke("SetInfo", null);
                              // Commit the above configuration changes that are written to metabase 
                              azureAppPool.CommitChanges();
                          }
                      }
                  }
              }
              RoleInRun = true;
              TaskInRun = false;
              return base.OnStart();
          }
  </code></pre>
  
  <p>I can get rigth value at <code>appPoolName</code>, But error happened here:
  <code>using (DirectoryEntry azureAppPool = appPools.Children.Find(appPoolName, "IIsApplicationPool"))</code></p>
  
  <p>I am searching solutions everywhere but still cannot find a clue
  Error below, from IIS events:</p>
  
  <pre><code>Application: WaIISHost.exe
  Framework Version: v4.0.30319
  Description: The process was terminated due to an unhandled exception.
  Exception Info: System.Runtime.InteropServices.COMException
  Stack:
     at System.DirectoryServices.DirectoryEntry.Bind(Boolean)
     at System.DirectoryServices.DirectoryEntry.Bind()
     at System.DirectoryServices.DirectoryEntry.get_IsContainer()
     at System.DirectoryServices.DirectoryEntries.Find(System.String, System.String)
     at GimmeRank.Redirector.WebRole.OnStart()
     at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType)
     at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.&lt;InitializeRole&gt;b__0()
     at System.Threading.ExecutionContext.runTryCode(System.Object)
     at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
     at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
     at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
     at System.Threading.ThreadHelper.ThreadStart()
  </code></pre>
  
  <p>Anyideas?</p>