很简单的问题:我不确定为什么“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)
第一部分结论:您(如果您有足够的权限)可能会在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
}
}
结果如下:
备注:目录搜索为
如果未查询属性或该属性为空,则结果中将不存在该属性