【问题标题】:How to delete a directory path that is giving a access denied error [closed]如何删除导致访问被拒绝错误的目录路径[关闭]
【发布时间】:2017-06-02 21:09:23
【问题描述】:

关于我正在完成的工作的一些背景故事我是 Autodesk 的安装技术人员,我认为创建一个简单的程序来帮助自动清除通常在卸载软件后留下的文件夹的过程会很有趣。

我要删除的目录如下。

C:\ProgramData\FLEXnet
C:\Program Files\Autodesk\
C:\ProgramData\Autodesk\
C:\Program Files (x86)\Autodesk\
C:\Users\All Users\Autodesk\
C:\Users\**YOUR USERID**\AppData\Roaming\Autodesk\
C:\Users\**YOUR USERID**\AppData\Local\Autodesk\

这是我一直在玩弄的代码

private void btn_start_Click(object sender, EventArgs e)
    {


        //di.Attributes &= ~FileAttributes.ReadOnly;

        try
        {
            File.SetAttributes("C:/Program Files (x86)/Autodesk", FileAttributes.Normal);
            Directory.Delete("C:/Program Files (x86)/Autodesk", true);
        }
        catch (IOException ex)
        {

            MessageBox.Show(ex.Message);
        }

        try
        {
            File.SetAttributes("C:/ProgramData/Autodesk", FileAttributes.Normal);
            Directory.Delete("C:/ProgramData/Autodesk", true);
        }
        catch (IOException ex)
        {

            MessageBox.Show(ex.Message);
        }

对于以下行,它会出现此错误。

File.SetAttributes("C:/Program Files (x86)/Autodesk", FileAttributes.Normal);

System.UnauthorizedAccessException: '访问路径 'C:\Program Files (x86)\Autodesk' 被拒绝。'

如果我在哪里删除该行并单独使用 Directoyr.Delete,我会收到此错误。

System.UnauthorizedAccessException: 'Access to the path 'AcIPC_2_x86.dll' is denied.'

我花了几天时间试图弄清楚如何让软件能够删除目录,但我觉得我陷入了僵局。

【问题讨论】:

  • 您是否以管理员身份运行此程序。
  • 我是。但是,似乎即使我尝试发布该程序并尝试以管理员身份运行它,它仍然会给我一个拒绝访问错误。
  • 如果显示“访问被拒绝”,则访问被拒绝。就是这么简单。管理员权限通常可以让您获得广泛的访问权限,但这并不意味着您一定拥有全权委托。无论如何,您遇到的是计算机配置问题,而不是编程问题。 Stack Overflow 不适合您提出问题。

标签: c# visual-studio directory


【解决方案1】:

尝试通过代码以管理员身份运行应用程序,可能值得一试:

在您的项目文件夹中添加一个新项目并将其命名为“Application Manifest File”。然后继续将这行代码 <requestedExecutionLevel> 更改为:

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

这将提示用户允许管理员访问(所以本质上与右键单击它并单击以管理员身份运行)

【讨论】:

  • 这行得通!!!!我可以吻你!!!!
  • 我很高兴它有效:D
【解决方案2】:

我不知道这不是适合你的地方。您可以获得可以通过编程方式克服的 ACCESS_DENIED 的原因。请记住,除非您是管理员,否则您无法从各种目录中删除文件或文件夹,包括 Programs 和 Programs (x86)。正如fluffy所说,您可以明确地以管理员身份运行(如果您管理员),因为应用程序的自然状态是非提升运行。这是我如何克服这个问题的一个例子:

    public static class FileSystem
    {
        public static void RunAsAdministrator(this Process process, 
                                              string arguments = "")
        {
            if (process == null)
            {
                throw new ArgumentNullException(nameof(process));
            }

            ProcessStartInfo startInfo = new 
                             ProcessStartInfo(process.MainModule.FileName)
            {
                Verb = @"runas",
                Arguments = arguments
            };

        Process.Start(startInfo);


    public static void TakeOwnership(string path)
    {
        if (AppDomain.CurrentDomain.IsAdministrator())
        {
            using (new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
            {
                DirectoryInfo directoryInfo = new DirectoryInfo(path);
                DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();

                if (directorySecurity == null)
                {
                    return;
                }

                directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User);
                Directory.SetAccessControl(path, directorySecurity);
            }
        }
        else
        {
            Process.GetCurrentProcess().RunAsAdministrator();
        }
    }
}

public static bool IsAdministrator(this AppDomain threadDomain)
{
    threadDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

    WindowsPrincipal currentPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal;

    if (currentPrincipal.IsInRole(WindowsBuiltInRole.Administrator) || currentPrincipal.IsInRole((int) WellKnownSidType.AccountDomainAdminsSid))
    {
        return true;
    }

    using (WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent())
    {
        return windowsIdentity.Groups?.Any(windowsIdentityGroup => windowsIdentityGroup.Value.Equals(@"S-1-5-32-544")
                                                                    || windowsIdentityGroup.Value.EndsWith(@"500")
                                                                    || windowsIdentityGroup.Value.EndsWith(@"512")) == true;
    }
}

} 如果您已经以管理员身份运行,则可以立即获得该目录的所有权,否则,有代码包含以提升模式重新启动当前进程。

我警告您,这样做的风险由您自己承担。取得所有权是一件大事。另一种选择是采用较少的大锤方法并修改目录或文件上的 ACL。

无论如何,PrivilegeEnabler 代码都很有用。可以找到here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2017-08-05
    • 2014-05-21
    • 2020-10-29
    相关资源
    最近更新 更多