目录枚举缺少csrss.exe和lsass.exe(c#)

目录枚举缺少csrss.exe和lsass.exe(c#),c#,windows,enumeration,system32,C#,Windows,Enumeration,System32,我试图枚举C:\Windows\system32和C:\Windows\SysWow64中的文件。但是我缺少文件csrss.exe和lsass.exe,可能还有更多,我只检查了这两个文件。 这些文件在那里,我可以在total commander和explorer中看到它们。它们只是不在枚举结果中 List<string> result = new List<string>(Directory.EnumerateFiles("C:\\Windows\\system32",

我试图枚举
C:\Windows\system32
C:\Windows\SysWow64
中的文件。但是我缺少文件
csrss.exe
lsass.exe
,可能还有更多,我只检查了这两个文件。 这些文件在那里,我可以在total commander和explorer中看到它们。它们只是不在枚举结果中

List<string> result = new List<string>(Directory.EnumerateFiles("C:\\Windows\\system32", "*.exe", SearchOption.TopDirectoryOnly));
这是:

var dir = new DirectoryInfo("C:\\Windows\\system32");
var result = dir.EnumerateFiles("*.exe", SearchOption.TopDirectoryOnly);
变量“result”不是空的,但它不包含提到的文件

框架版本:v4.0.30319

Windows7:6.1.7601 x64

注意:我知道我可以使用变通方法:
dir/a-d/b C:\Windows\system32
,然后解析输出。但我想避免这种情况。

这是因为将您的请求重定向到SysWOW64,它不包含这两个可执行文件(操作系统只需要它们,操作系统将始终以64位模式运行它们)

在将项目构建为64位时,您应该看到结果中包含的这两个文件,前提是您的进程具有足够的权限

或者,您可以在
EnumerateFiles
调用之前执行p/invoke调用以禁用文件系统重定向-只需确保完成后重新启用即可

此函数的Pinvoke签名如下:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);

你的项目是32位的吗?如果是这样,您对system32文件夹的请求可能会重定向到syswow64,而syswow64可能没有这些文件。您可以构建64位或禁用WOW64文件夹重定向以查看真正的system32。
[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);