System.UnauthorizedAccessException Доступ к разделу реестра

У меня есть код, который вызывает API TFS и возвращает метаданные команды. (например, имена команд, пути к области и т.д.). Код отлично работает локально в проекте MVC Visual Studio ASP.NET, но сбой при каждом развертывании на сервере.

То, что я пробовал, что не работает:

Я предоставил учетную запись пользователя AppPool Полный доступ к разделу реестра (не работал) Кроме того, попробовал предоставить "Полный контроль" в раздел реестра (все еще не работал) Любое понимание того, как настроить правильные разрешения конфигурации для развертываемых приложений IIS для использования в TFS API, будет с благодарностью оценено. (сообщение об ошибке ниже)

Здесь появляется сообщение об ошибке:

System.UnauthorizedAccessException

Access to the registry key 'HKEY_CURRENT_USER\Software\Microsoft\VSCommon\12.0\ClientServices\TokenStorage\VisualStudio' is denied.

System.UnauthorizedAccessException: Access to the registry key 'HKEY_CURRENT_USER\Software\Microsoft\VSCommon\12.0\ClientServices\TokenStorage\VisualStudio' is denied.
   at Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str)
   at Microsoft.Win32.RegistryKey.CreateSubKeyInternal(String subkey, RegistryKeyPermissionCheck permissionCheck, Object registrySecurityObj, RegistryOptions registryOptions)
   at Microsoft.Win32.RegistryKey.CreateSubKey(String subkey, RegistryKeyPermissionCheck permissionCheck, RegistryOptions options)
   at Microsoft.VisualStudio.Services.Common.TokenStorage.RegistryTokenStorageHelper.GetRootKey(String subkeyName)
   at Microsoft.VisualStudio.Services.Common.TokenStorage.RegistryTokenStorage.RetrieveToken(VssTokenKey tokenKey)
   at Microsoft.TeamFoundation.Client.TfsClientCredentialStorage.RetrieveToken(Uri serverUrl, VssCredentialsType credentialType)
   at Microsoft.TeamFoundation.Client.CookieCredential.OnCreateTokenProvider(Uri serverUrl, HttpWebResponse response)
   at Microsoft.TeamFoundation.Client.IssuedTokenCredential.CreateTokenProvider(Uri serverUrl, HttpWebResponse response, IssuedToken failedToken)
   at Microsoft.TeamFoundation.Client.TfsClientCredentials.TryGetTokenProvider(Uri serverUrl, IssuedTokenProvider& provider)
   at Microsoft.TeamFoundation.Client.Channels.TfsHttpRequestHelpers.PrepareWebRequest(HttpWebRequest webRequest, Guid sessionId, String operationName, CultureInfo cultureInfo, TfsRequestSettings settings, TfsClientCredentials credentials, IdentityDescriptor impersonate, IssuedToken& currentToken, IssuedTokenProvider& tokenProvider)
   at Microsoft.TeamFoundation.Client.Channels.TfsHttpRequestHelpers.CreateSoapRequest(Uri requestUri, Guid sessionId, String soapAction, String operationName, CultureInfo cultureInfo, TfsRequestSettings settings, TfsClientCredentials credentials, IdentityDescriptor impersonate, IssuedToken& currentToken, IssuedTokenProvider& tokenProvider)
   at Microsoft.TeamFoundation.Client.Channels.TfsHttpWebRequest.CreateWebRequest()
   at Microsoft.TeamFoundation.Client.Channels.TfsHttpWebRequest.SendRequest()
   at Microsoft.TeamFoundation.Client.Channels.TfsHttpRequestChannel.Request(TfsMessage message, TimeSpan timeout)
   at Microsoft.TeamFoundation.Client.Channels.TfsHttpClientBase.Invoke(TfsClientOperation operation, Object[] parameters, TimeSpan timeout, Object[]& outputs)
   at Microsoft.TeamFoundation.Framework.Client.RegistrationProxy.GetRegistrationEntries(String toolId)
   at Microsoft.TeamFoundation.Framework.Client.RegistrationService.RefreshMemoryCache()
   at Microsoft.TeamFoundation.Framework.Client.RegistrationService.Microsoft.TeamFoundation.Server.IRegistration.GetRegistrationEntries(String toolId)
   at Microsoft.TeamFoundation.Framework.Client.IdentityManagementService..ctor(TfsConnection tfsBase)
   at Microsoft.TeamFoundation.Framework.Client.IdentityManagementService2..ctor(TfsConnection tfsBase)
   at Microsoft.TeamFoundation.Client.TfsConnection.CreateInternalProxy(Type serviceType)
   at Microsoft.TeamFoundation.Client.TfsConnection.GetServiceInstance(Type serviceType, Object serviceInstance)
   at Microsoft.TeamFoundation.Client.TfsConnection.GetService(Type serviceType)
   at Microsoft.TeamFoundation.Client.TfsConnection.GetService[T]()
   at Microsoft.TeamFoundation.Client.TfsTeamService.QueryTeams(String projectId)

Ответ 1

У меня была такая же проблема, и я решил ее, установив "Загрузить профиль пользователя" в настройках пула приложений IIS на True.

Я не знаю, была ли эта новая зависимость в TFS 2013 или изменилась ли IIS 8.5 по умолчанию, но это исправляет ее для меня.

Ответ 2

Я столкнулся с этой же проблемой, но установка Load User Profile в TRUE не сработала для меня. Что в конечном итоге работало в реестре и добавило ключ "HKCU\Software\Microsoft\VSCommon\12.0\ClientServices" для соответствующих пользователей. По-видимому, сборки TFS становятся немного расстроенными, когда вы пытаетесь использовать их в системах без установленной Visual Studio.

Кредит относится к тому, кто добавил эту информацию в http://msdn.developer-works.com/article/12173562/After+upgrade+from+TFS+2010+to+TFS+2013+the+soap+notifications+stop+working.

Ответ 3

У нас была эта проблема и настройка "Загрузить профиль пользователя" в настройках пула приложений IIS для True для нас. Но затем эта же проблема вернулась, и мы обнаружили, что параметр "Загрузить профиль пользователя" в настройках пула приложений IIS False исправил проблему еще раз. Поэтому мне кажется, что это настройка этого параметра, который фиксирует что-то, а не фактическое значение, на которое оно установлено. Независимо от того, какой параметр "Загрузить профиль пользователя" в пуле приложений IIS установлен, я бы попытался переключить его на противоположное значение, обновить пул приложений и посмотреть, помогает ли это. Если кто-то отслеживает основную причину этого, пожалуйста, поделитесь им.