Nant: 更改文件权限

8
我有一个ASP.NET应用程序。 基本交付流程如下:
  • Nant在开发人员的计算机上构建应用程序,并使用Nant脚本创建一个zip文件,其中包含应用程序文件而不包含SVN文件夹和无用文件。
  • 将zip和nant文件复制到客户端计算机
  • Nant脚本使用zip文件中包含的文件替换当前网站文件。
我的问题是,在此过程中,当我尝试打开网站时出现未经授权的访问错误。 似乎需要为用户“IIS_WPG”设置文件权限。
我没有更改IIS配置的权限,因此必须手动更改每个文件的权限。每次替换文件时,权限都会被删除,我需要重新设置它们。
所以我有两个问题:
  • 我可以使用Nant更改文件权限吗?如何操作?
  • 是否有可能避免这个问题?(开发人员的计算机上没有此用户)
4个回答

7

@Jeff Fritz 哎呀…… 你的建议是正确的解决方案,但参数有点危险 :)

在开发计算机上,我作为管理员登录并尝试使用cmd运行您的建议。

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

所以,在一些测试后,正确的命令是:

cacls [full folder path] /T /E /G IIS_WPG:F
  • /T:应用于指定文件夹及其子文件夹
  • /E:编辑ACL而不是替换它 :)

1
更新:CACLS现已被弃用,应改用ICACLS。至少在Windows Server 2008 R2上是这样的情况。 - JulianM

4
你需要在Windows中运行CACLS程序来授予文件和文件夹权限。从Nant中,你可以使用EXEC任务完成这个操作。
尝试使用如下标签块:
<exec program="cacls">
    <arg value="*" />
    <arg value="/G IIS_WPG:F" />
</exec>

请注意,您的建议是正确的解决方案,但参数有些危险 :). 请查看我的答案。 - Julien N

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任务,因为它使我们对应用的权限有了更多的控制。

2

CACLS现已弃用。以下是使用替代方案ICACLS的版本。

假设我们有以下内容:

  • 我们安装的根文件夹为"c:\inetpub\wwwroot",存储在NANT变量${paths.myprogram.inetpub}
  • 我们想要修改的文件夹名为"uploads",存储在${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>

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接