如何删除提供访问被拒绝错误的目录路径

时间:2017-06-02 21:09:23

标签: c# visual-studio directory

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

我尝试删除的目录如下:

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.'

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

2 个答案:

答案 0 :(得分:1)

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

将新项添加到项目文件夹并调用它&#34; 应用程序清单文件&#34;。然后开始将这行代码<requestedExecutionLevel>更改为:

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

这将提示用户允许管理员访问(因此与右键单击它并单击以管理员身份运行基本相同)

答案 1 :(得分:0)

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

    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