Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 无法从System32中删除文件-requestedExecutionLevel解决方案不起作用_.net_Windows_File Io_System32 - Fatal编程技术网

.net 无法从System32中删除文件-requestedExecutionLevel解决方案不起作用

.net 无法从System32中删除文件-requestedExecutionLevel解决方案不起作用,.net,windows,file-io,system32,.net,Windows,File Io,System32,我正在尝试编写一个控制台应用程序来删除Windows\System32中的文件 使用.net文件.Delete。该应用程序在Windows 7上运行,但由于据称找不到文件,因此失败 我研究并发现这是框架的一个安全限制,但我在这里对类似问题的回答中也发现,如果我向解决方案中添加清单文件,并对其进行编辑,使其包括 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 然后,每当我启动应用

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

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

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

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

这不会发生。没有提示我输入u\p,程序失败。我尝试了debug\release\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>

如果UAC已被禁用,则仅使用
请求执行级别
是不够的。在这种情况下,您需要检测用户是否实际拥有管理员权限。您可以通过以下方式实现:

if (!IsInRole(WindowsBuiltInRole.Administrator))

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

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

正如您所说,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();
    }
}

您的完整清单文件是什么样子的?已将其添加到问题中。刚刚尝试过。它实际上是在管理权限下运行的,并且从未调用提升代码,但是File.Delete在system32下根本看不到任何文件。@user181218您能查看该目录中的文件吗?