2012-05-14 78 views
0

我收到以下錯誤。C#winform刪除卸載文件夾和文件。權限錯誤

我需要卸載應用程序並刪除應用程序或用戶在程序文件/ 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); 
     } 
+2

運行時無法刪除exe。 –

+0

app.exe未運行... – kyusan93

+0

錯誤來自DeleteDirectory(appPath); – kyusan93

回答

1

你可以在XP

刪除您APP.EXE以這種方式在Win7
Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + 
     Application.ExecutablePath); 
Application.Exit(); 

或本(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); 
    } 
+0

您是否有其他方法?我嘗試不使用處理方法 – kyusan93

+1

@ kyusan93從哪個進程中,您稱爲刪除函數? – Likurg

+0

OnAfterUninstall – kyusan93

2

你的主要問題是UAC在Windows Vista和更高的Windows版本!

您的代碼將在XP運行正常,但在創建Vista或併發症7或8

查看答案Here運行應用程序作爲管理員!

+0

你有其他方法嗎?我嘗試不使用處理方法 – kyusan93

+0

「app.exe」是您正在開發的應用程序嗎? – Writwick

+0

如果「app.exe不是你的應用程序,我厚的UAC [用戶帳戶控制]阻止刪除!嘗試運行你的應用程序作爲管理員! – Writwick

1

您的問題與安全有關,例如在Windows XP中它可能工作,而在Windows 7中它可能會失敗,並且您將被拒絕操作文件。

爲了克服你需要做以下的確定問題:

  1. 包和部署項目輸出兩個文件:與.msi & .exe文件。

    .MSI文件 - 允許在某種執行預定義 專門用於安裝的權限 - 這意味着它可能不會 足夠的權限從任何你想要的文件夾中刪除文件 - 它 只能添加或從目標應用程序文件夾中刪除文件。

    .Exe文件 - 幾乎和MSI文件一樣,它實際上被設置爲執行msi 文件。然而..因爲它是Exe文件,你可以設置一個標誌來指示它必須在管理員權限下執行 ,這將允許你實現你的目標。 (.exe可能有其他你可能需要部署的東西,即.net包或directX)

  2. 因爲這種情況非常不方便,因爲你被推動爲用戶提供這兩個文件,他們會不知道要執行什麼。 我建議您使用WINRAR將這兩個文件歸檔到RAR自我 中提取歸檔文件。您可以設置RAR歸檔以管理員權限執行歸檔的.EXE文件,並設置RAR-sfx歸檔本身(也是如此。exe)與 標誌「需要管理員權限」。