0

我收到以下错误。

我需要卸载应用程序并删除应用程序或用户在程序文件/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);
        } 
4

3 回答 3

2

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

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

请参阅此处的答案以管理员身份运行您的应用程序!

于 2012-05-14T08:26:09.043 回答
1

你可以在XP上这样删除你的app.exe

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

或者在 Win7 中(EDIT2

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

但是你必须添加 foreachif(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);
    } 
于 2012-05-14T08:26:55.987 回答
1

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

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

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

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

    .exe 文件 - 几乎和 MSI 文件一样,它实际上被设置为执行 msi 文件。然而.. 因为它是 Exe 文件,你可以设置一个标志来指示它必须在管理员权限下执行,这将允许你实现你的目标。(.exe 可能还有其他您可能需要部署的东西,即 .net 包或 directX)

  2. 因为这种情况非常不方便,因为您被迫向用户提供这两个文件并且他们不知道要执行什么。我建议您使用 WINRAR 将这两个文件存档到 RAR 自解压存档中。您可以将 RAR 存档设置为以管理员权限执行存档的 .EXE 文件,并将 RAR-sfx 存档本身(也是 .exe)设置为“需要管理员权限”标志。

于 2012-05-14T08:54:14.280 回答