2011-04-29 1 views
1

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

$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 
    } 
    } 
} 
+0

Почему бы не использовать AD или Командиры QuestAD? AD: – Tom

+0

@Tom - Это был мой первый раз с Powershell, поэтому я не знаком с Quest AD. Я обязательно проверю это. –

+0

Это того стоит. Эти командлеты довольно прямолинейны. Например: AD: получить-ADUser -Filter * -свойства сп, отдел, physicaldeliveryofficename Quest: Get-qaduser -includedproperties сп, отдел physicaldeliveryofficename – Tom

ответ

3

Многое должно быть сказано там.

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

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

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

enter image description here

Теперь, если я использую Apache каталог Studio I можно увидеть, что 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","[email protected]","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"])","[email protected]","blabla") 
    $dnUser.put("physicalDeliveryOfficeName", "1 rue de la source") 
    $res = $dnUser.setinfo() 
    $res 
    } 
} 

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

enter image description here

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

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

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

+0

Похоже, что я отсутствовал явный груз свойств мне нужно. Просмотрите мое редактирование для моего рабочего примера. –

Смежные вопросы