Ich habe ein Konfigurationstool, das das IIS-SSL-Zertifikat für eine Website konfiguriert. Es erstellt eine neue Bindung in der IIS-Konfiguration für „Standardwebsite“ und weist ihr dann ein SSL-Zertifikat zu. Das Tool funktioniert einwandfrei, wenn ich es im Namen eines Administratorkontos ausführe, schlägt jedoch fehl, wenn ich es unter einem normalen Benutzerkonto ausführe, und es wird die Fehlermeldung „Zugriff verweigert“ angezeigt.
Hier ist der Code des Tools:
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();
}
}
}
Dies ist der Fehler, den ich erhalte, wenn ich es als Benutzer ausführe:
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()
Ich habe die vollständige Kontrolle über die folgenden Ordner hinzugefügt:
- „C:\Windows\System32\inetsrv\config“
- „C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys“
- "C:\inetpub\wwwroot"
Ich habe auch den folgenden Link probiert, aber das hat nicht geholfen:https://support.comodo.com/index.php?/Knowledgebase/Article/View/1129/37/access-denied-exception-from-hresult-0x80070005-e_accessdenied
Gibt es andere Sicherheitseinstellungen oder Richtlinien, die ich meinem Benutzer gewähren muss?
Einige zusätzliche Details: Ich habe geprüft, ob es irgendetwas in ProcessMonitor gibt, das Berechtigungen erfordert, aber ich habe weder Registrierungsschlüssel noch Dateien mit „ZUGRIFF VERWEIGERT“ gefunden. Es gab nur einen Registrierungsschlüssel, den ich hinzugefügt habe, aber das macht keinen Unterschied: HKLM\System\CurrentControlSet\Services\WinSock2\Parameters.
Es ist auch möglich, eine neue Bindung ohne Zertifikat hinzuzufügen, aber wenn ich einen Zertifikat-Hash angebe, schlägt dies fehl. Es ist, als ob mir eine Richtlinie nicht erlaubt, den Code auszuführen, wahrscheinlich etwas im Zusammenhang mit COM, da Microsoft.Web.Administration ein Wrapper über COM-Schnittstellen ist, aber ich bin nicht sicher.
Antwort1
Ich habe versucht, denselben Vorgang mit netsh auszuführen:
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).
Es scheint, dass es dafür keine Problemumgehung gibt und ich muss ein Administratorkonto verwenden. Außerdem habe ich eine ähnlicheAntwortfür die gleiche Frage im IIS-Forum.
Antwort2
Bei mir waren die Anforderungen gleich und nach langem Suchen war klar, dass auf jeden Fall Administratorrechte erforderlich sind.
Ich habe dieses Problem gelöst, indem ich einen neuen Anwendungspool mit einem benutzerdefinierten Konto als Identität erstellt habe.
Im Grunde hatte mein Server 2 Benutzer. Einen Administrator und ein anderes Benutzerkonto mit derselben Administratorgruppe. Aber das Benutzerkonto konnte trotzdem keine Site über Code auf IIS hosten.
- Wechseln Sie zu IIS
- Klicken Sie dann auf Anwendungspool
- Fügen Sie einen neuen Anwendungspool hinzu, wählen Sie die entsprechenden Einstellungen und drücken Sie „OK“.
- Klicken Sie auf den neu erstellten Pool und wählen Sie „Erweiterte Eigenschaften“
- Gehen Sie zum Abschnitt Prozessmodell und klicken Sie auf die drei Punkte in der Eigenschaft Identität
- Wählen Sie Benutzerdefiniertes Konto.
- Geben Sie Administrator ein (oder den Namen des Administratorkontos).
- Geben Sie das Administratorkennwort ein (wenn Sie es nicht haben, fragen Sie den Netzwerkleiter oder jemanden, der dasselbe hat, da dies nur einmal vorkommt) und drücken Sie OK.
Jetzt wird Ihre Site/Web-API als Administratorkonto ausgeführt.
Hoffe, es hilft irgendwie