Nant:更改文件权限

时间:2008-10-24 12:19:21

标签: nant file-permissions

我有一个ASP.NET应用程序。 基本上交付流程就是这个:

  • Nant构建应用程序并在开发人员的计算机上创建一个zip文件,其中包含没有SVN文件夹和无用文件的应用程序文件。此文件随Nant脚本一起提供。
  • 将zip和nant文件复制到客户端的计算机
  • Nant脚本将当前网站文件替换为zip文件中包含的文件。

我的问题是,当我尝试打开网站时,我有一个未经授权的访问错误。 似乎文件需要为用户“ IIS_WPG ”设置权限。

我没有权力更改IIS配置,因此我必须手动更改每个文件的权限。每次我替换文件时,权限都会被删除,我需要再次设置它们。

所以我有两个问题:

  • 我可以使用Nant更改文件权限吗?怎么做?
  • 可以避免这个问题吗? (开发人员在他们的计算机上没有这个用户)

4 个答案:

答案 0 :(得分:7)

@Jeff Fritz 哎哟... 你的建议是正确的解决方案,但参数是......危险的:)。

在开发计算机上,我以管理员身份登录,并尝试使用cmd建议。

  • 它取代了设置的所有权限,以便只设置命令中定义的权限(因此,在命令之后,即使使用我的管理员用户,访问文件也会导致“拒绝访问”)
  • 它应用于C:\ WINDOWS \目录,而我从wwwroot文件夹中调用了该命令。 :)

因此,经过一些测试,正确的命令是:

cacls [full folder path] /T /E /G IIS_WPG:F
  • / T:适用于指定的文件夹和子文件夹
  • / E:修改 ACL,而非替换:)

答案 1 :(得分:4)

您需要在Windows中运行CACLS程序以授予文件和文件夹的权限。从Nant,您可以使用EXEC任务执行此操作。

尝试标记块,如:

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

答案 2 :(得分:3)

我们最后用一些相当简单的代码编写了我们自己的任务:

[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任务,因为它让我们可以更好地控制正在应用的权限。

答案 3 :(得分:2)

CACLS现已弃用。这是使用ICACLS的版本,替代。

我们说我们有以下内容:

  • 我们安装的根文件夹是&#34; c:\ inetpub \ wwwroot&#34;,并且它存储在NANT变量${paths.myprogram.inetpub}
  • 我们要修改的文件夹名为&#34;上传&#34;,并且它存储在${upload.foldername}
  • 我们要授予访问权限的用户是&#34; IIS_UPLOAD_USER&#34;,存储在${iis.upload.user}
  • 我们要授予的权限级别为&#34; M&#34;,用于&#34;修改&#34;权限,存储在${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>

希望这有帮助!