c'est la solution de contournement assez hackey je me suis retrouvé à l'aide:
1) Mettre en place un compte d'accès limité à votre service pour fonctionner comme. Comme j'utilise un service CruiseControl.NET, j'appelle mon utilisateur 'ccnet'. Il n'a pas de droits d'administrateur.
2) Créez un nouveau compte utilisateur local et affectez-le au groupe Administrateurs (je l'appellerai 'iis_helper' pour cet exemple). Donnez-lui un mot de passe, et réglez-le pour qu'il n'expire jamais. 3) Modifier les autorisations d'accès de iis_helper pour NE PAS autoriser la connexion locale ou la connexion au bureau à distance, et tout ce que vous pourriez vouloir faire pour verrouiller ce compte.
4) Connectez-vous (localement ou par l'intermédiaire du bureau distant) en tant que votre utilisateur non administrateur, 'ccnet' dans cet exemple.
5) Ouvrez un terminal de commande et utilisez la commande 'runas' pour exécuter tout ce qui doit être exécuté. Utilisez l'option/savecred. Indiquez votre nouvel utilisateur administratif.
runas /savecred /user:MYMACHINE\iis_helper "C:\Windows\System32\inetsrv\appcmd.exe"
La première fois, il vous demandera le mot de passe de 'iis_helper'. Après cela, il sera stocké grâce à l'option/savecred (c'est pourquoi nous l'exécutons une fois à partir d'une vraie invite de commande, donc nous pouvons entrer le mot de passe une fois).
6) En supposant que la commande soit OK, vous pouvez maintenant vous déconnecter. Je me suis ensuite reconnecté en tant qu'administrateur local et j'ai désactivé l'utilisateur 'ccnet' pour la connexion interactive locale et le bureau distant. Le compte est uniquement utilisé pour exécuter un service, mais pas de véritables connexions. Ce n'est pas une étape obligatoire.
7) Configurez votre service pour qu'il fonctionne en tant que votre compte d'utilisateur ('ccnet').
8) Configurez le service en cours d'exécution (CruiseControl.NET dans mon cas) pour exécuter la commande 'runas' au lieu de 'appcmd.exe' directement, le même que précédemment:
remplacerons:
"C:\Windows\System32\inetsrv\appcmd.exe" start site "My Super Site"
avec:
runas /savecred /user:MYMACHINE\iis_helper "\"C:\Windows\System32\inetsrv\appcmd.exe\" start site \"My Super Site\""
La chose Il est à noter que la commande doit être dans un ensemble de guillemets, avec toutes les guillemets internes échappés (slash-quote). 9) Testez, appelez-le un jour, rendez-vous au pub local.
Modifier: Je apparemment fait # 9 dans le mauvais ordre et avait un peu trop avant le test ...
Cette méthode ne fonctionne pas non plus complètement. Il tente de s'exécuter en tant que compte administratif, mais il s'exécute toujours comme un processus non escaladé sous l'utilisateur administratif, donc toujours pas d'autorisations d'administration. Au début, je n'ai pas détecté l'échec car la commande 'runas' génère une fenêtre cmd séparée puis se ferme immédiatement, donc je ne voyais pas la sortie de l'échec. Son début semble être la seule possibilité réelle d'écrire un service Windows qui s'exécutera en tant qu'administrateur, et son seul but est d'exécuter appcmd.exe, puis d'appeler en quelque sorte ce service pour démarrer/arrêter IIS.
N'est-ce pas génial de savoir comment UAC est là pour sécuriser les choses, mais en réalité ne sécurise pas plus de serveurs, parce que tout ce que vous voulez faire, vous devez faire comme administrateur, il est donc plus facile il?
J'ai le même problème avec CruiseControl.NET. J'ai un projet dont j'ai besoin pour arrêter/démarrer IIS, mais PAS pour exécuter le service CruiseControl entier en tant que compte élevé. – CodingWithSpike