Код C # для автоматического предоставления IIS права на запись в папку в Windows Server 2008?В настоящее время выдает исключение - PullRequest
5 голосов
/ 07 декабря 2010

Я пытаюсь написать инструмент командной строки, который даст IIS7.5 на Windows Server 2008 доступ для записи в папку в wwwroot, чтобы у веб-приложения был доступ для записи в определенную папку в его базовом каталоге.Раньше вы делали это, назначая группу IIS_WPG для папки, предоставляющей этой группе доступ для изменения.

В Server 2008 я пытаюсь сделать то же самое с IIS_IUSRS, но происходит исключение.

Вот код:

private static void ManagePermissions(string directory, string account, FileSystemRights rights, AccessControlType controlType, bool addAccess)
{
    DirectoryInfo directoryInfo = new DirectoryInfo(directory);
    DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();

    if (addAccess)
        directorySecurity.AddAccessRule(
            new FileSystemAccessRule(account, rights, controlType));
    else
        directorySecurity.RemoveAccessRule(
            new FileSystemAccessRule(account, rights, controlType));

    directoryInfo.SetAccessControl(directorySecurity);
}

Вызов этого метода выглядит следующим образом:

ManagePermissions(
                  "c:\inetpub\wwwroot", 
                  "MACHINENAME\IIS_IUSRS", 
                  FileSystemRights.Modify, 
                  AccessControlType.Allow, 
                  true);

При выполнении этого вызова ManagePermissions возникает исключение следующего типа исообщение:

System.Security.Principal.IdentityNotMappedException: 
    Some or all identity references could not be translated.

Я несколько раз проверял, чтобы убедиться, что MACHINENAME \ IIS_IUSRS точно совпадает с пользователем в локальном диспетчере пользователей на компьютере, на котором выполняется этот код.Эта машина не участвует в домене Windows.

Дайте мне знать, если вам нужны дальнейшие разъяснения.

Ответы [ 2 ]

5 голосов
/ 15 августа 2012

IIS_IUSRS - встроенная группа, поэтому на нее не следует ссылаться с [machinename]\IIS_IUSRS, но с BUILTIN\IIS_IUSRS.Вот так:

ManagePermissions( 
                  "c:\inetpub\wwwroot",  
                  "BUILTIN\IIS_IUSRS",  
                  FileSystemRights.Modify,  
                  AccessControlType.Allow,  
                  true);

Переключение на этот способ обращения к пользователю исправило мой код.Я получаю учетную запись немного другим способом, чем указано в вашем примере:

IdentityReference user = new NTAccount(UserDomain + @"\" + UserName);

И затем использую его через другой конструктор, так что это может повлиять и на перевод, но я сомневаюсь:

var rule = new FileSystemAccessRule(user, ..., ..., ..., ...);
4 голосов
/ 04 февраля 2014

Обновление: недавно я видел ошибку с добавлением полного контроля для пользователя IIS_IUSRS в неанглийских окнах (Windows Server 2008 R2 x64 IIS7).

Несмотря на то, что IIS_IUSRS не переведен, «BUILTIN» перед ним может вызвать ошибку

Итак, помните об использовании «BUILTIN \ IIS_IUSRS», используйте просто «IIS_IUSRS» - он работает как на английском, так и на неанглийском Windows

...