Nant: изменить разрешение файла - PullRequest
8 голосов
/ 24 октября 2008

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

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

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

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

Итак, у меня два вопроса:

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

Ответы [ 4 ]

7 голосов
/ 24 октября 2008

@ Джефф Фриц Уч ... Ваше предложение - правильное решение, но параметры ... опасны:).

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

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

Итак, после некоторых тестов правильная команда:

cacls [full folder path] /T /E /G IIS_WPG:F
  • / T: применяется к указанной папке и подпапкам
  • / E: редактирует ACL вместо , заменяя it:)
4 голосов
/ 24 октября 2008

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

Попробуйте блок тегов, например:

<exec program="cacls">
    <arg value="*" />
    <arg value="/G IIS_WPG:F" />
</exec>
3 голосов
/ 24 октября 2008

В итоге мы написали собственное задание с довольно простым кодом:

[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 голосов
/ 22 октября 2012

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>

Надеюсь, это поможет!

...