题
我有一个ASP.NET 应用程序。基本上交付过程是这样的:
- Nant基础的应用程序并创建一个压缩文件关于开发商的计算机应用程序文件没有SVN文件夹和无用的文件。这一文件是提供一个Nant脚本。
- Zip和nant文件拷贝到客户的电脑
- 该Nant脚本取代了当前网站的文件的文件中所载的拉链文件。
我的问题是,与这个过程中,我有一个未经授权的访问的错误,当我试图打开的网站。看来,该文件需要有一个权限设定为用户"IIS_WPG".
我没有能力改变IIS配置所以我必须手动改变的权限,每个文件。而每一次我替换的文件的权限被删除,我需要设置他们。
因此,我有两个问题:
- 我可以改变的文件的权限与Nant?如何做到这一点?
- 它是可以避免这个问题?(开发人员不具有此用户在其计算机上)
解决方案
你需要运行的氯化钙程序,在windows授予的权限的文件和文件夹。从Nant,你可以做到这一点,与执行任务。
尝试一块标签,如:
<exec program="cacls">
<arg value="*" />
<arg value="/G IIS_WPG:F" />
</exec>
其他提示
@杰夫*弗里茨 哎哟...你的建议是正确的解决方案,但是参数。危险:).
在开发计算机上我是记录管理员我想你的建议有记录。
- 它取代了所有设置的权限,以便设定只有那些定义的命令(此后,该命令,获取文件的导致一个"拒绝访问",甚至与我的管理员用户)
- 它加上C:\WINDOWS\目录,而我所谓的命令从该入口脚本的目录的文件夹。:)
因此,在某些试验中,正确的命令是:
cacls [full folder path] /T /E /G IIS_WPG:F
- /T:适用于指定文件夹和子文件夹
- /E: 编辑 ACL而不是的 替换 它:)
我们结束了编写我们自己的任务,为此与一些相当直截了当代码:
[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"/>
显然,这可能被修改为你的特定规则或者你可以甚至参数化这一任务如果你愿意的话。我们选这个过使用执行任务,因为它让我们多一点点控制权限,正在加。
氯化钙是现在已经过时了。这里有一个版本,使用侵,更换。
让我们说,我们有以下几种:
- 根文件夹中的我们的安装是"c:\inetpub\wwwroot",并且它的存在NANT变
${paths.myprogram.inetpub}
- 该文件夹,我们想要修改是所谓的"上传",并且它的存在
${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>
希望这可以帮助!
不隶属于 StackOverflow