powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
40 сообщений из 40, показаны все 2 страниц
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39493832
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прога запущенная под 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.
  Public Function SetFullAccessNet(ByVal the_folder As String) As Boolean
    Try
      ' retrieving the directory information  
      Dim myDirectoryInfo As IO.DirectoryInfo = New IO.DirectoryInfo(the_folder)
      ' Get a DirectorySecurity object that represents the current security settings.
      Dim myDirectorySecurity As DirectorySecurity = myDirectoryInfo.GetAccessControl()
      'Remove deny rules
      Dim authRules As AuthorizationRuleCollection = myDirectorySecurity.GetAccessRules(True, True, GetType(SecurityIdentifier))
      For Each accessRule As FileSystemAccessRule In authRules
        If accessRule.IdentityReference.Translate(GetType(SecurityIdentifier)) = _
         New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing) Then
          If (accessRule.AccessControlType = AccessControlType.Deny) Then
            myDirectorySecurity.RemoveAccessRule(accessRule)
          End If
        End If
      Next
      ' Add the FileSystemAccessRule to the security settings.
      myDirectorySecurity.AddAccessRule _
       (New FileSystemAccessRule(New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing), _
       FileSystemRights.FullControl, InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow))
      ' Set the new access settings.
      myDirectoryInfo.SetAccessControl(myDirectorySecurity)
      Return True
    Catch
      MsgBox(Err.Description)
      Return False
    End Try
  End Function



Но крайне желательно проверить, а есть ли уже эти права для 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.
  Public Function IsFullAccessNet(ByVal the_folder As String) As Boolean
    Try
      Dim bFullAccess As Boolean = False
      'Dim principal As WindowsPrincipal = New WindowsPrincipal(New WindowsIdentity(WellKnownSidType.NetworkServiceSid)))
      Dim security As DirectorySecurity = IO.Directory.GetAccessControl(the_folder)
      Dim authRules As AuthorizationRuleCollection = security.GetAccessRules(True, True, GetType(SecurityIdentifier))
      For Each accessRule As FileSystemAccessRule In authRules
        'If principal.IsInRole(TryCast(accessRule.IdentityReference, SecurityIdentifier)) Then
        If accessRule.IdentityReference.Translate(GetType(SecurityIdentifier)) = _
         New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing) Then
          If ((accessRule.InheritanceFlags And InheritanceFlags.ObjectInherit) = InheritanceFlags.ObjectInherit) And _
           ((accessRule.PropagationFlags And PropagationFlags.InheritOnly) <> PropagationFlags.InheritOnly) And _
           ((accessRule.PropagationFlags And PropagationFlags.NoPropagateInherit) <> PropagationFlags.NoPropagateInherit) Then
            If ((FileSystemRights.FullControl And accessRule.FileSystemRights) = FileSystemRights.FullControl) Then
              If (accessRule.AccessControlType = AccessControlType.Allow) Then
                bFullAccess = True
              ElseIf (accessRule.AccessControlType = AccessControlType.Deny) Then
                'Deny usually overrides any Allow
                Return False
              End If
            End If
          End If
        End If
      Next
      Return bFullAccess
    Catch
      Return False
    End Try
  End Function


Код в целом рабочий, но он не учитывает следующего.

Если есть например полный доступ для групп
Все
Пользователи
Прошедшие проверку
то для 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? (или что-то в этом духе)

Не поможете?
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39493911
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это называется Effective Access:
https://stackoverflow.com/questions/3021698/effective-file-permissions-tools-api-in-windows
посмотри этот код, может поможет
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39493947
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Метод ловли на живца, там в частности предлагаемый (пытаемся записать туда файл и стираем его) - бред сивой кобылы

https://www.codeproject.com/Articles/14402/Testing-File-Access-Rights-in-NET

Очень много кода, большими жирными кусками, всё как ты любишь :)
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39493948
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Жалуются, что фризит, всё из-за GetEffectiveRightsFromAcl
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494182
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
        If accessRule.IdentityReference.Translate(GetType(SecurityIdentifier)) = _
         New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing) Then



Мне надо вместо этого сделать вот такую проверку:
Код: vbnet
1.
        If principal.IsInRole(TryCast(accessRule.IdentityReference, SecurityIdentifier)) Then


accessRule.IdentityReference -это грубо имя пользователя или группы, для которого записано правило
principal -это пользователь, правами которого мы интересуемся (меня интересует WellKnownSidType.NetworkServiceSid)
principal.IsInRole - проверяет, является ли пользователь principal членом группы <accessRule.IdentityReference>, либо accessRule.IdentityReference это он и есть

Мой простой вопрос. Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid?
P.S. Для текущего пользователя делается так:
Код: c#
1.
WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());


но мне нужен пользователь WellKnownSidType.NetworkServiceSid == NETWORK SERVICE, а не текущий
Я не знаю как это родить.

Ну вроде четко сформулировал чего хочу.
PP.S Могу конечно почитать "литературу" и сделать проверки для +2-3 well-known групп, типа Все и Пользователи, но это как то мутно, тем более могут быть еще не стандартные, не well-known группы.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494195
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

http://www.pinvoke.net/default.aspx/advapi32.geteffectiverightsfromacl
http://www.emmet-gray.com/Articles/PermissionCheck.html

Ковырять кто в какие группы входит/не входит не надо, надо лишь вычислить конечные права для пользователя (или группы).
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494216
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Все-таки настаиваете на API GetEffectiveRightsFromAcl ?
Вы же сами только что обатили внимание на что "Жалуются, что фризит, всё из-за GetEffectiveRightsFromAcl",
при этом не пояснив значение слова "фризит" о чем спросил.

hVosttКовырять кто в какие группы входит/не входит не надо,
Вопрос был не про ковыряние. Код ковыряния как бы прост и есть
Код: vbnet
1.
If principal.IsInRole(TryCast(accessRule.IdentityReference, SecurityIdentifier)) Then


Вопрос был:
Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid?
Т.е. мой вопрос нерешаемый? Я что-то не понимаю в концепции WindowsPrincipal?

Я конечно попробую через API, коль скоро идей про principal не поступает, а время убить чем-то нужно.
Посмотрю насколько это API приблизит меня к оригинальной реализации (та что в fax and scan).
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494225
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Тебе надо узнать, есть ли необходимые права на нужный тебе ресурс для нужного тебе пользователя или системного процесса. Единственно верный способ, это вычислить эти права, а не проверять каким группам даны права и есть ли пользователь в этих группах, потому что это ошибочный путь, и не даст нужного результата.

Я просто обратил внимание, что люди на что-то там жалуются, надо иметь в виду.
Может быть они просто жопорукие :)
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494237
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

я уже понял что я счас пойду API простыни писать и смотреть что мне это даст, это меня как таковое не пугает.

Но ответ-то на мой маленький вопрос есть?
Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid?
Уворачиваешься как можешь... Это ж "чиста .Net"
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494241
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий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.
       static void Main(string[] args)
        {
            var sid = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null);
            var hasWritePermissions = HasFolderWritePermission(@"C:\Temp\TestDir", sid);
        }

        public static bool HasFolderWritePermission(string destDir, SecurityIdentifier sid)
        {
            if (string.IsNullOrEmpty(destDir) || !Directory.Exists(destDir)) return false;
            try
            {
                var security = Directory.GetAccessControl(destDir);

                var query =
                    from AuthorizationRule rule in security.GetAccessRules(true, true, typeof(SecurityIdentifier))
                    where rule.IdentityReference == sid
                    select (FileSystemAccessRule)rule
                    into rights
                    where rights.FileSystemRights == (rights.FileSystemRights | FileSystemRights.Modify)
                    select rights;

                var list = query.ToList();

                if (list.Any(rights => rights.AccessControlType == AccessControlType.Deny)) return false;

                return list.Count > 0;
            }
            catch
            {
                return false;
            }
        }


Не прове
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494242
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

..рял
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494243
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77я уже понял что я счас пойду API простыни писать и смотреть что мне это даст, это меня как таковое не пугает.

Ты сам себе проблемы создаешь. Мы тоже часто в разные папки разные файлы пишем под системными пользователями с очень ограниченными правами. Пути к папкам настраивают другие люди в деплой-конфигах. Если возникла ошибка при попытке записи в файл, в лог пишется понятная ошибка, создаётся тикет, люди читают, идут и исправляют. Такое бывает может раз в год, а то и реже, и занимает 10 мин на устранение проблемы.

Если уж на то пошло, то проще назначить нужные права на папку, чем вычислять эти права. Хотя и это выполнимо, только ты почему-то не хочешь делать по-нормальному, раз уж таки взялся :)
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494246
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

В общем проверил свой код, работает правильно
Конечно, только в простейшем случае.
Можно попробовать вычислять права самому, учитывая, что любой запрет имеет наивысший приоритет и отменяет все другие разрешение, но лучше воспользоваться API функцией.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494253
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77но мне нужен пользователь WellKnownSidType.NetworkServiceSid == NETWORK SERVICE, а не текущий
Я не знаю как это родить.
Это же безопасность , не может тут быть "как два пальца об...". Единственное, что близко, это Impersonation , но, думаю это совершенно неправильный путь (для решения реальной задачи, если честно, так и не понял какой). Лучше посмотреть, куда показывает hVostt.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494255
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
  Public Function IsFullAccessNet(ByVal the_folder As String) As Boolean
    Try
      Dim bFullAccess As Boolean = False
      'Dim principal As WindowsPrincipal = New WindowsPrincipal(New WindowsIdentity(WellKnownSidType.NetworkServiceSid)))
      Dim security As DirectorySecurity = IO.Directory.GetAccessControl(the_folder)
      Dim authRules As AuthorizationRuleCollection = security.GetAccessRules(True, True, GetType(SecurityIdentifier))
      For Each accessRule As FileSystemAccessRule In authRules
        'If principal.IsInRole(TryCast(accessRule.IdentityReference, SecurityIdentifier)) Then
        If accessRule.IdentityReference.Translate(GetType(SecurityIdentifier)) = _
         New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing) Then
          If ((accessRule.InheritanceFlags And InheritanceFlags.ObjectInherit) = InheritanceFlags.ObjectInherit) And _
           ((accessRule.PropagationFlags And PropagationFlags.InheritOnly) <> PropagationFlags.InheritOnly) And _
           ((accessRule.PropagationFlags And PropagationFlags.NoPropagateInherit) <> PropagationFlags.NoPropagateInherit) Then
            If ((FileSystemRights.FullControl And accessRule.FileSystemRights) = FileSystemRights.FullControl) Then
              If (accessRule.AccessControlType = AccessControlType.Allow) Then
                bFullAccess = True
              ElseIf (accessRule.AccessControlType = AccessControlType.Deny) Then
                'Deny usually overrides any Allow
                Return False
              End If
            End If
          End If
        End If
      Next
      Return bFullAccess
    Catch
      Return False
    End Try
  End Function



Мое
Код: vbnet
1.
2.
        If accessRule.IdentityReference.Translate(GetType(SecurityIdentifier)) = _
         New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing) Then


эквивалентно твоему
Код: c#
1.
where rule.IdentityReference == sid


Он не учитывает правила для групп, в которых sid имеет членство
Чтоб его допилить (что твой что мой)
надо задействовать условие
Код: vbnet
1.
If principal.IsInRole(TryCast(accessRule.IdentityReference, SecurityIdentifier)) Then


вместо тех что у нас с тобой (rule.IdentityReference == sid)
чтоб это сделать надо ответить на вопрос:
Как мне сконструировать principal для well-known пользователя WellKnownSidType.NetworkServiceSid?
(опять увернулся)
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494261
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRЭто же безопасность , не может тут быть "как два пальца об...".
В смысле "текущий пользователь" не может знать что пользователь "Network Service" состоит в группе "Все"?
Если не может, то и не узнает, тогда ф-ция вернет False (хоть бы и через Try Catch).
Смысл подзадачи простой: проверить что accessRule распространяется на "Network Service", хотя это и может быть rule для "EveryOne" (все), а не строго для "Network Service".
Если "Network Service" состоит в "Все", то правило для "Все" также должно учитываться.

C API я попробую, но пока тут дискутирую.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494264
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77В смысле "текущий пользователь" не может знать что пользователь "Network Service" состоит в группе "Все"?Допустим, это могут знать даже бабушки с колхозного рынка, а то, что состоит в какой-то группе с допуском - пожалуй, "залетный пользователь" не должен знать.

Дмитрий77Если не может, то и не узнает, тогда ф-ция вернет False (хоть бы и через Try Catch).Т.е., для "админа" вполне может вернуть True?

Дмитрий77Смысл подзадачи простой: проверить что accessRule распространяется на "Network Service", хотя это и может быть rule для "EveryOne" (все), а не строго для "Network Service".
Если "Network Service" состоит в "Все", то правило для "Все" также должно учитываться.Вероятно, важно кто проверяет.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494268
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

>Вероятно, важно кто проверяет.
Проверяет "текущий пользователь"
>Т.е., для "админа" вполне может вернуть True?
Вполне

Я на дурака попытался сделать так
Код: vbnet
1.
2.
3.
4.
5.
      Dim sid As SecurityIdentifier = New SecurityIdentifier("S-1-5-20")  ' New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing)
      Dim ntAccount As NTAccount = DirectCast(sid.Translate(GetType(NTAccount)), NTAccount)
      Dim user As WindowsIdentity = New WindowsIdentity(ntAccount.Value)

      Dim principal As WindowsPrincipal = New WindowsPrincipal(user) '(WindowsIdentity.GetCurrent())


Оно ругается (последняя строчка), типа "указанное имя не является корректным именем пользователя",
под админом тоже ругается.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494277
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий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.
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace ConsoleApp4
{
    class Program
    {
        private enum MULTIPLE_TRUSTEE_OPERATION
        {
            NO_MULTIPLE_TRUSTEE,
            TRUSTEE_IS_IMPERSONATE
        }

        private enum TRUSTEE_FORM
        {
            TRUSTEE_IS_SID,
            TRUSTEE_IS_NAME,
            TRUSTEE_BAD_FORM,
            TRUSTEE_IS_OBJECTS_AND_SID,
            TRUSTEE_IS_OBJECTS_AND_NAME
        }

        private enum TRUSTEE_TYPE
        {
            TRUSTEE_IS_UNKNOWN,
            TRUSTEE_IS_USER,
            TRUSTEE_IS_GROUP,
            TRUSTEE_IS_DOMAIN,
            TRUSTEE_IS_ALIAS,
            TRUSTEE_IS_WELL_KNOWN_GROUP,
            TRUSTEE_IS_DELETED,
            TRUSTEE_IS_INVALID,
            TRUSTEE_IS_COMPUTER
        }

        //Platform independent (32 & 64 bit) - use Pack = 0 for both platforms. IntPtr works as well.
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 0)]
        private struct TRUSTEE
        {
            public IntPtr pMultipleTrustee;
            public MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
            public TRUSTEE_FORM TrusteeForm;
            public TRUSTEE_TYPE TrusteeType;
            public IntPtr ptstrName;
        }

        enum SE_OBJECT_TYPE
        {
            SE_UNKNOWN_OBJECT_TYPE = 0,
            SE_FILE_OBJECT,
            SE_SERVICE,
            SE_PRINTER,
            SE_REGISTRY_KEY,
            SE_LMSHARE,
            SE_KERNEL_OBJECT,
            SE_WINDOW_OBJECT,
            SE_DS_OBJECT,
            SE_DS_OBJECT_ALL,
            SE_PROVIDER_DEFINED_OBJECT,
            SE_WMIGUID_OBJECT,
            SE_REGISTRY_WOW64_32KEY
        }

        [Flags]
        enum SECURITY_INFORMATION : uint
        {
            OWNER_SECURITY_INFORMATION = 0x00000001,
            GROUP_SECURITY_INFORMATION = 0x00000002,
            DACL_SECURITY_INFORMATION = 0x00000004,
            SACL_SECURITY_INFORMATION = 0x00000008,
            UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
            UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
            PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000,
            PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000
        }

        [Flags]
        public enum ACCESS_MASK : uint
        {
            DELETE = 0x00010000,
            READ_CONTROL = 0x00020000,
            WRITE_DAC = 0x00040000,
            WRITE_OWNER = 0x00080000,
            SYNCHRONIZE = 0x00100000,

            STANDARD_RIGHTS_REQUIRED = 0x000F0000,

            STANDARD_RIGHTS_READ = 0x00020000,
            STANDARD_RIGHTS_WRITE = 0x00020000,
            STANDARD_RIGHTS_EXECUTE = 0x00020000,

            STANDARD_RIGHTS_ALL = 0x001F0000,

            SPECIFIC_RIGHTS_ALL = 0x0000FFFF,

            ACCESS_SYSTEM_SECURITY = 0x01000000,

            MAXIMUM_ALLOWED = 0x02000000,

            GENERIC_READ = 0x80000000,
            GENERIC_WRITE = 0x40000000,
            GENERIC_EXECUTE = 0x20000000,
            GENERIC_ALL = 0x10000000,

            DESKTOP_READOBJECTS = 0x00000001,
            DESKTOP_CREATEWINDOW = 0x00000002,
            DESKTOP_CREATEMENU = 0x00000004,
            DESKTOP_HOOKCONTROL = 0x00000008,
            DESKTOP_JOURNALRECORD = 0x00000010,
            DESKTOP_JOURNALPLAYBACK = 0x00000020,
            DESKTOP_ENUMERATE = 0x00000040,
            DESKTOP_WRITEOBJECTS = 0x00000080,
            DESKTOP_SWITCHDESKTOP = 0x00000100,

            WINSTA_ENUMDESKTOPS = 0x00000001,
            WINSTA_READATTRIBUTES = 0x00000002,
            WINSTA_ACCESSCLIPBOARD = 0x00000004,
            WINSTA_CREATEDESKTOP = 0x00000008,
            WINSTA_WRITEATTRIBUTES = 0x00000010,
            WINSTA_ACCESSGLOBALATOMS = 0x00000020,
            WINSTA_EXITWINDOWS = 0x00000040,
            WINSTA_ENUMERATE = 0x00000100,
            WINSTA_READSCREEN = 0x00000200,

            WINSTA_ALL_ACCESS = 0x0000037F
        }

        [DllImport("advapi32.dll", SetLastError = true)]
        static extern uint GetEffectiveRightsFromAcl(IntPtr pDacl, ref TRUSTEE pTrustee, ref int pAccessRights);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
        static extern uint GetNamedSecurityInfo(
            string pObjectName,
            SE_OBJECT_TYPE ObjectType,
            SECURITY_INFORMATION SecurityInfo,
            out IntPtr pSidOwner,
            out IntPtr pSidGroup,
            out IntPtr pDacl,
            out IntPtr pSacl,
            out IntPtr pSecurityDescriptor);

        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern void BuildTrusteeWithSid(
            ref TRUSTEE pTrustee,
            byte[] sid
        );

        static void Main(string[] args)
        {
            var sid = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null);

            IntPtr pDacl;
            IntPtr pSecurityDescriptor;
            IntPtr pSidOwner = IntPtr.Zero;
            IntPtr pSidGroup = IntPtr.Zero;
            IntPtr pSacl = IntPtr.Zero;

            var result = GetNamedSecurityInfo(@"D:\Temp\TestDir", SE_OBJECT_TYPE.SE_FILE_OBJECT, SECURITY_INFORMATION.DACL_SECURITY_INFORMATION, 
                out pSidOwner, out pSidGroup, out pDacl, out pSacl, out pSecurityDescriptor);

            if (result != 0)
            {
                throw new Win32Exception((int)result);
            }

            var trustee = new TRUSTEE();
            var accessRights = 0;

            var sidBytes = new byte[sid.BinaryLength];
            sid.GetBinaryForm(sidBytes, 0);

            BuildTrusteeWithSid(ref trustee, sidBytes);

            result = GetEffectiveRightsFromAcl(pDacl, ref trustee, ref accessRights);

            if (result != 0)
            {
                throw new Win32Exception((int)result);
            }

            var accessMask = (ACCESS_MASK) accessRights;
        }
    }
}



В конце, в переменной accessMask мы получаем вычисленные права доступа на папку. С учётом групп, подгрупп, разрешений, запрещений и всех остальных тонкостей и ньюансов системы. Проверил и напрямую, и с группой, и группу в группу засунул, проверил запрет через группу, всё работает.

Управился за час, осталось оформить по-нормальному, и проверок добавить. Ещё бы юнит-тесты написать.

На здоровье!
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494278
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77>Вероятно, важно кто проверяет.
Проверяет "текущий пользователь"
"текущий пользователь" - админ/не_админ? Если админ, домена/локальный? Разнообразие ответов по всевозможным функциям "проверки" в зависимости от статуса "текущего пользователя" ожидаемо... Не специалист, но думаю либо Impersonation (логин/пароль какого-то админа все равно потребуется), либо проводить эту проверку административно (типа, в руководстве пользователя...)
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494279
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНа здоровье!
И каков был статус "текущего пользователя" для выполнения всего этого?
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494280
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и подчищать за собой надо не забыть, удалить все полученные объекты в IntPtr.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494281
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRИ каков был статус "текущего пользователя" для выполнения всего этого?

Проверяется права не для текущего пользователя, а для NETWORK SERVICE.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494282
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttLRИ каков был статус "текущего пользователя" для выполнения всего этого?

Проверяется права не для текущего пользователя, а для NETWORK SERVICE.
Т.е., не важно кем проверяется?
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494284
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRТ.е., не важно кем проверяется?

Важно конечно, но это уже не моя головная боль
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494295
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttУправился за час, осталось оформить по-нормальному, и проверок добавить. Ещё бы юнит-тесты написать.

На здоровье!

Понимаешь в чем дело (то о чем я подозревал).
Я когда-то давно это уже писал, т.е. писать то ничего не пришлось.
Там кстати у меня коммент есть (возможно это про "фризит")
'BuildTrusteeWithName(tR, pszTrustee) '-по каким-то причинам эта ф-ция вызывает crash

Код: 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.
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.
 Public Function GetSecurityPermissions(ByVal pszObjName As String, _
   ByVal ObjectType As SE_OBJECT_TYPE, ByVal pszTrustee As String, _
   ByRef dwAccessRights As Integer) As Integer

    Dim dwRes As Integer
    Dim pCurDACL As IntPtr
    Dim pSD As IntPtr
    Dim tR As New TRUSTEE

    If (pszObjName = "") Then
      GetSecurityPermissions = ERROR_INVALID_PARAMETER
      'Debug.Print("ERROR_INVALID_PARAMETER")
      Exit Function
    End If

    'Get a pointer to the existing DACL.
    dwRes = GetNamedSecurityInfo(pszObjName, ObjectType, _
     DACL_SECURITY_INFORMATION, _
     IntPtr.Zero, IntPtr.Zero, pCurDACL, IntPtr.Zero, pSD)
    If dwRes <> ERROR_SUCCESS Then
      'Debug.Print("GetNamedSecurityInfo Error " & CStr(dwRes))
      GoTo Cleanup
    End If

    'Initialize a TRUSTEE structure for the specified trustee name.
    'BuildTrusteeWithName(tR, pszTrustee) '-по каким-то причинам эта ф-ция вызывает crash
    'поэтому инициализируем tR-структуру вручную согласно описанию ф-ции
    'pszTrustee-A pointer to a null-terminated string that contains the name of the trustee for the ptstrName member of the TRUSTEE structure.
    'The BuildTrusteeWithName function sets the other members of the TRUSTEE structure as follows.
    'pMultipleTrustee    NULL
    'MultipleTrusteeOperation    NO_MULTIPLE_TRUSTEE
    'TrusteeForm    TRUSTEE_IS_NAME
    'TrusteeType    TRUSTEE_IS_UNKNOWN
    With tR
      .pMultipleTrustee = IntPtr.Zero
      .MultipleTrusteeOperation = MULTIPLE_TRUSTEE_OPERATION.NO_MULTIPLE_TRUSTEE
      .TrusteeForm = TRUSTEE_FORM.TRUSTEE_IS_NAME
      .TrusteeType = TRUSTEE_TYPE.TRUSTEE_IS_UNKNOWN
      .ptstrName = pszTrustee
    End With

    dwRes = GetEffectiveRightsFromAcl(pCurDACL, tR, dwAccessRights)
    If dwRes <> ERROR_SUCCESS Then
      'Debug.Print("GetEffectiveRightsFromAcl Error " & CStr(dwRes))
      GoTo Cleanup
    End If

Cleanup:
    If pSD <> IntPtr.Zero Then LocalFree(pSD)

    GetSecurityPermissions = dwRes
  End Function

  Public Function ConstructUniversalAndNTWellKnownSidsNS(GroupName As String) As String
    'возвращает имя стандартной группы пользователей на языке OS (рус,английский)
    'НЕ включает имя домена: СИСТЕМА; Все; Администраторы; Пользователи

    ConstructUniversalAndNTWellKnownSidsNS = ""

    Dim siaNtAuthority As New SID_IDENTIFIER_AUTHORITY
    Dim lSid As IntPtr

    Select Case GroupName
      Case "NetworkService"
        ' Construct SID for System "NT well-known SID" ("NetworkService")
        siaNtAuthority.Value = {0, 0, 0, 0, 0, SECURITY_NT_AUTHORITY}
        'siaNtAuthority.Value(5) = SECURITY_NT_AUTHORITY
        If AllocateAndInitializeSid(siaNtAuthority, 1, _
         SECURITY_NETWORK_SERVICE_RID, 0, 0, 0, 0, 0, 0, 0, lSid) Then
          'AddLog("  Calling AllocateAndInitializeSid... Done.")
          AddLog("  " & Trim(strL_Authorization_CallingDoneFailed_Calling & " AllocateAndInitializeSid... " & strL_Authorization_CallingDoneFailed_Done))
          ' Use the constructed SID in the application
          ConstructUniversalAndNTWellKnownSidsNS = DisplayNameOfSid(lSid)
          ' Free the memory allocated for the SID using FreeSid() API
          FreeSid(lSid)
        Else
          'AddLog("  Calling AllocateAndInitializeSid... Failed. Error code: " & RaiseAPIError())
          AddLog("  " & Trim(strL_Authorization_CallingDoneFailed_Calling & " AllocateAndInitializeSid... " & _
           strL_Authorization_CallingDoneFailed_Failed & " " & strL_Authorization_ErrorCode) & ": " & RaiseAPIError())
        End If

      Case Else
    End Select
    If ConstructUniversalAndNTWellKnownSidsNS <> "" Then _
     AddLog("    " & strL_Authorization_UsersGroupName & ": " & ConstructUniversalAndNTWellKnownSidsNS & " ...OK") ' "    UsersGroupName: " " ...OK"
  End Function



Все что я написал сейчас для теста:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
  Public Const STANDARD_RIGHTS_ALL = &H1F0000

  Public Function IsFullAccessAPI(ByVal the_folder As String) As Boolean
    Dim AccessMask As Integer
    GetSecurityPermissions(the_folder, SE_OBJECT_TYPE.SE_FILE_OBJECT, _
     ConstructUniversalAndNTWellKnownSidsNS("NetworkService"), AccessMask)
    Return ((AccessMask Or STANDARD_RIGHTS_ALL) = AccessMask)
  End Function



Группы ДА, учитываются автоматом.
Но она зараза не делает разницы между:
"Для этой папки, ее подпапок и файлов"
"Только для этой папки"
"Только для этой папки и ее подпапок"
и т.д.

Понимаешь о чем я?

Если ты взглянешь в мой .Net код из первого поста, то там проверяется доп. условие (флаг InheritanceFlags.ContainerInherit из нек. соображений я не проверяю)
Код: vbnet
1.
2.
3.
          If ((accessRule.InheritanceFlags And InheritanceFlags.ObjectInherit) = InheritanceFlags.ObjectInherit) And _
           ((accessRule.PropagationFlags And PropagationFlags.InheritOnly) <> PropagationFlags.InheritOnly) And _
           ((accessRule.PropagationFlags And PropagationFlags.NoPropagateInherit) <> PropagationFlags.NoPropagateInherit) Then



На языке API условие "Для этой папки, ее подпапок и файлов" устанавливается константами что я выделил:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  Public Function DoFullAccessFileFolderNetworkService(ByVal FileFolderPath As String) As Integer
    DoFullAccessFileFolderNetworkService = AddAceToObjectsSecurityDescriptor(FileFolderPath, _
     SE_OBJECT_TYPE.SE_FILE_OBJECT, _
     ConstructUniversalAndNTWellKnownSidsNS("NetworkService"), _
     GENERIC_ALL, _
     ACCESS_MODE.GRANT_ACCESS, _
     CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE)
    If DoFullAccessFileFolderNetworkService <> ERROR_SUCCESS Then
      'AddLog("  Calling AddAceToObjectsSecurityDescriptor... Failed. Error code: " & RaiseAPIErrorByNumber(DoFullAccessFileFolder))
      AddLog("  " & Trim(strL_Authorization_CallingDoneFailed_Calling & " AddAceToObjectsSecurityDescriptor... " & _
       strL_Authorization_CallingDoneFailed_Failed & " " & strL_Authorization_ErrorCode) & ": " & RaiseAPIErrorByNumber(DoFullAccessFileFolderNetworkService))
    Else
      'AddLog("  Calling AddAceToObjectsSecurityDescriptor... Done.")
      AddLog("  " & Trim(strL_Authorization_CallingDoneFailed_Calling & " AddAceToObjectsSecurityDescriptor... " & strL_Authorization_CallingDoneFailed_Done))
    End If
  End Function



.Net код проверки (из первого поста, на который я напираю) тупо перебирает правила и там можно проверить эти флаги,
а GetEffectiveRightsFromAcl себе на уме, при этом информации про флаги CONTAINER_INHERIT_ACE/OBJECT_INHERIT_ACE не предоставляет.
Посему мне этот солюшн что-то не нравится и .Net-код более симпатичен.
Вот поэтому мне и хочется найти-таки ответ на свой "маленький вопрос" про членство в группе.
Понятно излагаю?
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494296
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Группы ДА, учитываются автоматом.
Но она зараза не делает разницы между:
"Для этой папки, ее подпапок и файлов"
"Только для этой папки"
"Только для этой папки и ее подпапок"
и т.д.

Понимаешь о чем я?

Не понимаю зачем это тебе. Изначально задача была такая:

авторПрога запущенная под Network Service должна уметь копировать файлы в папку заданную юзером.
Не будем умничать, переформулируем так:
аккаунт Network Service должен иметь "Full access" к заданной папке.

авторНо крайне желательно проверить, а есть ли уже эти права для Network Service.

Ну? Код который я привёл, не показывает как решается эта задача?

Да и в чём проблема установить свои права на папку, проверяя только наличие установленных правил на NETWORK SERVICE? Лучше даже просто перезаписывать. Плевать, если подобные права распространяются через группу, или папкой выше? Завтра группу убьют, и все твои старания пойдут лесом. Нормальная практика, это установить именно те права, которые требуются для работы. Потому что наследованные права могут завтра измениться, потому что это вообще не твоя область ответственности, какая-то другая программа их уберёт (выше, или убьёт группу).

Если вопрос чисто академический, ты хочешь поковыряться в локальных учётках, посмотреть кто в каких группах находится, то велком, подключай System.DirectoryServices, используй PrincipalContext, PrincipalSearcher...


Дмитрий77 а GetEffectiveRightsFromAcl себе на уме, при этом информации про флаги CONTAINER_INHERIT_ACE/OBJECT_INHERIT_ACE не предоставляет.

Зачем он их должен предоставлять? Он вычисляет конечный применяемый (эффективный) набор прав. Ты хотел узнать, может ли NETWORK SERVICE писать в папку? Ты узнал. Если ты наборот хочешь установить свои права для NS, устанавливай. И проверяй только аналогичные права, а не какие-то отнаследованные, потому что это к тебе не относится, их завтра могут убрать, они могут измениться, группы могут похериться. Поэтому ты вообще не должен страдать подобной хернёй. От слова совсем.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494297
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Понятно излагаю?

Страдаешь фигнёй и людям голову морочишь.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494300
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДа и в чём проблема установить свои права на папку, проверяя только наличие установленных правил на NETWORK SERVICE?
тогда те 2 ф-ции что я родил в первом посте
20668947
суть НЕОБХОДИМО и ДОСТАТОЧНО (задачу они решают)
Так?
Предлагаешь так и оставить и не париться? (честно самому уже надоело)
(бесит что все таки избыточно, а для Set надо в общем случае вызывать UAC==AsAdmin)

Бесит меня лишь то, что "эталон" более интелектуален и я не могу это точь в точь повторить:
а именно
Дмитрий77Мне на самом деле нужно сделать ровно то что делает ф-ция
Факсы и Сканирование 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-флаги, мой код проверки флагов(в первом посте) более менее подогнан под это поведение
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494320
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНу? Код который я привёл, не показывает как решается эта задача? .
Я оценил желание помочь, спасибо.
При этом я тебе сразу привел свой такой же, написанный лет 5 тому назад еще на VB6 и переписанный на .Net 2 года назад. На это внимание обратил? Что он такой же.
20671558 Почему не нравится, там написал, но это ты заметил.

hVosttДа и в чём проблема установить свои права на папку, проверяя только наличие установленных правил на NETWORK SERVICE? Лучше даже просто перезаписывать.).
Каждый раз и лишний раз перезаписывать не стоит. Проверка это User, установка прав - как правило Admin. Слишком часто вызывать UAC окно для повышения прав по поводу и без бы не хотелось.

hVosttПлевать, если подобные права распространяются через группу, или папкой выше? Завтра группу убьют, и все твои старания пойдут лесом. Нормальная практика, это установить именно те права, которые требуются для работы. Потому что наследованные права могут завтра измениться, потому что это вообще не твоя область ответственности, какая-то другая программа их уберёт (выше, или убьёт группу).
В принципе согласен. Пока имплементировал этот вариант. Т.е. 2 мои .Net функции в первом посте. Вроде все внешне красиво получилось.

hVosttЕсли вопрос чисто академический, ты хочешь поковыряться в локальных учётках, посмотреть кто в каких группах находится, то велком, подключай System.DirectoryServices, используй PrincipalContext, PrincipalSearcher...).
check if user is a member of a group
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public bool IsUserInGroup(string userName, string groupName)
{
    using (var context = new PrincipalContext(ContextType.Machine))
    {
        using (var searcher = new PrincipalSearcher(new UserPrincipal(context) { SamAccountName = userName }))
        {
            using (var user = searcher.FindOne() as UserPrincipal)
            {
                return user != null && user.IsMemberOf(context, IdentityType.SamAccountName, groupName);
            }
        }
    }
}


Не могу вот это на vb.net перевести, конвертер не осилил, хотя думаю это то о чем ты сказал
Код: vbnet
1.
using (var searcher = new PrincipalSearcher(new UserPrincipal(context) { SamAccountName = userName }))


hVosttДмитрий77 а GetEffectiveRightsFromAcl себе на уме, при этом информации про флаги CONTAINER_INHERIT_ACE/OBJECT_INHERIT_ACE не предоставляет.
И проверяй только аналогичные права, а не какие-то отнаследованные, потому что это к тебе не относится, их завтра могут убрать, они могут измениться, группы могут похериться.
Я не пытаюсь проверять отнаследованные (от папки уровнем выше),
я имел ввиду наследование прав папками и файлами которые в моей папке (которые уровнем ниже).

hVosttМы тоже часто в разные папки разные файлы пишем под системными пользователями с очень ограниченными правами. Пути к папкам настраивают другие люди в деплой-конфигах. Если возникла ошибка при попытке записи в файл, в лог пишется понятная ошибка, создаётся тикет, люди читают, идут и исправляют. Такое бывает может раз в год, а то и реже, и занимает 10 мин на устранение проблемы.
Я не пишу tool для админа и его помощников, а пишу типа "коробочную версию". Поэтому внешняя сторона должна быть на уровне. Поэтому лучше чтоб без ошибок в логах, тикетов и исправлений.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Я не пытаюсь проверять отнаследованные (от папки уровнем выше),
я имел ввиду наследование прав папками и файлами которые в моей папке (которые уровнем ниже).

Если ты можешь создать папку, считай у тебя есть это наследование :)


Дмитрий77Не могу вот это на vb.net перевести, конвертер не осилил, хотя думаю это то о чем ты сказал

Ээхх, осилить бы тебе C#, как бы для тебя это всё упростило на пять порядков


Дмитрий77Я не пишу tool для админа и его помощников, а пишу типа "коробочную версию". Поэтому внешняя сторона должна быть на уровне. Поэтому лучше чтоб без ошибок в логах, тикетов и исправлений.

Ну моё мнение такое, ты проверяешь наличие непосредственных прав для NETWORK SERVICE, группы идут лесом, это вообще странная практика NETWORK SERVICE добавлять в группу, когда группы существуют для пользователей (я ни разу такого не встречал). Если прав для NS нет, добавляешь нужные правила.

Я думаю, ты бы очень удивился, если бы увидел код программы для факсов, там вряд ли проверяются все правила и группы вдоль и поперёк с проверкой наследования.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494388
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77тогда те 2 ф-ции что я родил в первом посте
20668947
суть НЕОБХОДИМО и ДОСТАТОЧНО (задачу они решают)
Так?
Предлагаешь так и оставить и не париться? (честно самому уже надоело)
(бесит что все таки избыточно, а для Set надо в общем случае вызывать UAC==AsAdmin)

Именно, необходимо и достаточно проверить наличие конкретных прав для конкретного SID, а не для группы какой-то. Это не избыточно, то, что нужно.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494453
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ думаю, ты бы очень удивился, если бы увидел код программы для факсов, там вряд ли проверяются все правила и группы вдоль и поперёк с проверкой наследования.
Посмотрел бы, да где ж его взять.
Речь идет о методе Store in Folder (я пишу свои route extension которые учитывают DID=Called Number).
Там на самом деле тоже мутно, хотя примерный алгоритм я описал. Т.е. если что-то при назначении папки пошло не так,чего она понять не может, выводится "Случилась ошибка. Попробуйте позже или обратитесь к администратору" - и усе. Плюс использует критерий именно "полный доступ", хотя если есть Read/Write (без полного), то это должно быть достаточно.
На XP проще - там кухня работает под System (все права на все итак есть), но уже начиная с Win2003(NT 5.2) -Network Service, хотя я глянул, как задача решается конкретно на Win2003 (а не на Win10) - а никак, просто пишет что нет доступа, предлагает почитать help и назначить права ручками,и не дает назначить папку пока это не будет сделано.
Так что черт с ним, пусть будет тупая проверка ==Network Service с обеспечением флагов "Для этой папки, ее подпапок и файлов" и "Полный доступ".

Что касается C#->Vb.net, да я понял как перевести
только
>велком, подключай System.DirectoryServices, используй PrincipalContext, PrincipalSearcher...
я поигрался, это глюкота какая-то, во первых тормозная (уж не знаю что оно там инициализирует), во вторых оч. далеко от искомого.
Да и бог с ним.
Я с тобой согласился, да и времени жалко.

Единственная непонятка для меня это "сетевые пути".
Вопрос озвучил здесь:
Приложение запущено NetworkService(ComputerA), как ему положить файл в папку на ComputerB?
(специалистов, кот. бы мне это разжевали пока не нашлось, но подозреваю что оба компа должны быть в домене AD чтоб это в принципе работало, а я в своей частной практике доменов не держу - бухнешь сервер в домен - потом вообще ничего не работает, и назад не вернешь -поэтому все тесты в WorkGroup, последние годы и не дергаюсь).
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494482
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"фризы" (зависания) кстати скорее всего возникают по причине разрешения SID'а и всех связанных с ним групп, обычно на таких операциях, запросах AD и т.д. всегда всё тормозит :)
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494514
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Приложение запущено NetworkService(ComputerA), как ему положить файл в папку на ComputerB?
(специалистов, кот. бы мне это разжевали пока не нашлось, но подозреваю что оба компа должны быть в домене AD чтоб это в принципе работало, а я в своей частной практике доменов не держу - бухнешь сервер в домен - потом вообще ничего не работает, и назад не вернешь -поэтому все тесты в WorkGroup, последние годы и не дергаюсь).

А чё тут разжёвывать? NetworkService это локальная учётка для служб, не распространяется на другие компы. Обычно это решается через делегирование операции службе на другом компе. Или это должна быть одна учётка в домене, с привелегиями которой выполняется служба. Может помогла бы имперсонализация, но надо разбираться подробно с условиями задачи. Скорее всего делегирование — лучший способ.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494517
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes"фризы" (зависания) кстати скорее всего возникают по причине разрешения SID'а и всех связанных с ним групп, обычно на таких операциях, запросах AD и т.д. всегда всё тормозит :)

Да, лукап может занимать много времени. Для локальных учёток фризов быть не должно.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494833
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий77 Приложение запущено NetworkService(ComputerA), как ему положить файл в папку на ComputerB?
(специалистов, кот. бы мне это разжевали пока не нашлось, но подозреваю что оба компа должны быть в домене AD чтоб это в принципе работало, а я в своей частной практике доменов не держу - бухнешь сервер в домен - потом вообще ничего не работает, и назад не вернешь -поэтому все тесты в WorkGroup, последние годы и не дергаюсь).

А чё тут разжёвывать? NetworkService это локальная учётка для служб, не распространяется на другие компы. Обычно это решается через делегирование операции службе на другом компе. Или это должна быть одна учётка в домене, с привелегиями которой выполняется служба. Может помогла бы имперсонализация, но надо разбираться подробно с условиями задачи. Скорее всего делегирование — лучший способ.
Способ наладить чтоб работало как бы есть, но он кривой и требует некой "ручной предварительной операции".
Под System по крайней мере у меня получалось.
Копирование файла по сети под System аккаунтом.
>NetworkService это локальная учётка для служб, не распространяется на другие компы
От своего имени согласен, как и System она ничего не сделает.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494855
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Копирование файла по сети под System аккаунтом.

Ну не так уж прям и под System аккаунтом
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39494933
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий77 Копирование файла по сети под System аккаунтом.

Ну не так уж прям и под System аккаунтом
Я этого не говорил.
Если быть точным, под авторизованным пользователем из числа пользователей на ComputerB, куда копируем. Но заряженый "автовход" делается под System на ComputerA, откуда копируем, и поэтому System может туда копировать.
...
Рейтинг: 0 / 0
Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
    #39495278
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вы все бьетесь и бьетесь с удаленным выполнением.
Поэтому рекомендую не биться, а использовать WINRM
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Корректно проверить есть ли доступ к папке из-под аккаунта Network Service?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]