2008-12-08 14 views
7

Tengo un problema con los procesos de inicio en contexto suplantado en ASP.NET 2.0.Inicio y suplantación de proceso

Estoy comenzando un proceso nuevo en mi código de servicio web. IIS 5.1, .NET 2,0

[WebMethod] 
public string HelloWorld() 
{ 
    string path = @"C:\KB\GetWindowUser.exe"; 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.WorkingDirectory = Path.GetDirectoryName(path); 
    startInfo.FileName = path; 
    startInfo.UseShellExecute = false; 
    startInfo.CreateNoWindow = true; 
    startInfo.ErrorDialog = false; 
    startInfo.RedirectStandardOutput = true; 
    startInfo.RedirectStandardError = true; 
    Process docCreateProcess = Process.Start(startInfo); 

    string errors = docCreateProcess.StandardError.ReadToEnd(); 
    string output = docCreateProcess.StandardOutput.ReadToEnd(); 
} 

La "C: \ KB \ GetWindowUser.exe" es una aplicación de consola que contiene el código siguiente:

static void Main(string[] args) 
{ 
    Console.WriteLine("Windows: " + WindowsIdentity.GetCurrent().Name); 
} 

Cuando invoco servicio web sin suplantación, todo funciona bien.

Cuando enciendo la suplantación, el error siguiente se escribe en "errores" variable en el código de servicio web:

Excepción no controlada: System.Security.SecurityException:. Acceso denegado \ r \ n \ r \ n en System.Security.Principal.WindowsIdentity.GetCurrentInternal (TokenAccessLevels desiredAccess, Boolean threadOnly) \ r \ n en System.Security.Principal.WindowsIdentity.GetCurrent() \ r \ n en ObfuscatedMdc.Program.Main (String [] args) \ r \ nLa zona del ensamblado que falló fue: \ r \ nMyComputer

El usuario suplantado es el administrador local y tiene acceso al ejecutable C: \ KB \ GetWindowUser.exe.

cuando especifico de usuario de manera explícita en la ventana propiedades ProcesStartInfo de dominio, usuario y contraseña, me siguiente mensaje: http://img201.imageshack.us/img201/5870/pstartah8.jpg

¿Es posible iniciar el proceso con unas credenciales distintas ASPNET de asp.net (IIS 5.1)?

+1

cualquier solución final con plena muestra de código fuente de trabajo al respecto? – Kiquenet

Respuesta

3

Tienes que poner código privilegiado en el GAC (o ejecutar en plena confianza).

El código en el GAC debe afirmar la XXXPermission, donde XXX es el permiso que solicite, ya sea suplantación, acceso al disco duro o lo que sea.

Debería revertir la afirmación inmediatamente después de las palabras.

Debe asegurarse de que la API en su archivo DLL que coloca en el GAC no tiene oportunidades de abuso. Por ejemplo, si escribía un sitio web para permitir a los usuarios hacer una copia de seguridad del servidor mediante una aplicación de línea de comandos, su API debería exponer un método como "BackUp()" y no "LaunchAribitraryProcess (ruta de cadena)"

La web.El archivo de configuración también debe tener configurada la suplantación, o se encontrará con problemas de permisos NTFS y con CAS.

Aquí está el complete explanation.

0

¿Qué estás tratando de hacer exactamente? No puedo ver cuál es el sentido de tu código al crear un ejecutable diferente. Parece bastante extraño. Tal vez sería más útil establecer el problema de negocio que está tratando de resolver primero.

0

Parece que intenta que el servicio IIS suplante a un usuario con mayores privilegios que el servicio en sí (en este caso, un administrador). Windows bloquea esto como un agujero de seguridad, ya que en ese momento básicamente le estás rogando a alguien que se haga cargo de tu sistema. Puede haber una forma de evitar esta limitación, pero no hagas eso, es por tu propio bien.

En su lugar, haga que IIS suplante a un usuario con permisos limitados, que tiene exactamente los derechos que necesita. P.ej. cree una cuenta de usuario que solo posea las carpetas en las que desea que escriba su servicio web, o cualquier otra combinación de derechos que sea apropiada. Si se hace pasar por un usuario limitado, no verá este código de error, pero aún podrá llamar al ejecutable benigno que tiene aquí.

Cuestiones relacionadas