У меня есть инструмент настройки, который настраивает сертификат IIS SSL для веб-сайта. Он создает новую привязку в конфигурации IIS для «Веб-сайта по умолчанию», а затем назначает ему сертификат SSL. Инструмент отлично работает, когда я запускаю его от имени административной учетной записи, но не работает при запуске под обычной учетной записью с ошибкой «доступ запрещен».
Вот код инструмента:
using Microsoft.Web.Administration;
using System;
using System.Globalization;
using System.Linq;
namespace TestIisSslCert
{
class Program
{
static void Main(string[] args)
{
try
{
var sslCertThumbprint = "733AD4B4A8FA5F7DE2F4640F91B176BDB1D2BE25";
// calculating certificate hash
var certificateHash = new byte[20];
for (int i = 0, j = 0; i < sslCertThumbprint.Length; i += 2, j++)
{
string s = sslCertThumbprint[i].ToString().ToLower() + sslCertThumbprint[i + 1].ToString().ToLower();
byte o = byte.Parse(s, NumberStyles.HexNumber);
certificateHash[j] = o;
}
// adding a binding with a reference to the certificate:
var siteName = "Default Web Site";
using (var serverManager = new ServerManager())
{
var site = serverManager.Sites[siteName];
var bindings = site.Bindings.ToList();
foreach (var binding in bindings)
{
if (binding.Protocol == "https")
site.Bindings.Remove(binding);
}
site.Bindings.Add(":443:", certificateHash, "My");
serverManager.CommitChanges();
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadKey();
}
}
}
Вот ошибка, которую я получаю, когда запускаю его как пользователь:
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at Microsoft.Web.Administration.Interop.IAppHostMethodInstance.Execute()
at Microsoft.Web.Administration.Binding.AddSslCertificate(Byte[] certificateHash, String certificateStoreName)
at Microsoft.Web.Administration.BindingManager.Save()
at Microsoft.Web.Administration.ServerManager.CommitChanges()
Я добавил полный контроль над следующими папками:
Я также попробовал следующую ссылку, но это не помогло: https://support.comodo.com/index.php?/Knowledgebase/Article/View/1129/37/access-denied-exception-from-hresult-0x80070005-e_accessdenied
Есть ли какие-либо другие параметры безопасности или политики, которые мне нужно предоставить моему пользователю?
Некоторые дополнительные детали: Я проверил, есть ли что-нибудь, что может требовать разрешений в ProcessMonitor, но я не нашел ни ключей реестра, ни файлов с надписью «ACCESS DENIED». Был только один раздел реестра, который я добавил, но никакой разницы это не имеет: HKLM \ System \ CurrentControlSet \ Services \ WinSock2 \ Parameters.
Также можно добавить новую привязку без сертификата, но когда я указываю хэш сертификата, это не удается. Как будто какая-то политика не позволяет мне запускать код, вероятно, что-то связанное с COM, поскольку Microsoft.Web.Administration является оболочкой для интерфейсов COM, но я не уверен.
Я попытался выполнить ту же операцию с netsh:
netsh http add sslcert ipport=0.0.0.0:443 certhash=35e010f567bf61
62e8eb7974ee98eb64c4ed2c55 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
SSL Certificate add failed, Error: 5
The requested operation requires elevation (Run as administrator).
Кажется, что для этого нет обходного пути, и я должен использовать учетную запись администратора. Также у меня есть похожий ответ по тому же вопросу на форуме IIS.
У меня были те же требования, и после стольких поисков стало ясно, что права администратора требуются в любом случае.
Я решил эту проблему, создав новый пул приложений с пользовательской учетной записью в качестве идентификатора.
В основном на моем сервере было 2 пользователя. один администратор и другой user_account с той же группой администраторов. Но все же user_account не смог разместить какой-либо сайт через код в IIS.
Теперь ваш сайт / веб-api будет работать под учетной записью администратора.
Надеюсь, это поможет в любом случае