2008-10-24 8 views
8

У меня есть приложение ASP.NET. В основном процесс доставки это один:Nant: изменить разрешение файла

  • Nant строит приложение и создает почтовый файл на компьютере разработчика с файлами приложения без SVN папок и ненужных файлов. Этот файл поставляется с Nant-скриптом.
  • Файлы zip и nant копируются на компьютер клиента
  • Nant-скрипт заменяет текущие файлы сайта файлом, содержащимся в zip-файле.

Моя проблема заключается в том, что с этим процессом у меня возникает ошибка несанкционированного доступа при попытке открыть веб-сайт. Кажется, что файлы должны иметь набор разрешений для пользователя «IIS_WPG».

У меня нет возможности изменять конфигурацию IIS, поэтому мне нужно вручную изменить разрешения для каждого файла. И каждый раз, когда я заменяю файлы, разрешения удаляются, и мне нужно их снова установить.

Поэтому у меня есть два вопроса:

  • Могу ли я изменить файлы разрешений с Nant? Как это сделать ?
  • Можно ли избежать этой проблемы? (разработчики не имеют этого пользователя на своих компьютерах)

ответ

4

Вам необходимо запустить программу CACLS в Windows, чтобы предоставить разрешения на файлы и папки. От Нанта вы можете сделать это с помощью задачи EXEC.

Попробуйте тег блока, как:

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

Просто обратите внимание, что ваше предложение - правильное решение, но параметры ... опасны :). См. Мой ответ. – 2010-07-29 12:54:13

7

@Jeff Fritz Ой ... Ваше предложение является правильным решением, но параметры ... опасно :).

На компьютерах разработчиков Я зарегистрирован как администратор, и я попробовал ваше предложение с помощью cmd.

  • Он заменяет все разрешения, установленные для того, чтобы установить только те, которые определены в команде (так, после команды, обращающиеся файлы привели к «Доступ запрещен» даже с моим админ пользователя)
  • Он применяется в каталоге C: \ WINDOWS \, когда я вызвал команду из папки wwwroot.:)

Таким образом, после некоторых тестов, правая команда:

cacls [full folder path] /T /E /G IIS_WPG:F 
  • /T: применяется в указанной папке и подпапках
  • /E: редактирует список управления доступом вместо Замена it :)
+1

UPDATE: 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); 
    } 
} 

Тогда вы можете написать NANT скрипт, который загружает пользовательскую задачу и выполняет:

<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» для «изменений» разрешение , хранящийся в ${iis.user.permissionlevel}

В этих предположениях, наша задача заключается в следующем:

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

Надеется, что это помогает!

 Смежные вопросы

  • Нет связанных вопросов^_^