更改应用程序池的标识时出错

时间:2011-09-07 08:29:06

标签: c# windows iis azure

我尝试在Windows Azure上更改应用程序池的标识。我的项目在Windows Azure上运行时使用此应用程序池。默认情况下,应用程序池使用NetworkService标识,但我必须使用其他标识。我尝试通过这种方式在WebRole的OnStart()事件中更改它:

using (ServerManager serverManager = new ServerManager())
{                       
    string appPoolName =
    serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"]
    .Applications.First().ApplicationPoolName;

    var appPool = serverManager.ApplicationPools[appPoolName];

    appPool.ProcessModel.UserName = Environment.MachineName + "\\UserName";

    appPool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;

    appPool.ProcessModel.Password = "UserPassword";

    serverManager.CommitChanges();
}

但是下一条消息我得到了例外:

    System.Runtime.InteropServices.COMException (0x80090016): 
       Keyset does not exist (Exception from HRESULT: 0x80090016)
   at Microsoft.Web.Administration.Interop.AppHostWritableAdminManager.CommitChanges()
   at Microsoft.Web.Administration.Configuration.CommitChanges()
   at Microsoft.Web.Administration.ConfigurationManager.CommitChanges()
   at Microsoft.Web.Administration.ServerManager.CommitChanges()
   at Project.Web.WebRole.OnStart() in E:\Projects\...\Web\WebRole.cs:line 57

如果我在IIS管理器中更改身份,我不会收到任何错误。我的代码出了什么问题,为什么会出现这个错误?

2 个答案:

答案 0 :(得分:2)

对applicationHost.config的更新需要管理权限。在本地运行时,您是管理员。在云中,除非您提升角色,否则您的RoleEntryPoint将以普通用户身份运行。你这样做了吗?

检查您在ServiceDefinition.csdef中的角色声明中是否指定了<Runtime executionContext="elevated"/>

编辑:Wade还展示了如何使用稍微不同的方法执行此操作(请查看注释)。 Try this as well

答案 1 :(得分:2)

好的,这是我的答案。发生此错误是因为NetworkService标识对iisWasKey密钥没有读访问权限。我在此处找到了更多信息以及如何解决此问题:"Keyset does not exist" error message when you try to change the identity of an application pool