首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除提供访问拒绝错误的目录路径

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

Stack Overflow用户
提问于 2017-06-02 21:09:23
回答 2查看 473关注 0票数 0

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

我试图删除的目录如下。

代码语言:javascript
运行
复制
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\

这是我一直在玩的代码

代码语言:javascript
运行
复制
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);
        }

对于下一行,它将得到此错误。

代码语言:javascript
运行
复制
File.SetAttributes("C:/Program Files (x86)/Autodesk", FileAttributes.Normal);

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

如果我在哪里删除这一行并自己使用Directoyr.Delete,我就会得到这个错误。

代码语言:javascript
运行
复制
System.UnauthorizedAccessException: 'Access to the path 'AcIPC_2_x86.dll' is denied.'

我花了几天的时间试图找出如何允许软件删除目录的能力,但我觉得自己陷入了僵局。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-02 22:52:38

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

向项目文件夹中添加一个新项,并将其命名为“应用程序报表文件”。然后procceed将这行代码<requestedExecutionLevel>更改为:

代码语言:javascript
运行
复制
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

这将提示用户允许管理员访问(因此本质上与右键单击它并单击run作为管理员相同)。

票数 1
EN

Stack Overflow用户

发布于 2017-06-03 00:05:12

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

代码语言:javascript
运行
复制
    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代码都是有用的。可以找到这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44337472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档