[英]DirectoryInfo.GetFiles method not returning any files
我正在尝试返回%WINDIR%\\System32\\inetsrv\\config
中存在的.config
文件。
为此,我使用以下代码:
DirectoryInfo configFolder = new DirectoryInfo(Environment.ExpandEnvironmentVariables("%WINDIR%") + @"\System32\inetsrv\");
FileInfo[] configFiles = configFolder.GetFiles("*.config");
这会将零个对象返回到configFiles
。 如果我使用另一个文件夹(例如D:\\ DropBox),效果很好!
这段代码曾经工作过,有什么变化吗?
另外, FileInfo fi = new FileInfo(Path.Combine(configPath, "applicationHost.config"));
返回确定,但是fi.Length抛出FileNotFoundException
。
似乎它必须是权限,但是在代码运行时我看不到如何检查我是否具有权限!
您将需要以提升的特权来运行代码,因为您正试图访问系统文件夹。
如果使用Windows资源管理器->属性->安全性进行检查,您会发现该文件夹限制了对SYSTEM,Administrators和TrustedInstaller的访问(不知道最后一个文件夹来自何处,可能也仅位于我的计算机上。) )。
您可以在App.config文件中配置执行级别,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
您可以在此处找到文章: 如何强制C#应用程序仅以Windows中的管理员身份运行
由于我不是开发人员,并且只涉猎代码(主要是为自己编写管理工具),因此我想知道是否有人可以解释或将我指向正确的答案位置?
基本上,我从别人的项目中获得了一些有效的代码,并将其复制到我自己的项目中。 我敢肯定它以前能用,但不能100%确定。 当时我正在运行x86 Windows,但是现在使用x64。
旧代码仍然有效,因此我经历了复制设置并最终找到解决方案。
将Project
的Build properties
中的“ Platform Target”设置为Any CPU
(来自x86)可以正常工作。 将它设置为x64也可以,但是我认为这是一些安全性。
无论如何,问题解决了! 感谢您的所有建议!
这不是权限问题,但实际上与幕后发生的SysWow64方向有关。 C:\\ windows \\ system32被隐式重定向到C:\\ windows \\ syswow64。 这就是为什么更改构建体系结构可以解决此问题的原因。 任何构建体系结构都可以使用的替代方法是禁用重定向:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
IntPtr ptr = new IntPtr();
Wow64DisableWow64FsRedirection(ref ptr);
请注意,这是每个线程的设置,因此在使用GetFiles()之前必须在正确的线程中运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.