Usando VS 15, C# con .Net 4.5.2
La computadora está en una red AD, con el nombre de anuncio "AD".
Este problema ocurre con los derechos de usuario normal de AD, los derechos de administrador de AD y los derechos de administrador local. No importa qué derechos obtenga el programa, ocurre el mismo problema.
Nuestro archivo de prueba es " C:/windows/system32/conhost.exe ".
El archivo anterior existe, es muy existente. Puedo verlo con el explorador.
Este es el archivo en el explorador:

Estas son las propiedades del archivo:

Puedes ver que está ahí, ¿verdad?
El siguiente comando cmd verifica si el archivo existe:
IF EXIST "C:\windows\system32\conhost.exe" (echo does exist) ELSE (echo doesnt exist)Devuelve " existe " como se prometió.
El siguiente código C# comprueba si el archivo existe:
FileInfo file = new FileInfo("C:/windows/system32/conhost.exe"); MessageBox.Show(file.Exists + "");Esto devuelve " Falso ".
Este código también devuelve " Falso ":
MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");Este código tampoco lo encuentra:
foreach (string file in Directory.GetFiles("C:/windows/system32/")) { //conhost is NEVER mentioned, like it doesn't exist }Este código tampoco lo encuentra:
foreach (string file in Directory.EnumerateFiles("C:/windows/system32/")) { //conhost is NEVER mentioned, like it doesn't exist }Falso, Falso, Falso:
MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + ""); MessageBox.Show(File.Exists("C:\\windows\\system32\\conhost.exe") + ""); MessageBox.Show(File.Exists(@"C:\windows\system32\conhost.exe") + ""); ¿Qué estoy haciendo mal?
Nota adicional: copié conhost a C:\conhost.exe, y mi programa puede encontrarlo sin problemas. Mi programa también encuentra otros archivos en system32, pero no conhost y algunos otros. Por ejemplo, encuentra "connect.dll" que está en system32, por lo que no es el permiso de lectura del directorio.
Más notas adicionales: conhost.exe y connect.dll tienen los mismos atributos de seguridad (pestaña Seguridad en las propiedades del archivo).
Si está utilizando un sistema x64, tendrá un contenido diferente del directorio c:\Windows\System32 para las aplicaciones x86 y x64. Asegúrese de estar utilizando la misma arquitectura que ejecuta el archivo por lotes y su aplicación C#.
En la documentación de MSDN para System.IO.File.Exists(path) , dice:
Si la persona que llama no tiene permisos suficientes para leer el archivo especificado, no se lanza ninguna excepción y el método devuelve falso independientemente de la existencia de la ruta.
Por esta razón, podemos asumir con seguridad que su aplicación no tiene acceso de lectura a ese archivo específico. Verifique la configuración de seguridad y otorgue acceso de lectura si aún no lo ha hecho.
Cree su aplicación (en modo de lanzamiento) y ejecútela como administrador.
Este es el problema que surge con el sistema operativo de 64 bits... aquí hay una solución,
vaya a las propiedades del proyecto> haga clic en la pestaña de compilación> desmarque Preferir 32 bits
después de eso, debería funcionar correctamente en sistemas operativos de 64 bits.