Программно созданная папка с ACL недоступна - PullRequest
0 голосов
/ 14 февраля 2019

Мне было очень больно программно создавать папку с ACL и владельцем.

Taks :

Создать папку, доступную только одному пользователю (даже неАдминистратор).

(текущий) Решение :

Запуск от имени администратора:

// path is the directory, "target" the parent directory
String path = Path.Combine(target, "Data"); 
DirectorySecurity ds = Directory.GetAccessControl(target);
// up is the "UserPrincipal"
ds.AddAccessRule(new FileSystemAccessRule(up.Sid, FileSystemRights.CreateDirectories, AccessControlType.Allow));
Directory.SetAccessControl(target, ds);

// safeTokenHandle_SecureUser is the token of the already logged in User stored in "up"
using (WindowsImpersonationContext impersonatedUser = WindowsIdentity.Impersonate(safeTokenHandle_SecureUser.DangerousGetHandle()))
{
    ds = new DirectorySecurity();
    // Set owner only works impersonated
    ds.SetOwner(up.Sid); 
    // Inherited needs impersonation
    ds.AddAccessRule(new FileSystemAccessRule(up.Sid, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
    // Add Backupgroup
    ds.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier("S-1-5-32-551"), FileSystemRights.Read, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
    DirectoryInfo directory = Directory.CreateDirectory(path, ds);
}

Проблема :

Путь, созданный в "C: \ temp \ Sec53" (то есть подсчитать мои попытки ... но несколько попыток - это один и тот же каталог ..)

c:\temp\Sec53>whoami
pc-XXX\YYYuser93

c:\temp\Sec53>dir /q          (1)
 Datenträger in Laufwerk C: ist Windows
 Volumeseriennummer: ...

 Verzeichnis von c:\temp\Sec53

13.02.2019  13:13    <DIR>          VORDEFINIERT\Administra.   (2)
13.02.2019  13:13    <DIR>          AAA\BBB                ..
13.02.2019  13:13    <DIR>          XXX\YYYUser93          Data
(TRIM)

c:\temp\Sec53>cacls *
c:\temp\Sec53\Data VORDEFINIERT\Sicherungs-Operatoren:(OI)(IO)(Beschränkter Zugriff:)    (3)
                                                              READ_CONTROL
                                                              SYNCHRONIZE
                                                              FILE_GENERIC_READ
                                                              FILE_READ_DATA
                                                              FILE_READ_EA
                                                              FILE_READ_ATTRIBUTES

                   XXX\YYYUser93:(OI)(IO)F

(TRIM)

c:\temp\Sec53>cd Data
Zugriff verweigert  (4)
  1. "Dir / q"показывает владельца
  2. Пользователь: Предопределенный / Администратор
  3. Пользователь: Предопределенный / Резервная группа операторов
  4. Транслированный: Доступ запрещен

Вы можетевидите, я вошел в CMD с этим пользователем.Каталог существует, а его владельцем является пользователь.Разрешения для этого пользователя установлены на Полный.Но я все еще не могу изменить в этом каталоге.

Что не так?WTF?Что я могу сделать?

1 Ответ

0 голосов
/ 18 февраля 2019

Понял, при попытке № 75 ..

необходимо два правила, одно для текущего объекта, одно для унаследованного ..

ds.AddAccessRule(new FileSystemAccessRule(up.Sid, FileSystemRights.FullControl, AccessControlType.Allow));
ds.AddAccessRule(new FileSystemAccessRule(up.Sid, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));

В вопросе я создаю только унаследованное правило(с неправильными флагами).

...