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

問題はセキュリティに関連しています。たとえば、Windows XP では動作する可能性がありますが、Windows 7 では失敗する可能性があり、ファイルの操作が拒否されます。

この問題を解決するには、次のことを確認する必要があります。

  1. パッケージと展開プロジェクトは、.msi と .exe の 2 つのファイルを出力します。

    .MSI ファイル - インストーラー特権用に事前に定義された何らかの種類の下で実行することが許可されています。つまり、必要なフォルダーからファイルを削除するのに十分な特権がない可能性があります。ターゲット アプリケーション フォルダーからファイルを追加または削除することしかできません。 .

    .Exe ファイル - MSI ファイルとほとんど同じことを行いますが、実際には msi ファイルを実行するように設定されています。それでも..これはExeファイルであるため、フラグを設定して、管理者権限で実行する必要があり、目標を達成できるようにすることができます。(.exe には、.net パッケージや directX など、展開する必要がある他のものが含まれている場合があります)

  2. ユーザーに 2 つのファイルを提供するよう迫られており、ユーザーは何を実行すればよいかわからないという意味で、この状況は非常に不便です.WINRAR を使用して、両方のファイルを RAR 自己解凍型アーカイブにアーカイブすることをお勧めします。アーカイブされた .EXE ファイルを管理者権限で実行するように RAR アーカイブを設定し、RAR-sfx アーカイブ自体 (これも .exe) に「管理者権限が必要」というフラグを設定できます。

于 2012-05-14T08:54:14.280 に答える
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();

ただし、 foreach を追加する必要があります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);
    } 
于 2012-05-14T08:26:55.987 に答える