2012-02-28 58 views
0

我试图返回%WINDIR%\System32\inetsrv\config中存在的.config文件。DirectoryInfo.GetFiles方法不返回任何文件

对于这个我使用下面的代码:

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

似乎它必须是权限,但我看不到如何检查代码运行时是否有权限!

+3

权限也许?正在使用的安全上下文可能没有对该位置的读取访问权限并且看到0个文件。 – SpaceBison 2012-02-28 16:11:03

+1

你在64位环境中运行这个吗?如果是这样,如果将System32更改为SysWOW64会发生什么情况? – 2012-02-28 16:13:06

+0

@AndreLock没有什么区别...我在x64上虽然 – neildeadman 2012-02-28 16:19:12

回答

2

由于我不是一个开发商,我只涉足代码(主要是为我自己编写管理工具),我想知道是否有人可以解释或指出我的正确答案?

基本上,我从别人的项目中得到了一些代码,并将其复制到我自己的项目中。我很确定它以前有效,但不能100%确定。那时我正在运行x86 Windows,但我现在在x64上。

旧的代码仍然有效,所以我通过复制设置并最终找到解决方案。

ProjectBuild propertiesAny CPU(来自x86)中设置“平台目标”使其工作。将其设置为x64也行得通,但我认为这是一些安全的事情。

无论如何,问题解决了!感谢您的所有建议!

+0

为我工作。谢谢! – 2012-06-21 11:31:13

2

您将需要运行带有提升权限的代码,因为您正试图访问asystem文件夹。

如果您使用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> 

您可以在这里找到的一篇文章:How To Force C# Application To Only Run As Administrator In Windows

+0

我将上面的代码添加到我的app.config文件中,并且链接到的文章用清单文件说明。都没有工作。我将文件夹更改为'C:\ Windows \ System32 \'并且它可以工作...:S – neildeadman 2012-02-28 16:33:01

0

这不是一个权限问题,但实际上与幕后发生的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之前运行。

+0

这听起来很有趣......我问这个问题有一段时间,但我会尝试挖掘我的旧代码,看看这是否确实解决了问题,无论架构如何......谢谢! – neildeadman 2014-05-27 21:36:29

相关问题