Powershell LDAP - физическое имя доставки не отображается - PullRequest
1 голос
/ 30 апреля 2011

Довольно простой вопрос: я не уверен, почему в моем выводе не отображается свойство «физическое_доставка_набора». Я читал, что это нестандартное свойство, но я не смог найти способ добавить его. Все работает отлично, за исключением отсутствующего «физического имени доставки». Спасибо за помощь!

$Dom = 'LDAP://OU=XX;DC=XX;DC=local'
$Root = New-Object DirectoryServices.DirectoryEntry $Dom 
$selector = New-Object DirectoryServices.DirectorySearcher
$selector.SearchRoot = $root 
$selector.pagesize = 1000
$adobj= $selector.findall() | where {$_.properties.objectcategory -match "CN=Person"} 

(Get-Content c:\FILENAME.txt) | Foreach-Object `
{ `
  foreach ($person in $adobj){ 
  $prop=$person.properties
  if ($prop.cn -like "*" + $_.substring(1, 3) + "*")
    {
     $s1 = $_ -replace $_.substring(0, 4), $prop.cn 
     $s2 = $s1 -replace "AD_DEPT", $prop.department
     $s3 = $s2 -replace "AD_BRANCH", $prop.physicalDeliveryOfficeName 
     add-content C:\FILENAME2.txt $s3
    }
  }
}

AD_DEPT и AD_BRANCH - просто заполнители в моем исходном файле.

EDIT

Я прочитал ответ JPBlanc, провел еще несколько исследований и закончил этим рабочим примером. Кажется, ключ в указании свойств для загрузки. Спасибо!

$strFilter = "(&(objectClass=Person)(department=*))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objOU = New-Object System.DirectoryServices.DirectoryEntry("LDAP://OU=XX;DC=XX;DC=local")
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objOU
$objSearcher.PageSize = 1000

$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "OneLevel"

$colProplist = "cn","department","physicaldeliveryofficename"
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

$colResults = $objSearcher.FindAll()

remove-item \\SERVER\FTPROOT\FOLDER\FILENAME.MODIFIED
(Get-Content \\SERVER\FTPROOT\FOLDER\FILENAME) | Foreach-Object `
{ `
  foreach ($person in $colResults){ 
  $prop = $person.properties
  if ($prop.cn -like "*" + $_.substring(1, 3) + "*")
    {
     $s1 = $_ -replace $_.substring(0, 4), $prop.cn 
     $s2 = $s1 -replace "AD_DEPT", $prop.department
     $s3 = $s2 -replace "AD_BRANCH", $prop.physicaldeliveryofficename 
     add-content \\SERVER\FTPROOT\FOLDER\FILENAME.MODIFIED $s3
     break
    }
  }
}

1 Ответ

3 голосов
/ 30 апреля 2011

Многое нужно сказать там.

1.Наличие атрибута

Для запроса атрибута он должен сначала присутствовать в СХЕМЕ вашего каталога.SCHEMA определяет типы и атрибуты, которые могут содержать записи каталога.В схеме этот атрибут должен быть определен как «МОЖЕТ быть» или «ДОЛЖЕН быть» представлен в типе.Например, атрибут objectClass ДОЛЖЕН присутствовать во всех типах.

Если я взгляну на схему моего Windows 2K8 R2, я смогу увидеть ваш атрибут:

enter image description here

Теперь, если я использую Apache Directory Studio, я вижу, что physicalDeliveryOfficeName присутствует в 12 типах (11 на обычном сервере, забудьте SlxAuteur)

enter image description here

Заключениеэтой первой части : Вы, вероятно, (если у вас достаточно прав) установите этот атрибут на user или inetOrgPerson.

2.Способ поиска атрибута

Здесь вы найдете пример использования искателя каталогов.Я добавляю код для изменения атрибута physicalDeliveryOfficeName для указанного пользователя.

$dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://192.168.183.138:389/dc=societe,dc=fr","administrateur@societe.fr","blabla")

# Look for users
$Rech = new-object System.DirectoryServices.DirectorySearcher($dn)
$rc = $Rech.filter = "((objectCategory=person))"
$rc = $Rech.SearchScope = "subtree"
$rc = $Rech.PropertiesToLoad.Add("distinguishedName");
$rc = $Rech.PropertiesToLoad.Add("sAMAccountName");  
$rc = $Rech.PropertiesToLoad.Add("ipphone");  
$rc = $Rech.PropertiesToLoad.Add("telephoneNumber");
$rc = $Rech.PropertiesToLoad.Add("memberOf");
$rc = $Rech.PropertiesToLoad.Add("distinguishedname");
$rc = $Rech.PropertiesToLoad.Add("physicalDeliveryOfficeName"); # Your attribute


$liste = $Rech.findall()
foreach ($usr in $liste) 
{
  # Write-Host $usr.Properties["samaccountname"]
  if ($usr.Properties["samaccountname"] -eq "massin")
  {
    Write-Host $usr.Properties["distinguishedname"]
    $dnUser = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://192.168.183.138:389/$($usr.Properties["distinguishedname"])","administrateur@societe.fr","blabla")
    $dnUser.put("physicalDeliveryOfficeName", "1 rue de la source")
    $res = $dnUser.setinfo()
    $res
  }
}

Вот результат:

enter image description here

Примечания: поиск в каталоге

  1. Узел, с которого начинается поиск
  2. требуемых атрибутов (это не обязательно, но рекомендуется), если вы их не дадите, вы НЕ МОЖЕТЕ быть уверены, что онинайдено.
  3. Глубина (базовое, одноуровневое, поддерево)
  4. Фильтр

Если атрибут не запрошен или является пустым, он не будет присутствовать врезультат

...