Выходной фильтр Windows "Чистая группа / домен"

Мне нужно захватить членов в определенной группе AD и добавить их в массив. С помощью net group Я могу легко получить членов группы AD. Тем не менее, я не знаком с фильтром на Windows. Я просто хочу получить имя пользователя из вывода.

Проверка имени группы
Комментарий

члены

-------------------------------------------------- -------------------
Майк Том Джеки
Рик Джейсон Ник
Команда выполнена успешно.

Я не могу использовать Get-ADGroupMember Команда с помощью PowerShell. Если есть способ получения данных и фильтрации с помощью PowerShell, это тоже нормально.

2 ответа

Что ж, хорошая новость заключается в том, что в PowerShell редко есть только один способ сделать что-то. Вот часть более крупного сценария, который у меня есть для некоторых групповых вещей, где у меня не всегда есть доступный модуль AD (например, на серверах, которыми владеют другие команды):

$Identity = 'test'
$LDAP = "dc="+$env:USERDNSDOMAIN.Replace('.',',dc=')
$Filter = "(&(sAMAccountName=$Identity)(objectClass=group))"
$Searcher = [adsisearcher]$Filter
$Searcher.SearchRoot = "LDAP://$LDAP"
'Member','Description','groupType' | %{$Searcher.PropertiesToLoad.Add($_)|Out-Null}

$Results=$Searcher.FindAll()

$GroupTypeDef = @{
    1='System'
    2='Global'
    4='Domain Local'
    8='Universal'
    16='APP_BASIC'
    32='APP_QUERY'
    -2147483648='Security'
}

If($Results.Count -gt 0){
    $Group = New-Object PSObject @{
        'DistinguishedName'=[string]$Results.Properties.Item('adspath') -replace "LDAP\:\/\/"
        'Scope'=$GroupTypeDef.Keys|?{$_ -band ($($Results.properties.item('GroupType')))}|%{$GroupTypeDef.get_item($_)}
        'Description'=[string]$Results.Properties.Item('description')
        'Members'=[string[]]$Results.Properties.Item('member')|% -Begin {$Searcher.PropertiesToLoad.Clear();$Searcher.PropertiesToLoad.Add('objectClass')|Out-Null} {$Searcher.Filter = "(distinguishedName=$_)";[PSCustomObject][ordered]@{'MemberType'=$Searcher.FindAll().Properties.Item('objectClass').ToUpper()[-1];'DistinguishedName'=$_}}
    }
    $Group|Select DistinguishedName,Scope,Description
    $Group.Members|FT -AutoSize
}
Else{"Unable to find group '$Group' in '$env:USERDNSDOMAIN'.`nPlease check that you can access that domain from your current domain, and that the group exists."}

Вот один из способов получить прямых членов группы AD без использования командлетов AD:

param(
  [parameter(Mandatory=$true)]
    $GroupName
)

$ADS_ESCAPEDMODE_ON   = 2
$ADS_SETTYPE_DN       = 4
$ADS_FORMAT_X500      = 5

function Invoke-Method {
  param(
    [__ComObject] $object,
    [String] $method,
    $parameters
  )
  $output = $object.GetType().InvokeMember($method, "InvokeMethod", $null, $object, $parameters)
  if ( $output ) { $output }
}
function Set-Property {
  param(
    [__ComObject] $object,
    [String] $property,
    $parameters
  )
  [Void] $object.GetType().InvokeMember($property, "SetProperty", $null, $object, $parameters)
}

$Pathname = New-Object -ComObject "Pathname"
Set-Property $Pathname "EscapedMode" $ADS_ESCAPEDMODE_ON

$searcher = [ADSISearcher] "(&(objectClass=group)(name=$GroupName))"
$searcher.PropertiesToLoad.AddRange(@("distinguishedName"))

$searchResult = $searcher.FindOne()
if ( $searchResult ) {
  $groupDN = $searchResult.Properties["distinguishedname"][0]
  Invoke-Method $Pathname "Set" @($groupDN,$ADS_SETTYPE_DN)
  $path = Invoke-Method $Pathname "Retrieve" $ADS_FORMAT_X500
  $group = [ADSI] $path
  foreach ( $memberDN in $group.member ) {
    Invoke-Method $Pathname "Set" @($memberDN,$ADS_SETTYPE_DN)
    $path = Invoke-Method $Pathname "Retrieve" $ADS_FORMAT_X500
    $member = [ADSI] $path
    "" | Select-Object `
      @{
        Name="group_name"
        Expression={$group.name[0]}
      },
      @{
        Name="member_objectClass"
        Expression={$member.ObjectClass[$member.ObjectClass.Count - 1]}
      },
      @{
        Name="member_sAMAccountName";
        Expression={$member.sAMAccountName[0]}
      }
  }
}
else {
  throw "Group not found"
}

Эта версия использует COM-объект Pathname для обработки экранирования имени и выводит класс объекта и sAMAccountName для каждого члена группы.

Другие вопросы по тегам