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

我尝试更改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 

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

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

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

编辑 :韦德也展示了如何使用稍微不同的方法来做到这一点(检查评论)。 试试这个

好的,这是我的答案。 发生此错误是因为NetworkService标识对iisWasKey密钥没有读访问权限。 更多信息以及如何解决此问题我在这里找到: 当您尝试更改应用程序池的标识时,“键集不存在”错误消息