【问题标题】:Nant : change file permissionNant:更改文件权限
【发布时间】:2010-09-18 23:54:14
【问题描述】:

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

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

我的问题是,在此过程中,当我尝试打开网站时出现未经授权的访问错误。 似乎这些文件需要为用户“IIS_WPG”设置权限。

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

所以我有两个问题:

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

【问题讨论】:

    标签: nant file-permissions


    【解决方案1】:

    @杰夫弗里茨 哎哟... 您的建议是正确的解决方案,但参数...危险:)。

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

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

    所以,经过一些测试,正确的命令是:

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

    【讨论】:

    • 更新:现在不推荐使用 CACLS,应该使用 ICACLS。至少在 Windows Server 2008 R2 上就是这种情况。
    【解决方案2】:

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

    试试这样的标签块:

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

    【讨论】:

    • 请注意,您的建议是正确的解决方案,但参数...危险:)。看我的回答。
    【解决方案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 任务,因为它让我们可以更好地控制正在应用的权限。

    【讨论】:

      【解决方案4】:

      现在不推荐使用 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>
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-16
        • 2013-06-27
        • 2018-06-18
        • 1970-01-01
        • 2012-04-03
        • 2012-04-27
        • 2020-08-12
        • 2012-08-03
        相关资源
        最近更新 更多