2008-10-24 169 views
8

我有一個ASP.NET應用程序。 基本上分娩過程是這樣的一個:Nant:更改文件權限

  • 南特構建應用程序並創建開發人員的計算機上的壓縮文件有沒有SVN文件夾和無用文件的應用程序文件。該文件與一個Nant腳本一起交付。
  • zip和nant文件被複制到客戶端的計算機
  • Nant腳本用壓縮文件中包含的文件替換當前網站文件。

我的問題是,在我嘗試打開網站時出現未經授權的訪問錯誤。 似乎這些文件需要爲用戶「IIS_WPG」設置權限。

我沒有權力更改IIS配置,因此我必須手動更改每個文件的權限。每次我替換文件時,權限都被刪除,我需要再次設置它們。

所以我有兩個問題:

  • 我可以改變南特文件的權限?怎麼做 ?
  • 可以避免這個問題嗎? (開發人員在他們的計算機上沒有此用戶)

回答

4

您需要在Windows中運行CACLS程序以授予對文件和文件夾的權限。從南特來說,你可以使用EXEC任務來做到這一點。

嘗試類似這樣的標記塊:

<exec program="cacls"> 
    <arg value="*" /> 
    <arg value="/G IIS_WPG:F" /> 
</exec> 
+0

只需注意您的建議是正確的解決方案,但參數......危險:)。看到我的答案。 – 2010-07-29 12:54:13

7

@Jeff弗裏茨 哎喲...... 你的建議是正確的解決方案,但該參數是...危險:)。

在開發的計算機上,我以管理員身份登錄,並且我嘗試了使用cmd的建議。

  • 它取代,以便設置只在命令中定義的設置的所有權限(這樣的命令後,訪問文件導致「拒絕訪問」即使我的管理員用戶)
  • 它應用在C:\ WINDOWS \目錄下,同時我從wwwroot文件夾中調用該命令。:)

所以,一些測試後,正確的命令是:

cacls [full folder path] /T /E /G IIS_WPG:F 
  • /T:適用於指定的文件夾和子文件夾
  • /E:編輯的ACL,而不是代替 it :)
+1

更新:CACLS現在已被棄用,應該使用ICACLS。至少在Windows Server 2008 R2上就是這種情況。 – JulianM 2012-03-29 09:24:15

3

我們最終寫了我們自己的任務f或者這與一些相當簡單的代碼:

[TaskName("addusertodir")] 
public class AddUserToDirectorySecurity : Task 
{ 
    [TaskAttribute("dir", Required=true)] 
    public string DirPath { get; set; } 

    [TaskAttribute("user", Required=true)] 
    public string UserName { get; set; } 

    protected override void ExecuteTask() 
    { 
     FileSystemAccessRule theRule1 = new FileSystemAccessRule(UserName, FileSystemRights.ListDirectory, AccessControlType.Allow); 
     FileSystemAccessRule theRule2 = new FileSystemAccessRule(UserName, FileSystemRights.ReadAndExecute, AccessControlType.Allow); 
     FileSystemAccessRule theRule3 = new FileSystemAccessRule(UserName, FileSystemRights.Read, AccessControlType.Allow); 

     DirectorySecurity theDirSecurity = new DirectorySecurity(); 
     theDirSecurity.AddAccessRule(theRule1); 
     theDirSecurity.AddAccessRule(theRule2); 
     theDirSecurity.AddAccessRule(theRule3); 
     Directory.SetAccessControl(DirPath, theDirSecurity); 
    } 
} 

然後,你可以寫加載自定義任務,並執行一個惡性腳本:

<loadtasks> 
    <fileset> 
     <include name="MyTask.dll"/> 
    </fileset> 
</loadtasks> 

<addusertodir dir="MyDir" user="IIS_WPG"/> 

顯然,這可以爲您的某些規則,或者你可以修改如果你願意的話,甚至可以在任務中對其進行參數設置。我們更喜歡使用exec任務,因爲它讓我們對正在應用的權限有更多的控制權。

2

CACLS現已被棄用。這是一個使用ICACLS的版本,替代品。

比方說,我們有以下幾點:

  • 我們安裝的根文件夾「C:\的Inetpub \ wwwroot文件」,它的存儲在NANT可變${paths.myprogram.inetpub}
  • 我們要修改的文件夾被稱爲「上傳」,它的存儲在${upload.foldername}
  • 我們要授予訪問是「IIS_UPLOAD_USER」的用戶,存儲在${iis.upload.user}
  • 我們要授予的權限級別爲「M」,爲「修改」的權限存儲在中

在這些假設下,我們的任務是這樣的:

<exec program="icacls"> 
    <arg value="${path::combine(paths.myprogram.inetpub, upload.foldername)}" /> 
    <arg value="/grant" /> 
    <arg value="${iis.upload.user}:${iis.user.permissionlevel}" /> 
</exec> 

希望這有助於!