C #: compruebe si el administrador tiene acceso de escritura a un archivo

El problema: Necesito verificar si un usuario (usuario local o usuario de dominio, cualquiera es posible) tiene acceso de escritura a un archivo (si tiene curiosidad, %windir%\system32\inetsrv\config\applicationHost.config. Este archivo está protegido por Windows y debe ser administrador para escribir en él).

Mi solución: La construcción general es:

using (Impersonator impersonator = new Impersonator(domain, username, password))
{
 try
 {
  using (FileStream fs = File.OpenWrite(appHostConfigPath))
    {
     return true;
    }
  catch
  {
     return false;
  }
 }

Como puede imaginar, la clase Impersonator es un IDisposible que usa interoperabilidad nativa para llamar a LogonUser. Nada demasiado creativo y funciona.

Donde estoy atrapado: En sistemas operativos Windows con UAC habilitado, esta función siempre regresa false incluso si el usuario especificado por nombre de usuario es un administrador. Aunque mi programa se está ejecutando como administrador elevado, sospecho que lo que está sucediendo es que el código suplantado se está ejecutando como administrador limitado. Por lo tanto, el método devuelve falso.

No tengo ninguna solución creativa para esto. ¿Alguien puede ayudar?

preguntado el 09 de enero de 11 a las 07:01

Si su código está todo en un proceso, si está elevado, entonces UAC no es el problema. ¿Ha intentado apagar UAC en la misma computadora para ver si cambia? (Es posible que deba reiniciar, recuerde).

@Lambert: Dijo que está usando el LogonUser API, que devuelve un token restringido. Si el proceso actual es elevado no va a cambiar el comportamiento de LogonUser. -

Eh ... ¿pero intentaste apagar el UAC por completo en esa computadora? Es extraño por qué tenerlo encendido cambiaría el comportamiento, si el programa está elevado ... -

@Lambert: Ben tiene razón, LogonUser le da un token restringido, por lo que creo que no puedo verificar si el usuario tiene acceso de escritura al archivo (porque los tokens no coinciden) -

@Bilal: ¿Incluso si UAC está desactivado? -

2 Respuestas

¿Podrías mirar la excepción? ¿Es con los permisos o "Excepción de archivo no encontrado"? Porque en Windows 7 está en

% windir% \ System32 \ inetsrv \ config \ applicationHost.config

también puede ser lo mismo con Windows Vista.

Respondido el 09 de enero de 11 a las 10:01

Gracias Vijay, acabo de tener la ruta escrita incorrectamente en stackoverflow. Lo tengo bien en mi programa. La excepción es el acceso no autorizado. - Bilal y Olga

¿Qué tal GetFileSecurity y GetEffectiveRightsFromAcl?

El segundo enlace tiene un ejemplo que en realidad es bastante completo (en C ++).

Respondido el 09 de enero de 11 a las 10:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.