【问题标题】:Failing to delete a file from System32 - requestedExecutionLevel solution not working无法从 System32 中删除文件 - requestedExecutionLevel 解决方案不起作用
【发布时间】:2014-06-04 18:30:35
【问题描述】:

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

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

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

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

这不会发生。没有提示我输入 u\p 并且程序失败。我试过调试\发布\32位\64位。

有什么建议吗?

完整清单:

<?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>

【问题讨论】:

  • 您的完整清单文件是什么样的?
  • 已将其添加到问题中。

标签: .net windows file-io system32


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    正如您所说的in your own answer,Windows 会自动透明地将请求重定向到文件夹Windows\System32 成为Windows\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();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      if (!IsInRole(WindowsBuiltInRole.Administrator))
      

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

      【讨论】:

      • 刚刚试过了。它实际上确实在管理权限下运行,并且从未调用提升代码,但 File.Delete 根本看不到 system32 下的任何文件。
      • @user181218 你能查看那个目录下的文件吗?
      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 2012-04-06
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多