|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Прога запущенная под Network Service должна уметь копировать файлы в папку заданную юзером. Не будем умничать, переформулируем так: аккаунт Network Service должен иметь "Full access" к заданной папке. Устанавливается достаточно просто (немного намутил, потому что еще убираю запреты Deny): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Но крайне желательно проверить, а есть ли уже эти права для Network Service. Читал тут: C# Test if user has write access to a folder Метод ловли на живца, там в частности предлагаемый (пытаемся записать туда файл и стираем его) - бред сивой кобылы, тем более проверка у меня производится понятно что не под NetworkService. Ну, в принципе вот он код проверки, частично стибренный из вышеуказанного обсуждения: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Код в целом рабочий, но он не учитывает следующего. Если есть например полный доступ для групп Все Пользователи Прошедшие проверку то для Network Service этот полный доступ уже тоже есть. Ф-ция в указаных случаях выдаст False, примененная следом верхняя ф-ция SetFullAccessNet конечно ошибки не даст, но избыточна, а нафига плодить лишние правила. Как это учесть? Я специально оставил закомментированные две строки про Dim principal As WindowsPrincipal (в оригинале Principal.GetCurrent) и If principal.IsInRole(TryCast(accessRule.IdentityReference, SecurityIdentifier)) Then Грубо смысл такой. Is NetworkService in Role Все Is NetworkService in Role Пользователи Is NetworkService in Role Прошедшие проверку т.е. мне надо проверять не только правила строго для NetworkService но и правила для групп куда NetworkService входит (надеюсь понял и пояснил понятно) Но я чего-то промудохался и не понимаю Как получить WindowsPrincipal для WellKnownSidType.NetworkServiceSid? (или что-то в этом духе) Не поможете? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 10:48 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
это называется Effective Access: https://stackoverflow.com/questions/3021698/effective-file-permissions-tools-api-in-windows посмотри этот код, может поможет ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 12:33 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77Метод ловли на живца, там в частности предлагаемый (пытаемся записать туда файл и стираем его) - бред сивой кобылы https://www.codeproject.com/Articles/14402/Testing-File-Access-Rights-in-NET Очень много кода, большими жирными кусками, всё как ты любишь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 13:46 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Roman Mejtes, Жалуются, что фризит, всё из-за GetEffectiveRightsFromAcl ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 13:47 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Roman Mejtes, Ну, честно не очень хочется счас влезать в эти API. Да, я умею с этим работать, у меня есть наработки на эту тему. Просто DirectorySecurity (.Net) итак достаточно неплоха. API, это когда в .Net нет обертки, например когда надо дать юзеру право стартовать/останавливать SE_OBJECT_TYPE.SE_SERVICE, а что касается SE_OBJECT_TYPE.SE_FILE_OBJECT, обертка кажется сделана неплохо. И потом, судя по описанию эта ф-ция (GetEffectiveRightsFromAcl) чего-то не умеет (подозреваю флаги CONTAINER_INHERIT_ACE, OBJECT_INHERIT_ACE и т.п.) >Жалуются, что фризит, всё из-за GetEffectiveRightsFromAcl Поясните значение слова "фризит", когда подбирал проц для нового компа, в отзыве про какой-то тоже было (Windows иногда фризит на играх и т.п.), так и не понял что имелось ввиду. Мне на самом деле нужно сделать ровно то что делает ф-ция Факсы и Сканирование Windows -> Сервис -> Параметры факса -> Дополнительные параметры -> При получении сохранять копию в После выбора папки, если что не так, она говорит (У выбранной папки нет доступа для службы факсов == Network Service) и далее его предоставляет. Методом проверок удалось понять что она делает: 1) Она рассматривает только "Full access" , т.е. если эту галку снять (хоть бы Read/Write остался), то False 2) Она проверяет NETWORK SERVICE + (!!!)Группы куда этот NETWORK SERVICE входит Т.е. если для группы Все или группы Пользователи есть "Full access" то ее это устраивает 3) Она проверяет что отсутствуют правила Deny строго для NETWORK SERVICE Группы не проверяет, пишет бла-бла ошибка, обратитесь к администратору, если я допустим назначу Deny для All. 4) Еще она немножко проверяет Inheritance/PropagationFlags-флаги, мой код проверки флагов(в первом посте) более менее подогнан под это поведение В принципе я все сделал. Ф-ция IsFullAccessNet в первом посте. Но я проверяю строгое соответствие NETWORK SERVICE, я не учитываю + (!!!)Группы куда этот NETWORK SERVICE входит Т.е. у меня жесткое условие проверки правила: Код: vbnet 1. 2.
Мне надо вместо этого сделать вот такую проверку: Код: vbnet 1.
accessRule.IdentityReference -это грубо имя пользователя или группы, для которого записано правило principal -это пользователь, правами которого мы интересуемся (меня интересует WellKnownSidType.NetworkServiceSid) principal.IsInRole - проверяет, является ли пользователь principal членом группы <accessRule.IdentityReference>, либо accessRule.IdentityReference это он и есть Мой простой вопрос. Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid? P.S. Для текущего пользователя делается так: Код: c# 1.
но мне нужен пользователь WellKnownSidType.NetworkServiceSid == NETWORK SERVICE, а не текущий Я не знаю как это родить. Ну вроде четко сформулировал чего хочу. PP.S Могу конечно почитать "литературу" и сделать проверки для +2-3 well-known групп, типа Все и Пользователи, но это как то мутно, тем более могут быть еще не стандартные, не well-known группы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 19:52 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77, http://www.pinvoke.net/default.aspx/advapi32.geteffectiverightsfromacl http://www.emmet-gray.com/Articles/PermissionCheck.html Ковырять кто в какие группы входит/не входит не надо, надо лишь вычислить конечные права для пользователя (или группы). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 20:13 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
hVostt, Все-таки настаиваете на API GetEffectiveRightsFromAcl ? Вы же сами только что обатили внимание на что "Жалуются, что фризит, всё из-за GetEffectiveRightsFromAcl", при этом не пояснив значение слова "фризит" о чем спросил. hVosttКовырять кто в какие группы входит/не входит не надо, Вопрос был не про ковыряние. Код ковыряния как бы прост и есть Код: vbnet 1.
Вопрос был: Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid? Т.е. мой вопрос нерешаемый? Я что-то не понимаю в концепции WindowsPrincipal? Я конечно попробую через API, коль скоро идей про principal не поступает, а время убить чем-то нужно. Посмотрю насколько это API приблизит меня к оригинальной реализации (та что в fax and scan). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 20:58 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77, Тебе надо узнать, есть ли необходимые права на нужный тебе ресурс для нужного тебе пользователя или системного процесса. Единственно верный способ, это вычислить эти права, а не проверять каким группам даны права и есть ли пользователь в этих группах, потому что это ошибочный путь, и не даст нужного результата. Я просто обратил внимание, что люди на что-то там жалуются, надо иметь в виду. Может быть они просто жопорукие :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 21:10 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
hVostt, я уже понял что я счас пойду API простыни писать и смотреть что мне это даст, это меня как таковое не пугает. Но ответ-то на мой маленький вопрос есть? Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid? Уворачиваешься как можешь... Это ж "чиста .Net" ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 21:37 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77, Лови Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Не прове ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 21:50 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
hVostt, ..рял ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 21:50 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77я уже понял что я счас пойду API простыни писать и смотреть что мне это даст, это меня как таковое не пугает. Ты сам себе проблемы создаешь. Мы тоже часто в разные папки разные файлы пишем под системными пользователями с очень ограниченными правами. Пути к папкам настраивают другие люди в деплой-конфигах. Если возникла ошибка при попытке записи в файл, в лог пишется понятная ошибка, создаётся тикет, люди читают, идут и исправляют. Такое бывает может раз в год, а то и реже, и занимает 10 мин на устранение проблемы. Если уж на то пошло, то проще назначить нужные права на папку, чем вычислять эти права. Хотя и это выполнимо, только ты почему-то не хочешь делать по-нормальному, раз уж таки взялся :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 21:57 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77, В общем проверил свой код, работает правильно Конечно, только в простейшем случае. Можно попробовать вычислять права самому, учитывая, что любой запрет имеет наивысший приоритет и отменяет все другие разрешение, но лучше воспользоваться API функцией. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 22:12 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77но мне нужен пользователь WellKnownSidType.NetworkServiceSid == NETWORK SERVICE, а не текущий Я не знаю как это родить. Это же безопасность , не может тут быть "как два пальца об...". Единственное, что близко, это Impersonation , но, думаю это совершенно неправильный путь (для решения реальной задачи, если честно, так и не понял какой). Лучше посмотреть, куда показывает hVostt. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 22:37 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
hVostt, А чем твой код отличается от моего, приведенного в первом посте? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Мое Код: vbnet 1. 2.
эквивалентно твоему Код: c# 1.
Он не учитывает правила для групп, в которых sid имеет членство Чтоб его допилить (что твой что мой) надо задействовать условие Код: vbnet 1.
вместо тех что у нас с тобой (rule.IdentityReference == sid) чтоб это сделать надо ответить на вопрос: Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid? (опять увернулся) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 22:40 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
LRЭто же безопасность , не может тут быть "как два пальца об...". В смысле "текущий пользователь" не может знать что пользователь "Network Service" состоит в группе "Все"? Если не может, то и не узнает, тогда ф-ция вернет False (хоть бы и через Try Catch). Смысл подзадачи простой: проверить что accessRule распространяется на "Network Service", хотя это и может быть rule для "EveryOne" (все), а не строго для "Network Service". Если "Network Service" состоит в "Все", то правило для "Все" также должно учитываться. C API я попробую, но пока тут дискутирую. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 22:54 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77В смысле "текущий пользователь" не может знать что пользователь "Network Service" состоит в группе "Все"?Допустим, это могут знать даже бабушки с колхозного рынка, а то, что состоит в какой-то группе с допуском - пожалуй, "залетный пользователь" не должен знать. Дмитрий77Если не может, то и не узнает, тогда ф-ция вернет False (хоть бы и через Try Catch).Т.е., для "админа" вполне может вернуть True? Дмитрий77Смысл подзадачи простой: проверить что accessRule распространяется на "Network Service", хотя это и может быть rule для "EveryOne" (все), а не строго для "Network Service". Если "Network Service" состоит в "Все", то правило для "Все" также должно учитываться.Вероятно, важно кто проверяет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 23:10 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
LR, >Вероятно, важно кто проверяет. Проверяет "текущий пользователь" >Т.е., для "админа" вполне может вернуть True? Вполне Я на дурака попытался сделать так Код: vbnet 1. 2. 3. 4. 5.
Оно ругается (последняя строчка), типа "указанное имя не является корректным именем пользователя", под админом тоже ругается. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 23:31 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186.
В конце, в переменной accessMask мы получаем вычисленные права доступа на папку. С учётом групп, подгрупп, разрешений, запрещений и всех остальных тонкостей и ньюансов системы. Проверил и напрямую, и с группой, и группу в группу засунул, проверил запрет через группу, всё работает. Управился за час, осталось оформить по-нормальному, и проверок добавить. Ещё бы юнит-тесты написать. На здоровье! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2017, 23:58 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Дмитрий77>Вероятно, важно кто проверяет. Проверяет "текущий пользователь" "текущий пользователь" - админ/не_админ? Если админ, домена/локальный? Разнообразие ответов по всевозможным функциям "проверки" в зависимости от статуса "текущего пользователя" ожидаемо... Не специалист, но думаю либо Impersonation (логин/пароль какого-то админа все равно потребуется), либо проводить эту проверку административно (типа, в руководстве пользователя...) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2017, 00:00 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
hVosttНа здоровье! И каков был статус "текущего пользователя" для выполнения всего этого? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2017, 00:03 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
Да, и подчищать за собой надо не забыть, удалить все полученные объекты в IntPtr. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2017, 00:03 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
LRИ каков был статус "текущего пользователя" для выполнения всего этого? Проверяется права не для текущего пользователя, а для NETWORK SERVICE. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2017, 00:04 |
|
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
|
|||
---|---|---|---|
#18+
hVosttLRИ каков был статус "текущего пользователя" для выполнения всего этого? Проверяется права не для текущего пользователя, а для NETWORK SERVICE. Т.е., не важно кем проверяется? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2017, 00:06 |
|
|
start [/forum/topic.php?fid=20&fpage=41&tid=1399785]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 152ms |
0 / 0 |