我试图返回.config
中存在的%WINDIR%\System32\inetsrv\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
。
似乎它必须是权限,但我无法看到如何在代码运行时检查我是否拥有权限!
答案 0 :(得分: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
答案 1 :(得分:2)
由于我不是开发人员,而且我只涉及代码(主要是为自己编写管理工具),我想知道是否有人可以向我解释或指出正确的答案位置?
基本上,我从别人的项目中获得了一些代码,并将其复制到我自己的项目中。我很确定它之前有用,但不能100%肯定。那时我正在运行x86 Windows,但我现在使用的是x64。
旧代码仍然有用,所以我复制了设置并最终找到了解决方案。
在Project
的{{1}}到Build properties
(来自x86)中设置“平台目标”使其成功。将它设置为x64也有效,但我认为这是一些安全问题。
无论如何,问题解决了!感谢您的所有建议!
答案 2 :(得分: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()之前在正确的线程中运行。