physicalDeliveryOfficeName

physicalDeliveryOfficeName

很简单的问题:我不确定为什么“physicalDeliveryOfficeName”属性没有显示在我的输出中。我已经读到它是一个非标准属性,但是我找不到能够添加它的方法。除了缺少“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只是我原始文件中的占位符。

编辑

我通读了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.属性的存在

要查询属性,必须首先在目录的SCHEMA中显示该属性。 SCHEMA定义目录条目可以包含的类型和属性。在模式中,必须将此属性定义为类型中的“必须存在”或“必须存在”。例如,objectClass属性必须存在于所有类型中。

如果看一下Windows 2K8 R2的架构,我可以看到您的属性:

现在,如果我使用Apache Directory Studio,则可以看到physicalDeliveryOfficeName存在12种类型(普通服务器上有11种类型,忘记了SlxAuteur)



第一部分结论:您(如果您有足够的权限)可能会在userinetOrgPerson上设置此属性。

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
  }
}

结果如下:

备注:目录搜索为
  • 开始搜索
  • 的节点
  • 您想要的属性(不是强制性的,但这是最佳实践),如果不给它们,则不能确保已检索到它们。
  • 深度(基础,单层,子树)
  • 过滤器

  • 如果未查询属性或该属性为空,则结果中将不存在该属性

    10-02 01:36