We use cookies to provide and improve our services. By using our site, you consent to cookies. Learn more
Disclaimer: данный пост несёт исключительно теоретическую ценность. Никакой практической пользы от него вы не получите.
Блуждая по просторам интернетов, наткнулся на один свой пост, который уже похоронен в истории веков.
Как известно, при доступе к общим ресурсам (сетевым папкам) мы различаем 2 типа прав:
Оба типа прав влияют на результирующие (эффективные) права пользователя при доступе к сетевому ресурсу. В общем смысле эффективные права будут являть собой наиболее ограничивающее разрешение из обоих типов прав. Например, на ресурс установлено право Share Permissions = Read, а NTFS = Full Control, то исходя из наиболее ограничивающего разрешения эффективным будет Read. Если Share Permissions = FullControl, а NTFS = Modify, то эффективным правом для пользователя будет Modify. Вот такая несложная схема. Т.е. там, где прав меньше, те и будут ваши :-) Как известно, эта проблема редко кого касается, т.к. обычно на уровне Share Permissions выдают FullControl на ресурс и дальше уже права регулируют за счёт NTFS. Как бы всё правильно, но если раскопать вопрос глубже, то появляются интересные моменты.
http://technet.microsoft.com/en-us/library/cc784499(WS.10).aspx – по этой ссылке можно найти сопоставление Share Permissons с NTFS Rights. Такое сопоставление удобно тем, что рассчитывать оба типа прав можно с использованием одних и тех же классов .NET, без необходимости городить отдельные библиотеки и классы для управления списками доступа ACL. Грубо говоря, фактическое сопоставление выглядит вот так (по схеме Share Permission = NTFS Right):
Но это в общем смысле. Внутри Windows это выглядит чуть сложнее, т.к. там появляется хитрое право Synchronize. Т.е. таблица уже имеет такой вид:
Обратите внимание на наличие DeleteSubfoldersAndFiles в Change. Windows оба этих типа прав рассчитывает через класс .NET – FileSystemRights и фактически их содержит не в текстовом виде, а в числовом. Вот как выглядят числовые сопоставления текстовым правам:
[↓] [vPodans] ([system.enum]::getnames([System.Security.AccessControl.FileSystemRights])) | %{@{$_ = ([System.Securit y.AccessControl.FileSystemRights]"$_").value__}} Name Value ---- ----- ListDirectory 1 ReadData 1 WriteData 2 CreateFiles 2 CreateDirectories 4 AppendData 4 ReadExtendedAttributes 8 WriteExtendedAttributes 16 Traverse 32 ExecuteFile 32 DeleteSubdirectoriesAndFiles 64 ReadAttributes 128 WriteAttributes 256 Write 278 Delete 65536 ReadPermissions 131072 Read 131209 ReadAndExecute 131241 Modify 197055 ChangePermissions 262144 TakeOwnership 524288 Synchronize 1048576 FullControl 2032127 [↓] [vPodans]
Как видно из таблички, FullControl является суммой всех перечисленных прав. Давайте разберём, что такое Modify, т.е. какие права нужно иметь для получения этого Modify:
В этом легко убедиться, т.к. если мы сложим все эти цифры, то получим 197055 (как и отражено в таблице). Обратимся к ссылке: http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!170.entry.
Теперь нам нужно преобразовать права доступа в класс FileSystemRights. Преобразование типа прав так же было ранее мною описано в первой части Управление ACL в PowerShell. Пара слов о том, чем отличаются права Read, Change и Full Control в контексте разрешений сетевого ресурса от контекста разрешений NTFS. Этим правам в NTFS сопоставляются Read + Execute, Modify и Full Control соответственно и плюс право Synchonize. Поэтому давайте запишем маску доступа в переменную $ace:
$ace.AccessMask = [System.Security.AccessControl.FileSystemRights]"Modify, Synchronize"
Чтобы получить Change, нам достаточно к этому числу (197055) прибавить Synchronize (1048576):
[↓] [vPodans] ([System.Security.AccessControl.FileSystemRights]"Modify, Synchronize").value__
1245631
Вот это в понимании SecurityDescriptor является эквивалентом нашего Change. Но я чуть ранее просил вас обратить внимание на наличие DeleteSubfoldersAndFiles в Change. Но тут его уже всунуть просто некуда, т.к. 1245695 (это число получится, если к Modify прибавить Synchronize и DeleteSubfoldersAndFiles) не будет распознано SecurityDescriptor’ом в методе SetShareInfo, как валидное число.
Иными словами, что у нас получается:
1) Change в понимании фактических прав является суммой: Modify + DeleteSubfoldersAndDiles + Synchronize
2) Change в понимании .NET является суммой: Modify + Synchronize
И чем вызвано такое несоответствие мне неизвестно. Но в качестве теоретической справки это может быть полезным.
© 2008 - 2025 - Sysadmins LV. All rights reserved
About | Privacy | Disclaimer | Contact
Comments: