无法从System32删除文件 - requestedExecutionLevel解决方案无法正常工作

时间:2014-06-04 18:30:35

标签: .net windows file-io system32

我正在尝试编写一个控制台应用程序来从Windows \ System32中删除文件 使用.net File.Delete。该应用程序在Windows 7上运行,但由于它无法找到文件而失败。

我研究并发现它是框架的安全限制,但我也在这里找到类似问题的答案,如果我将清单文件添加到我的解决方案中,并编辑它以使其包含

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

然后每当我启动应用程序时,系统都会提示我输入我的用户名并传递“证明”我是管理员,然后应用程序将在System32中找到这些文件并按预期删除它们。

这不会发生。我没有被提示输入u \ p,程序失败了。我试过debug \ release \ 32-bit \ 64-bit。

有什么建议吗?

完整清单:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="EclCleaner.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

3 个答案:

答案 0 :(得分:1)

尴尬。在64位操作系统上运行并在X86中编译代码时,.net框架会将与Windows \ System32相关的每个请求重定向到WoW64文件夹。虽然在调试中路径的值是system32,但它实际上是在查看不同的文件夹。

答案 1 :(得分:0)

如果已禁用UAC,则使用requestedExecutionLevel是不够的。在这种情况下,您需要检测用户是否确实具有管理员权限。你可以用:

来做到这一点
if (!IsInRole(WindowsBuiltInRole.Administrator))

如果用户没有管理员权限,则需要自行提升。可以找到如何自我提升的示例here

答案 2 :(得分:0)

正如您所说in your own answer,Windows会自动并透明地将请求重定向到文件夹Windows\System32Windows\WoW64文件夹。这是为了保持使用硬编码字符串的程序加载system32文件夹中的64位dll,这会导致程序崩溃。

如果要从32位应用程序导航到64位系统文件夹,则需要使用隐藏文件夹Windows\sysnative,这指向64位system32文件夹。重要提示,该文件夹只能从32位程序中查看,如果您尝试从64位程序(例如Windows资源管理器)连接到该文件夹​​,则该文件夹将不存在。

class Program
{
    static void Main(string[] args)
    {
        //True in 32 bit, false in 64 bit.
        var tmp = Directory.Exists(@"C:\Windows\sysnative");
        Debugger.Break();
    }
}