8

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

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

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

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

所以我有两个问题:

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

4 回答 4

7

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

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

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

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

cacls [full folder path] /T /E /G IIS_WPG:F
  • /T : 适用于指定文件夹和子文件夹
  • /E :编辑ACL 而不是替换它 :)
于 2008-10-24T13:06:59.390 回答
4

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

尝试一个标签块,如:

<exec program="cacls">
    <arg value="*" />
    <arg value="/G IIS_WPG:F" />
</exec>
于 2008-10-24T12:27:39.563 回答
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 任务,因为它让我们对正在应用的权限有更多的控制。

于 2008-10-24T16:49:21.547 回答
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>

希望这可以帮助!

于 2012-10-22T17:46:43.320 回答