У меня есть инструмент конфигурации, который настраивает сертификат IIS SSL для веб-сайта. Он создает новую привязку в конфигурации IIS для "Default Web Site", а затем назначает ему сертификат SSL. Инструмент работает нормально, когда я запускаю его от имени учетной записи администратора, но дает сбой при запуске под учетной записью обычного пользователя с ошибкой "access denied".
Вот код инструмента:
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()
Я добавил полный контроль над следующими папками:
- "C:\Windows\System32\inetsrv\config"
- "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys"
- "C:\inetpub\wwwroot"
Я также попробовал следующую ссылку, но это не помогло: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, но я не уверен.
решение1
Я попробовал выполнить ту же операцию с помощью 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
У меня были те же требования, и после стольких поисков стало ясно, что права администратора требуются в любом случае.
Я решил эту проблему, создав новый пул приложений с пользовательской учетной записью в качестве идентификатора.
По сути, на моем сервере было 2 пользователя. Один Администратор, а другой user_account с той же группой администраторов. Но все равно user_account не мог разместить ни одного сайта через код на IIS.
- Перейти к ИИС
- Затем нажмите «Пул приложений».
- Добавьте новый пул приложений, выберите соответствующие настройки и нажмите ОК.
- Нажмите на недавно созданный пул и выберите «Расширить свойство».
- Перейдите в раздел модели процесса и нажмите на три точки в свойстве Identity.
- Выберите Пользовательскую учетную запись.
- Введите Администратор (или любое другое имя для учетной записи администратора)
- Введите пароль администратора (если у вас его нет, спросите у руководителя сети или у кого-либо, кто его знает, так как это делается только один раз) и нажмите OK.
Теперь ваш сайт/веб-API будет работать от имени учетной записи администратора.
Надеюсь, это хоть как-то поможет.