2012-02-18 10 views
2

ServiceDefinition.csdefまたはこれ以外の場所で、IISに移動せずに手動で調整する方法はありますか?AzureのLocalSystemとしてのアプリケーションプールのセットアップID

私はexecutionContext="elevated"を試してみましたが、うまく機能しませんでした。

UPDATE

あなたはAzureのIIS上の "IIS 6メタベース互換" をインストールした場合、私は以下のようなエラーが消えます。

これにより、Azureの展開段階で「IIS 6メタベース互換性」が自動的にインストールされます。


@astaykovは、私がコメントしたが、あまりにも大きな以下のコードは、私はこの場所を使用しています。私はappPoolNameでrigth値を得ることができますが、エラーがここで起こっ

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(); 
     } 

using (DirectoryEntry azureAppPool = appPools.Children.Find(appPoolName, "IIsApplicationPool"))

私はどこでも、まだ解決策を探しています私はとウェイドワーグナーで書いた同じコードを使用

手がかりを見つけることができません IISイベントからのエラー:

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.<InitializeRole>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() 

Anyideas?

答えて

3

executionContext = "elevated"は、RoleEntryPointをローカルSYSTEMアカウントとしてのみ実行しますが、IISプールIDではありません。

this blog post by Wade Wagnerをチェックしてください。彼がそこに記述しているのは、あなたのOnStartメソッドでexecutionContext = "elevated"(adminだけがプールのアイデンティティを変更できるため)と一緒に実行できます。それがローカルシステムでは動作しない場合は、RDP用のユーザーを作成してAdministratorsグループに追加し、そのユーザーにiisアプリケーションプールIDを設定することができます。

UPDATE

フム、私は(似ている)は、以下の方法を使用し、それがうまく働いた:

private void SetAppPoolIdentity() 
{ 
    string appPoolUser = "myRDP_admin_user"; 
    string appPoolPass = "my_super_secure_password"; 

    Action<string> iis7fix = (appPoolName) => 
    { 
     bool committed = false; 
     while (!committed) 
     { 
      try 
      { 
       using (ServerManager sm = new ServerManager()) 
       { 
        var applicationPool = sm.ApplicationPools[appPoolName]; 
        applicationPool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser; 
        applicationPool.ProcessModel.UserName = appPoolUser; 
        applicationPool.ProcessModel.Password = appPoolPass; 
        sm.CommitChanges(); 
        committed = true; 
       } 
      } 
      catch (FileLoadException fle) 
      { 
       Trace.TraceError("Trying again because: " + fle.Message); 
      } 
     } 
    }; 

    // ServerManager in %WinDir%System32InetSrvMicrosoft.Web.Administration.dll 
    var sitename = RoleEnvironment.CurrentRoleInstance.Id + "_Web"; 
    var appPoolNames = new ServerManager().Sites[sitename].Applications.Select(app => app.ApplicationPoolName).ToList(); 
    appPoolNames.ForEach(iis7fix); 
} 

あなたはそれを試してみてもらえますか?実際のアカウントではないため、ローカルシステムアカウントでは機能しません(少なくとも私はそれを行う方法はわかりませんが、RDPの特定のアカウントでは正常に動作します)。

0

作成start.cmd:

FOR /F "tokens=*" %%A IN ('%windir%/system32/inetsrv/APPCMD list wp /text:apppool.name') DO (

%systemroot%/system32/inetsrv/APPCMD set config /section:applicationPools /[name='%%A%':'].processModel.identityType:LocalSystem 

) 
関連する問題