我需要为IIS用户提供文件夹权限 其实我写了这样的代码..
public static void AddDirectorySecurity(string FileName, string Account, FileSystemRights Rights,AccessControlType ControlType)
{
DirectoryInfo dInfo = new DirectoryInfo(FileName);
DirectorySecurity dSecurity = dInfo.GetAccessControl();
dSecurity.AddAccessRule(
new System.Security.AccessControl.FileSystemAccessRule(objUser, Rights, ControlType));
dInfo.SetAccessControl(dSecurity);
}
我这样称呼上述方法......
void givepermission()
{
DirectoryInfo a = new DirectoryInfo(Server.MapPath("~/resources"));
AddDirectorySecurity(Server.MapPath("~/"), "IUSR", FileSystemRights.FullControl,AccessControlType.Allow);
}
但是本地工作。当服务器无法正常工作时。
而不是IUSR,我尝试了以下帐户名称,但也没有工作..
IIS_IUSRS
IIS_WPG
网络服务
每个人都
等。
而不是IIS_IUSRS。我也这样试过......
System.Environment.MachineName + "\\IIS_IUSRS"
IIS_IUSRS_System.Environment.MachineName
System.Environment.UserDomainName + "\\IIS_IUSRS"
etc..
但这也行不通,但它正在投掷 “部分或全部身份参考无法翻译”
注意:我不想手动设置权限
请有人帮我这个..?
答案 0 :(得分:4)
基于Application Pool Identities文章:
IIS在Service Pack 2(SP2)中引入了一项新的安全功能 Windows Server 2008和Windows Vista。它叫做应用程序池 身份。应用程序池标识允许您运行应用程序 无需创建和管理的独立帐户下的池 域名或本地帐户。应用程序池帐户的名称 对应于应用程序池的名称。
Here对发生的事情有一个很好的解释:
在Windows 7中,IIS应用程序池隔离还没有 不同的水平。 IIS7中引入的新更改(Windows Server 2008)是一个以appPoolIdentiy运行应用程序池的新选项。 但是,IIS7中的应用程序池标识的默认值仍然存在 相同 - NetworkService。在IIS7.5中,AppPoolIdentiy成为了 默认。因此,以前期望脚本权限的脚本 应用程序池标识设置为“NT Service \ NetworkService” 现在必须为“IIS AppPool”设置权限(ACL) - 为每个新应用程序池创建的用户帐户。
因此,要设置DefaultAppPool的权限,脚本将 需要为“IIS AppPool \ DefaultAppPool”设置ACL。
答案 1 :(得分:1)
public static void FolderPermission(String accountName, String folderPath)
{
try
{
FileSystemRights Rights;
//What rights are we setting? Here accountName is == "IIS_IUSRS"
Rights = FileSystemRights.FullControl;
bool modified;
var none = new InheritanceFlags();
none = InheritanceFlags.None;
//set on dir itself
var accessRule = new FileSystemAccessRule(accountName, Rights, none, PropagationFlags.NoPropagateInherit, AccessControlType.Allow);
var dInfo = new DirectoryInfo(folderPath);
var dSecurity = dInfo.GetAccessControl();
dSecurity.ModifyAccessRule(AccessControlModification.Set, accessRule, out modified);
//Always allow objects to inherit on a directory
var iFlags = new InheritanceFlags();
iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
//Add Access rule for the inheritance
var accessRule2 = new FileSystemAccessRule(accountName, Rights, iFlags, PropagationFlags.InheritOnly, AccessControlType.Allow);
dSecurity.ModifyAccessRule(AccessControlModification.Add, accessRule2, out modified);
dInfo.SetAccessControl(dSecurity);
}
catch (Exception ex)
{
MessageBox.Show("Error");
}
}