2008-10-24 167 views
8

我有一个ASP.NET应用程序。 基本上分娩过程是这样的一个:Nant:更改文件权限

  • 南特构建应用程序并创建开发人员的计算机上的压缩文件有没有SVN文件夹和无用文件的应用程序文件。该文件与一个Nant脚本一起交付。
  • zip和nant文件被复制到客户端的计算机
  • Nant脚本用压缩文件中包含的文件替换当前网站文件。

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

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

所以我有两个问题:

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

回答

4

您需要在Windows中运行CACLS程序以授予对文件和文件夹的权限。从南特来说,你可以使用EXEC任务来做到这一点。

尝试类似这样的标记块:

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

只需注意您的建议是正确的解决方案,但参数......危险:)。看到我的答案。 – 2010-07-29 12:54:13

7

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

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

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

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

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

更新:CACLS现在已被弃用,应该使用ICACLS。至少在Windows Server 2008 R2上就是这种情况。 – JulianM 2012-03-29 09:24:15

3

我们最终写了我们自己的任务f或者这与一些相当简单的代码:

[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); 
    } 
} 

然后,你可以写加载自定义任务,并执行一个恶性脚本:

<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}
  • 我们要修改的文件夹被称为“上传”,它的存储在${upload.foldername}
  • 我们要授予访问是“IIS_UPLOAD_USER”的用户,存储在${iis.upload.user}
  • 我们要授予的权限级别为“M”,为“修改”的权限存储在中

在这些假设下,我们的任务是这样的:

<exec program="icacls"> 
    <arg value="${path::combine(paths.myprogram.inetpub, upload.foldername)}" /> 
    <arg value="/grant" /> 
    <arg value="${iis.upload.user}:${iis.user.permissionlevel}" /> 
</exec> 

希望这有助于!