0

我正在尝试返回.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 throws FileNotFoundException

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

4

3 回答 3

2

您将需要以提升的权限运行代码,因为您正在尝试访问系统文件夹。

如果您使用 Windows Explorer -> Properties -> Security 检查它,您会发现该文件夹限制了对 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 中以管理员身份运行

于 2012-02-28T16:25:13.127 回答
2

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

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

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

Project在's Build propertiesto (from x86)中设置“平台目标”Any CPU使其工作。将其设置为 x64 也可以,但我认为这是一些安全问题。

总之,问题解决了!感谢您的所有建议!

于 2012-02-29T09:23:46.397 回答
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() 之前必须在正确的线程中运行。

于 2014-05-27T19:49:22.067 回答