2009-10-14 8 views
5

Estoy intentando crear una página Asp.Net simple para leer los contadores de Perfmon desde una máquina remota.Acceso denegado lectura de contadores Perfmon desde una máquina remota (Asp.Net)

Cuando ejecuto la página usando el servidor web de desarrollo Visual Studio todo está bien, sin embargo cuando intento ejecutar la misma página cuando está alojado en IIS obtengo un error de acceso denegado en la instancia del contador Perfmon:

PerformanceCounter freeSpaceCounter = new PerformanceCounter("LogicalDisk", "Free Megabytes", "D:", "RemoteMachine12"); 

Esta es la excepción consigo:

Exception Details: System.ComponentModel.Win32Exception: Access is denied 

he intentado usar tanto el acceso anónimo (conmigo mismo como el usuario anónimo), y la autenticación integrada de Windows - tanto no funcionan. Claramente, se usa alguna otra cuenta para leer los contadores de PerfMon (como la cuenta de ASPNET). ¿Cómo hago para que mi página acceda a los contadores PerfMon usando mi cuenta en lugar de esa cuenta?

Respuesta

6

El problema que tiene aquí es que IIS se ejecuta en el contexto de una cuenta local (de forma predeterminada). Esta cuenta local no existe en la máquina remota, por lo que no se puede conectar para obtener los contadores de rendimiento. Cuando utiliza el servidor web de desarrollo de VS se ejecuta en su propia cuenta local y todo funciona.

Si se encuentra en un entorno de dominio, puede configurar el grupo de aplicaciones IIS para que se ejecute como una cuenta de dominio con acceso a ambas máquinas, y todo funcionará, pero es posible que desee tener más control sobre esto.

Puede utilizar la autenticación básica, con la aplicación configurada para la suplantación (o si está utilizando IIS7 que tiene el grupo configurado para ejecutarse bajo la cuenta autenticada) o se hace pasar justo antes de leer el contador.

Hay un par de maneras de hacerse pasar - la más segura es configurar IIS para utilizar autenticación integrada y luego envolver la llamada hasta

PerformanceCounter freeSpaceCounter = null; 
using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate()) 
{ 
    freeSpaceCounter = new PerformanceCounter("LogicalDisk", 
           "Free Megabytes", "D:", "RemoteMachine12"); 
} 

Si no desea que la autenticación, entonces tendrá que configurar el grupo de aplicaciones, o código duro, un nombre de usuario y contraseña en su aplicación: este debería ser el último recurso, consulte KB306158

+0

Gracias - esa es exactamente la respuesta que estaba buscando, ¡funcionó bien! – Justin

2

De MSDN:

Para leer los contadores de rendimiento en Windows Vista, Windows XP Professional x64 Edition o Windows Server 2003, debe ser un miembro del grupo Usuarios del monitor de rendimiento o tener privilegios administrativos.

Cuestiones relacionadas