C# 在卸载时通知删除文件夹和文件.权限错误

本文关键字:文件 权限 错误 文件夹 删除 卸载 通知 | 更新日期: 2023-09-27 18:34:00

我收到以下错误。

我需要卸载该应用程序并删除由应用程序或用户在程序文件/myapp 中创建的所有文件和文件夹。

如何解决此问题?谢谢。

Access to the path 'C:'Program Files (x86)'DefaultProgram'Application'app.exe' is denied.

我的代码:

protected override void OnAfterUninstall(IDictionary savedState)
        {
            string sFolder = Path.GetDirectoryName(Context.Parameters["assemblypath"]);
            string sUsername = "NT AUTHORITY''LOCALSERVICE";
            DirectoryInfo myDirectoryInfo = new DirectoryInfo(sFolder);
            DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
            myDirectorySecurity.AddAccessRule(
                new FileSystemAccessRule(
                    sUsername, FileSystemRights.Read | 
                    FileSystemRights.Write | 
                    FileSystemRights.Modify, InheritanceFlags.ContainerInherit | 
                    InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
            myDirectoryInfo.SetAccessControl(myDirectorySecurity);
            base.OnAfterUninstall(savedState);
            string appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            DeleteDirectory(Path.Combine(appPath, "DB"));
            DeleteDirectory(appPath);
        }
        public static void DeleteDirectory(string target_dir)
        {
            string[] files = Directory.GetFiles(target_dir);
            string[] dirs = Directory.GetDirectories(target_dir);
            foreach (string file in files)
            {
                File.SetAttributes(file, FileAttributes.Normal);
                File.Delete(file);
            }
            foreach (string dir in dirs)
            {
                DeleteDirectory(dir);
            }
            Directory.Delete(target_dir, false);
        } 

C# 在卸载时通知删除文件夹和文件.权限错误

您的主要问题是 Windows Vista 和更高版本的 Windows 中的 UAC!

您的代码将在XP中正常运行,但在Vista或7或8中会产生复杂性。

在此处查看答案,以管理员身份运行应用程序!

您可以在XP上以这种方式删除您的应用程序.exe

Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + 
      Application.ExecutablePath); 
Application.Exit();

或者在Win7中这个(编辑2(

Process.Start("cmd.exe", "timeout 5 > Nul & Del " + 
      Application.ExecutablePath); 
Application.Exit();

但是你必须添加每个if(file.Contains("app.exe")) continue;

编辑

protected override void OnAfterUninstall(IDictionary savedState)
    {
        base.OnAfterUninstall(savedState);
        string sFolder = Path.GetDirectoryName(Context.Parameters["assemblypath"]);
        string sUsername = "NT AUTHORITY''LOCALSERVICE";
        DirectoryInfo myDirectoryInfo = new DirectoryInfo(sFolder);
        DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
        myDirectorySecurity.AddAccessRule(
            new FileSystemAccessRule(
                sUsername, FileSystemRights.Read | 
                FileSystemRights.Write | 
                FileSystemRights.Modify, InheritanceFlags.ContainerInherit | 
                InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
        myDirectoryInfo.SetAccessControl(myDirectorySecurity);
        string appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
       DeleteDirectory(Path.Combine(appPath, "DB"));
        DeleteDirectory(appPath);
    }
    public static void DeleteDirectory(string target_dir)
    {
        string[] files = Directory.GetFiles(target_dir);
        string[] dirs = Directory.GetDirectories(target_dir);
        foreach (string file in files)
        {
            File.SetAttributes(file, FileAttributes.Normal);
            if(file.Contains("app.exe")) continue;
            File.Delete(file);
        }
        foreach (string dir in dirs)
        {
            DeleteDirectory(dir);
        }
        Directory.Delete(target_dir, false);
    } 

您的问题与安全性有关,例如,在Windows XP中它可能会工作,而在Windows 7中它可能会失败,并且您将被拒绝操作文件。

为了克服这个问题,您需要确保以下几点:

  1. 包和部署项目输出两个文件:.msi & .exe。

    .MSI文件 - 允许在某种预定义下执行专门针对安装程序权限 - 这意味着它可能不会有足够的权限从您想要的任何文件夹中删除文件 - 它只能在目标应用程序文件夹中添加或删除文件。

    .Exe文件 - 几乎与MSI文件相同,它实际上被设置为执行msi文件。还。。因为它是Exe文件,你可以设置一个标志来指示它必须被执行在管理员权限下,这将使您能够实现目标。(.exe可能需要部署其他内容,即.net包或directX(

  2. 由于这种情况非常不方便,因为您被迫为用户提供两个文件,而他们不知道要执行什么。.我建议您使用 WINRAR 将这两个文件存档到 RAR 自身中正在提取存档。您可以将 RAR 存档设置为以管理员权限执行存档的.EXE文件.exe,并使用标志"需要管理员权限"。