如何在C#中为IIS用户授予文件夹权限?

时间:2013-11-22 06:49:47

标签: c# asp.net iis folder-permissions

我需要为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..

但这也行不通,但它正在投掷 “部分或全部身份参考无法翻译”

注意:我不想手动设置权限

请有人帮我这个..?

2 个答案:

答案 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");
        }
    }