dies ist die ziemlich hackey Abhilfe, die ich am Ende mit:
1) ein limitierte Zugriffskonto für Ihren Dienst einrichten, wie zu laufen. Da ich einen CruiseControl.NET-Dienst betreibe, rufe ich meinen Benutzer 'ccnet' an. Er hat keine Administratorrechte.
2) Erstellen Sie ein neues lokales Benutzerkonto und weisen Sie es der Gruppe Administratoren zu (ich nenne ihn 'iis_helper' für dieses Beispiel). Gib ihm ein Passwort und setze es so, dass es niemals abläuft.
3) Ändern Sie die Zugriffsberechtigungen von iis_helper so, dass die lokale Anmeldung oder die Anmeldung am Remote-Desktop NICHT erlaubt wird und alles, was Sie sonst noch tun möchten, um dieses Konto zu sperren.
4) Melden Sie sich (entweder lokal oder über den Remote-Desktop) als Ihr Nicht-Admin-Benutzer an, in diesem Beispiel "ccnet".
5) Öffnen Sie ein Befehls-Terminal, und verwenden Sie den Befehl 'runas', um alles auszuführen, was ausgeführt werden muss. Verwenden Sie die Option/savecred. Geben Sie Ihren neuen administrativen Benutzer an.
runas /savecred /user:MYMACHINE\iis_helper "C:\Windows\System32\inetsrv\appcmd.exe"
Beim ersten Mal werden Sie zur Eingabe des Passworts 'iis_helper aufgefordert. Danach wird es dank der Option/savecred gespeichert (deshalb führen wir es einmal von einer echten Eingabeaufforderung aus, so dass wir das Passwort einmal eingeben können).
6) Vorausgesetzt, dass der Befehl OK ausgeführt wurde, können Sie sich jetzt abmelden. Ich habe mich dann als lokaler Administrator angemeldet und den Benutzer 'ccnet' für die lokale interaktive Anmeldung und den Remote-Desktop deaktiviert. Das Konto wird nur zum Ausführen eines Dienstes verwendet, aber keine echten Anmeldungen. Dies ist kein obligatorischer Schritt.
7) Richten Sie Ihren Dienst so ein, dass er als Ihr Benutzerkonto ('ccnet') ausgeführt wird.
8) Konfigurieren Sie den laufenden Dienst (CruiseControl.NET in meinem Fall) den 'runas' Befehl anstelle von 'appcmd.exe' direkt auszuführen, die gleichen wie zuvor:
ersetzen:
"C:\Windows\System32\inetsrv\appcmd.exe" start site "My Super Site"
mit:
runas /savecred /user:MYMACHINE\iis_helper "\"C:\Windows\System32\inetsrv\appcmd.exe\" start site \"My Super Site\""
Die Sache Zu bemerken ist, dass der Befehl in einer Menge von Anführungszeichen stehen sollte, wobei alle inneren Anführungszeichen maskiert sind (slash-quote).
9) Testen Sie, rufen Sie es einen Tag, schlagen Sie die lokale Kneipe.
bearbeiten: Ich habe anscheinend # 9 in der falschen Reihenfolge und hatte auch ein paar viele vor dem Test ...
Diese Methode funktioniert nicht vollständig auch. Es versucht , als das administrative Konto auszuführen, jedoch wird es weiterhin als ein nicht escalierter Prozess unter dem administrativen Benutzer ausgeführt, also noch keine Administrator-Berechtigungen. Ich habe den Fehler zunächst nicht abgefangen, weil der Befehl 'runas' ein separates cmd-Fenster erzeugt und sich dann sofort schließt, sodass ich die Ausgabe des Fehlers nicht sah.
Es scheint, als wäre die einzige echte Möglichkeit, einen Windows-Dienst zu schreiben, der als admin läuft, und sein einziger Zweck ist, appcmd.exe auszuführen und dann diesen Dienst irgendwie aufzurufen, um IIS zu starten/stoppen.
Ist es nicht großartig, wie UAC ist, um Dinge zu sichern, aber in Wirklichkeit nur mehr Server ungesichert, weil alles, was Sie tun möchten, müssen Sie als Admin tun, so ist es einfacher, einfach immer alles als Admin laufen und vergessen es?
ich das gleiche Problem mit CruiseControl.NET haben. Ich habe ein Projekt, das IIS stoppen/starten muss, aber nicht den gesamten CruiseControl-Dienst als erhöhtes Konto ausführen. – CodingWithSpike