esta es la solución bastante hackey Terminé usando:
1) Configurar una cuenta de acceso limitado por su servicio a ejecutar como. Como estoy ejecutando un servicio CruiseControl.NET, llamaré a mi usuario 'ccnet'. Él NO tiene derechos de administrador.
2) Cree una nueva cuenta de usuario local y asigne al grupo Administradores (lo llamaré 'iis_helper' para este ejemplo). Dale una contraseña y configúrala para que nunca caduque.
3) Cambie los permisos de acceso de iis_helper para NO permitir el inicio de sesión local o el inicio de sesión de escritorio remoto, y cualquier otra cosa que desee hacer para bloquear esta cuenta.
4) Inicie sesión (ya sea de forma local o mediante escritorio remoto) como su usuario no administrador, 'ccnet' en este ejemplo.
5) Abra un terminal de comando, y use el comando 'runas' para ejecutar lo que sea que necesite ejecutarse escalado. Use la opción/savecred. Especifique su nuevo usuario administrativo.
runas /savecred /user:MYMACHINE\iis_helper "C:\Windows\System32\inetsrv\appcmd.exe"
La primera vez que se le pedirá 'contraseña de iis_helper. Después de eso, se almacenará gracias a la opción/savecred (esta es la razón por la que lo estamos ejecutando una vez desde un símbolo del sistema real, por lo que podemos ingresar la contraseña una vez).
6) Suponiendo que el comando se haya ejecutado bien, ahora puede cerrar la sesión. Luego, inicié sesión como administrador local y apagué el usuario 'ccnet' para el inicio de sesión interactivo local y el escritorio remoto. La cuenta solo se usa para ejecutar un servicio, pero no hay inicios de sesión reales. Este no es un paso obligatorio.
7) Configure su servicio para que se ejecute como su cuenta de usuario ('ccnet').
8) Configure el servicio que se esté ejecutando (CruiseControl.NET en mi caso) para ejecutar el comando 'runas' en lugar de 'appcmd.exe' directamente, el mismo que antes:
reemplazar:
"C:\Windows\System32\inetsrv\appcmd.exe" start site "My Super Site"
con:
runas /savecred /user:MYMACHINE\iis_helper "\"C:\Windows\System32\inetsrv\appcmd.exe\" start site \"My Super Site\""
Lo observar que el comando debe estar en un conjunto de comillas, con todas las comillas internas escapadas (comillas).
9) Pruebe, llámelo un día, vaya al pub local.
Editar: Me hizo parecer # 9 en el orden equivocado y tenía algunos demasiados antes de la prueba ...
Este método también no funciona por completo. Es intenta intentar ejecutarse como la cuenta administrativa, sin embargo, todavía se ejecuta como un proceso no escalado bajo el usuario administrativo, por lo que todavía no hay permisos de administrador. Inicialmente no capté el error porque el comando 'runas' genera una ventana de cmd separada y luego se cierra de inmediato, por lo que no estaba viendo la salida de falla.
Está empezando a parecer que la única posibilidad real podría ser escribir un servicio de Windows que se ejecutará como administrador, y su único propósito es ejecutar appcmd.exe, y de alguna manera llamar a ese servicio para iniciar/detener IIS.
No es genial cómo UAC está allí para asegurar cosas, pero en realidad solo deshace más servidores, porque todo lo que quieras hacer es administrar, así que es más fácil simplemente ejecutar todo como administrador y olvidar ¿eso?
que tienen el mismo problema con CruiseControl.NET. Tengo un proyecto que tengo que tener parada/arranque de IIS, pero no ejecutar todo el servicio climatizador como una cuenta elevada. – CodingWithSpike