Pregunta

Tengo problemas al iniciar procesos en contexto suplantado en ASP.NET 2.0.

Estoy comenzando un nuevo Proceso 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();
}

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

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

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

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

Excepción no controlada: System.Security.SecurityException: acceso denegado. \ r \ n \ r \ n en System.Security.Principal.WindowsIdentity.GetCurrentInternal (TokenAccessLevels deseadoAccess, 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 administrador local y tiene acceso al ejecutable C: \ KB \ GetWindowUser.exe.

Cuando especifico explícitamente el usuario de la ventana en las propiedades ProcesStartInfo Dominio, Usuario y Contraseña, recibí el siguiente mensaje: http://img201.imageshack.us/img201/5870/pstartah8.jpg

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

¿Fue útil?

Solución

Debe colocar código privilegiado en el GAC (o ejecutarlo con plena confianza).

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

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

Debes asegurarte de que la API en tu DLL que colocaste en el GAC no tenga oportunidades de abuso. Por ejemplo, si estaba escribiendo un sitio web para permitir a los usuarios hacer una copia de seguridad del servidor a través de una aplicación de línea de comandos, su API debería exponer un método como & Quot; BackUp () & Quot; y no " LaunchAribitraryProcess (ruta de cadena) "

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

Aquí está la explicación completa .

Otros consejos

También puede intentar envolver su código dentro

using (Impersonator person = new Impersonator("domainName", "userName",
"password")
{
    // do something requiring special permissions
}

como se menciona en http://www.devnewsgroups.net/group/ microsoft.public.dotnet.framework.windowsforms / topic62740.aspx

¿Qué estás tratando de hacer exactamente? No puedo ver cuál es el punto de su código al crear un ejecutable diferente. Se ve bastante extraño. Quizás sería más útil indicar primero el problema comercial que está tratando de resolver.

Parece que está intentando que el servicio IIS se haga pasar por un usuario con más 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 lo haga, es por su propio bien.

En cambio, haga que IIS se haga pasar por un usuario con permisos limitados, que tiene exactamente los derechos que usted necesita. P.ej. cree una cuenta de usuario que posea solo 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 así podrá llamar al ejecutable benigno que tiene aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top