Как дать разрешение для папки пользователя IIS в C#?
Мне нужно дать разрешение на доступ к папке для пользователя 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 ответа
На основании статьи " Пулы приложений":
IIS представляет новую функцию безопасности в пакете обновления 2 (SP2) Windows Server 2008 и Windows Vista. Это называется идентификаторы пула приложений. Удостоверения пула приложений позволяют запускать пулы приложений под уникальной учетной записью, не создавая и не управляя учетными записями домена или локальной системы. Имя учетной записи пула приложений соответствует имени пула приложений.
Вот хорошее объяснение того, что происходит:
В Windows 7 изоляция пула приложений IIS была переведена на другой уровень. Новое изменение, введенное в IIS7 (Windows Server 2008), стало новой возможностью для запуска пула приложений с именем AppPoolIdentiy. Однако значение по умолчанию для удостоверения пула приложений в IIS7 осталось прежним - NetworkService. В IIS7.5 AppPoolIdentiy становится значением по умолчанию. Таким образом, сценарии, ранее ожидающие, что для их идентификатора пула приложений будут установлены разрешения "NT Service\NetworkService", теперь должны будут устанавливать разрешения (ACL) для "IIS AppPool\" - учетной записи пользователя, создаваемой для каждого нового пула приложений.
Таким образом, чтобы установить разрешения для DefaultAppPool, сценарии должны будут установить списки ACL для "IIS AppPool\DefaultAppPool".
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");
}
}