我有一个配置工具,用于为网站配置 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()
我已添加对以下文件夹的完全控制权:
- “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 中是否有任何可能需要权限的内容,但我没有找到任何带有“拒绝访问”的注册表项或文件。只有一个注册表项,我添加了它,但它没有任何区别: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 个用户。一个是管理员,另一个是属于同一管理员组的用户帐户。但用户帐户仍然无法通过 IIS 上的代码托管任何网站。
- 转至 IIS
- 然后单击应用程序池
- 添加新的应用程序池并选择适当的设置,然后按确定。
- 单击新创建的池并选择高级属性
- 转到流程模型部分并单击 Identity 属性中的三个点
- 选择自定义帐户。
- 输入管理员(或管理员帐户的任何名称)
- 输入管理员密码(如果没有,请询问网络主管或任何有相同密码的人,因为这只是一次),然后按“确定”
现在您的网站/Web API 将作为管理员帐户运行。
希望它能有所帮助