none
get-acl | Get-LocalGroupMember или get-adgroupmember

    Вопрос

  • надо узнать, какие пользователи имеют доступ к каким папкам. Понял, что лучше любимого PowerShell ничего нет... Но вот не могу продвинуться в некоторых вопросах.

    PS P:\> (get-acl T:\IT).access.IdentityReference
    
    Value
    -----
    NT AUTHORITY\SYSTEM
    BUILTIN\Administratoren
    D_ONE\Domain Admins
    D_ONE\Domain Users
    D_ONE\IT_drive
    D_TWO\Administrator
    D_TWO\Domänen-Admins
    D_TWO\Domänen-Benutzer
    D_TWO\IT_drive
    PS P:\> $acl = (get-acl T:\IT).access.IdentityReference
    PS P:\> $acl[3]
    
    Value
    -----
    D_ONE\Domain Admins

    так вот, если это $acl засунуть в цикл, то группы не находятся:

    foreach ($acl in $acl) {Get-ADGroupMember $acl}

    PS P:\> Get-ADGroupMember "D_ONE\Domain Admins"
    Get-ADGroupMember : in "DC=D_ONE,DC=local" no Object with ID "D_ONE\Domain Admins" was found.

    - Как удалить "D_ONE" при выводе команды get-acl?
    - Как сделать следущее:
    если $acl = "D_ONE/*" то выполнить "команда 1 $acl(без "D_ONE")
    если $acl = "D_TWO/*" то выполнить "команда 2 $acl(без "D_TWO")

    Спасибо!

Ответы

  • добился следующего:

    $acls = (get-acl T:\Construction).access.IdentityReference
    foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) )
    {
        $group = $($acl -split '\\')
            foreach ($group in $group)
            {
            $group
            Get-ADGroupMember -Identity $group | ft -Property name
            }
    }

    Выводит членов всех групп, но только одного домена (это понятно), но у меня идёт проверка не просто по именам групп, но и лишним именам, которые остались от разделения:

    D_ONE

    Get-ADGroupMember: no object with ID "D_ONE" can be found under "DC=D_ONE,DC=local


    IT_drive

    name               
    ----               
    C******
    J******
    S******
    R******

    Как правильно не просто разделить D_ONE\IT_drive, а использовать только IT_drive в дальнейшем?

    А ещё лучше, как переменной $A присвоить значение всё что до "\", а переменной $B присвоить значение всё что после "\"?

    1 $group in $group неправильная конструкция и я выше об этлм уже писал на примере $acl in $acl

    то что слева от in это название переменной содержащей 1 элемент, а то что справа должно быть массивом

    2 $a = $($acl -split '\\')[0]

    $b = $($acl -split '\\')[1]

    только создание таких переменных не оправдано будет скорее всего, так как вы вместо них и так можете использовать конструкции по правую сторону от равно


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа Anahaym 25 мая 2019 г. 13:50
    Модератор

Все ответы

  • Вариант в том виде как спрашиваете:

    $acls = (get-acl T:\IT).access.IdentityReference
    foreach ($acl in $acls){
    switch -regex ($acl.value){
    '^D_ONE.+' {Get-ADGroupMember $($acl.value -replace '^[^\\]+\\' -Domain)}
    '^D_TWO.+' {...}
    }
    }

    Более простой метод:

    $acls = (get-acl T:\IT).access.IdentityReference
    foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) ){
    Get-ADGroupMember $($acl -split '\\')[1] -Domain $($acl -split '\\')[0]
    }


    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Vector BCOModerator 23 мая 2019 г. 17:14
    • Отменено предложение в качестве ответа Anahaym 24 мая 2019 г. 11:53
    Модератор
  • надо узнать, какие пользователи имеют доступ к каким папкам. Понял, что лучше любимого PowerShell ничего нет... Но вот не могу продвинуться в некоторых вопросах.

    PS P:\> (get-acl T:\IT).access.IdentityReference
    
    Value
    -----
    NT AUTHORITY\SYSTEM
    BUILTIN\Administratoren
    D_ONE\Domain Admins
    D_ONE\Domain Users
    D_ONE\IT_drive
    D_TWO\Administrator
    D_TWO\Domänen-Admins
    D_TWO\Domänen-Benutzer
    D_TWO\IT_drive
    PS P:\> $acl = (get-acl T:\IT).access.IdentityReference
    PS P:\> $acl[3]
    
    Value
    -----
    D_ONE\Domain Admins

    так вот, если это $acl засунуть в цикл, то группы не находятся:

    foreach ($acl in $acl) {Get-ADGroupMember $acl} # $acl in $acl будет плохо работать + стоит обращатся к конкретному свойству .Value

    PS P:\> Get-ADGroupMember "D_ONE\Domain Admins"
    Get-ADGroupMember : in "DC=D_ONE,DC=local" no Object with ID "D_ONE\Domain Admins" was found.

    - Как удалить "D_ONE" при выводе команды get-acl?
    - Как сделать следущее:
    если $acl = "D_ONE/*" то выполнить "команда 1 $acl(без "D_ONE")
    если $acl = "D_TWO/*" то выполнить "команда 2 $acl(без "D_TWO")

    Спасибо!



    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Добрый день, 

    как ваши успехи?


    The opinion expressed by me is not an official position of Microsoft


    Модератор
  • Пока не проверял... как проверю, отпишусь. 

    Спасибо

  • Вариант в том виде как спрашиваете:

    $acls = (get-acl T:\IT).access.IdentityReference
    foreach ($acl in $acls){
    switch -regex ($acl.value){
    '^D_ONE.+' {Get-ADGroupMember $($acl.value -replace '^[^\\]+\\' -Domain)}
    '^D_TWO.+' {...}
    }
    }

    Более простой метод:

    $acls = (get-acl T:\IT).access.IdentityReference
    foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) ){
    Get-ADGroupMember $($acl -split '\\')[1] -Domain $($acl -split '\\')[0]
    }


    The opinion expressed by me is not an official position of Microsoft

    в обоих случаях ругается на "-Domain"

    Unexpected token '-Domain' in expression or statement.
  • Вариант в том виде как спрашиваете:

    $acls = (get-acl T:\IT).access.IdentityReference
    foreach ($acl in $acls){
    switch -regex ($acl.value){
    '^D_ONE.+' {Get-ADGroupMember $($acl.value -replace '^[^\\]+\\' -Domain)}
    '^D_TWO.+' {...}
    }
    }

    Более простой метод:

    $acls = (get-acl T:\IT).access.IdentityReference
    foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) ){
    Get-ADGroupMember $($acl -split '\\')[1] -Domain $($acl -split '\\')[0]
    }


    The opinion expressed by me is not an official position of Microsoft

    в обоих случаях ругается на "-Domain"

    Unexpected token '-Domain' in expression or statement.

    это был пример написанный на телефоне без использования справки

    суть примера была показать 2 метода использования вашего вывода как вход для других комманд справку по которым вы без труда найдете в help get-adgroupmember -full

    возможно вместо несуществующего -domain вам подойдет -server, но уверенности нет

    так же предположу чьюто ключ -recursive вам может пригодиться


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • немного изменил скрипт, но он почему-то отказывается воспринимать имена группы:

    $acls = (get-acl T:\IT).access.IdentityReference foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) ){ Get-ADGroupMember -Identity $($acl -split '\\')[0] $($acl -split '\\')[1] }

    Get-ADGroupMember : A positional parameter cannot be found that accepts argument "IT_drive".

    при этом, если запустить команду отдельно с этой группой - всё работает:

    Get-ADGroupMember -Identity IT_drive
    
    distinguishedName : CN=Aleksandr ..........

    • Изменено Anahaym 25 мая 2019 г. 11:56
  • добился следующего:

    $acls = (get-acl T:\Construction).access.IdentityReference
    foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) )
    {
        $group = $($acl -split '\\')
            foreach ($group in $group)
            {
            $group
            Get-ADGroupMember -Identity $group | ft -Property name
            }
    }

    Выводит членов всех групп, но только одного домена (это понятно), но у меня идёт проверка не просто по именам групп, но и лишним именам, которые остались от разделения:

    D_ONE

    Get-ADGroupMember: no object with ID "D_ONE" can be found under "DC=D_ONE,DC=local


    IT_drive

    name               
    ----               
    C******
    J******
    S******
    R******

    Как правильно не просто разделить D_ONE\IT_drive, а использовать только IT_drive в дальнейшем?

    А ещё лучше, как переменной $A присвоить значение всё что до "\", а переменной $B присвоить значение всё что после "\"?

    • Изменено Anahaym 25 мая 2019 г. 13:13
  • добился следующего:

    $acls = (get-acl T:\Construction).access.IdentityReference
    foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) )
    {
        $group = $($acl -split '\\')
            foreach ($group in $group)
            {
            $group
            Get-ADGroupMember -Identity $group | ft -Property name
            }
    }

    Выводит членов всех групп, но только одного домена (это понятно), но у меня идёт проверка не просто по именам групп, но и лишним именам, которые остались от разделения:

    D_ONE

    Get-ADGroupMember: no object with ID "D_ONE" can be found under "DC=D_ONE,DC=local


    IT_drive

    name               
    ----               
    C******
    J******
    S******
    R******

    Как правильно не просто разделить D_ONE\IT_drive, а использовать только IT_drive в дальнейшем?

    А ещё лучше, как переменной $A присвоить значение всё что до "\", а переменной $B присвоить значение всё что после "\"?

    1 $group in $group неправильная конструкция и я выше об этлм уже писал на примере $acl in $acl

    то что слева от in это название переменной содержащей 1 элемент, а то что справа должно быть массивом

    2 $a = $($acl -split '\\')[0]

    $b = $($acl -split '\\')[1]

    только создание таких переменных не оправдано будет скорее всего, так как вы вместо них и так можете использовать конструкции по правую сторону от равно


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа Anahaym 25 мая 2019 г. 13:50
    Модератор
  • 1 $group in $group неправильная конструкция и я выше об этлм уже писал на примере $acl in $acl

    то что слева от in это название переменной содержащей 1 элемент, а то что справа должно быть массивом

    возможно, но как я уже говорил - оно тоже работает потому, что то, что слева потом не будет использоваться.

    только создание таких переменных не оправдано будет скорее всего, так как вы вместо них и так можете использовать конструкции по правую сторону от равно

    не, всё круто! как я писал выше - конструкции справа не работали. А теперь, имея на руках переменные "$a" и "$b" я могу делать очевидные (для меня) условия:
    if $a = "D_ONE" do Get-ADGroupMember -Identity $b | ft -Property name
    if $a = "D_TWO" do Get-ADGroupMember -Identity $b -Server vdc03.d_two.local | ft -Property name

    пока итог такой:

    $acls = (get-acl T:\Construction).access.IdentityReference
    foreach ($acl in $($acls.Value | Where {$_ -notmatch 'BUILTIN\\'}) )
    {
        $a = $($acl -split '\\')[0]
        $b = $($acl -split '\\')[1]
            foreach ($b in $b)
            {
            $b
            Get-ADGroupMember -Identity $b | ft -Property name
            }
    }

    Вывод:

    IT_drive
    
    name               
    ----               
    C******
    J******
    S******
    R******
    
    и другие группы

    К сожалению, пока есть дубликаты групп, но это не критично.

    Спасибо!


    • Изменено Anahaym 25 мая 2019 г. 14:02
  • дело ваше :)

    к необходимостям оптимизаций приходиш со временем


    The opinion expressed by me is not an official position of Microsoft

    Модератор