Eu tenho uma ferramenta de configuração que configura o certificado SSL do IIS para um site. Ele cria uma nova ligação na configuração do IIS para "Site padrão" e, em seguida, atribui um certificado SSL a ele. A ferramenta funciona bem quando eu executá-lo em nome da conta administrativa, mas falha ao executar sob a conta de usuário regular com erro "acesso negado".
Aqui está o código da ferramenta:
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();
}
}
}
Aqui está o erro que estou recebendo quando eu o executo como usuário:
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()
Eu adicionei controle total sobre as seguintes pastas:
- "C: \ Windows \ System32 \ inetsrv \ config"
- "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys"
- "C: \ inetpub \ wwwroot"
Eu também tentei o seguinte link, mas não ajudou:
Existe alguma outra configuração ou política de segurança que eu preciso conceder ao meu usuário?
Alguns detalhes adicionais:
Eu verifiquei se há alguma coisa que pode exigir permissões no ProcessMonitor, mas não encontrei nenhuma chave de registro nem arquivos com "ACCESS DENIED". Havia apenas uma chave de registro, que acrescentei, mas não faz diferença:
HKLM \ System \ CurrentControlSet \ Services \ WinSock2 \ Parâmetros.
Além disso, é possível adicionar uma nova ligação sem certificado, mas quando eu especificar o hash do certificado, ele falhará. É como se alguma política não me permitisse executar o código, provavelmente algo relacionado ao COM, uma vez que o Microsoft.Web.Administration é um wrapper sobre interfaces COM, mas não tenho certeza.