2016-04-04 22 views
0

我試圖做一個功能,以便我可以更快地查找某人的電話號碼或反向查找擴展名。get-aduser -ldapfilter這個或那個

到目前爲止,我這個保存爲PS1文件:

$find=$args[0] 
Get-ADUser -properties * -LDAPFilter "(samaccountname*$find*)" | ft samaccountname,Name,telephone number 
Get-ADUser -properties * -LDAPFilter "(telephonenumber=555 555-*$find*)" | ft samaccountname,Name,telephonenumber 

代碼工作,但顯然我得到要麼每次第一或第二個條件紅色錯誤代碼。我試過(|(This)(That)),我試過-erroraction silentlycontinue,我試過-LDAPFilter (This) -OR (That)

什麼,我最終追求的是一個功能,我可以添加到我的個人資料,這樣我可以鍵入:

lookup ABC 
lookup 2948 

,它會做一個正向查找或反向查找。它可能是一個鬆散的搜索,並在必要時返回一些太多的結果。

回答

0

重新閱讀您的問題並進行編輯。這將適用於你,你可以添加你的格式和返回的屬性,你認爲合適的。

function lookup { 
param (
[Parameter(Mandatory=$True,Position=1)] 
[string]$search 
) 

    if ($search -match '[a-z][A-Z]'){ 
     return (Get-ADUser $search -Properties TelephoneNumber).TelePhoneNumber 
    } 

    if ($search -match '[0-9]'){ 
     return Get-ADUser -Properties TelephoneNumber -Filter "TelephoneNumber -like '*$search*'" 
    } 

} 
+0

這太棒了!我修改它以添加最終的| |在第二條語句上選擇Name,以便只返回名稱。非常感謝克里斯! – davehahn

+0

@davehahn沒問題。如果在你的域中有任何奇怪的字符,它們也有數字,並且它將用戶名搜索引入到電話邏輯中,只需在第二個邏輯門中添加「-and $ search -notmatch」[a-z] [A-Z]'「即可。你不應該需要它,但以防萬一。 –

0

(|(firstClause)(secondClause))是LDAP中OR過濾器的正確語法 - 這不是你的問題。

這兩個過濾條件都包含語法錯誤。
第一個應該是(注意=):因爲只允許前導或尾隨*

(samaccountname=*$find*) 

第二個是無效的。你可以這樣做:

(telephonenumber=*$find*) 

,然後用Where-Object以適當的前綴以縮小結果爲數字:

Get-ADUser -Properties telephonenumber -LDAPFilter "(|(samaccountname*$find*)(telephonenumber=*$find*))" |Where-Object { $_.telephoneNumber -like "555 555-*"} 

要知道,領導*是可怕的慢,由於方式將這些值在Active Directory內部查找。

+0

此外,使用'-Properties *'應該因性能原因而不鼓勵。就像你需要所有的屬性一樣。他只使用'telephonenumber'所以' - 屬性telephonenumber' – Matt

+0

@Matt true,如果過濾器足夠窄但沒有壞('-Filter * -Properties *'會很糟糕) –

+0

如果有人打算使用LDAPFilter ,你不妨使用ADSI ..大聲笑! –

0

我可能會指定兩個參數和兩個單獨的參數集。例如:

# Get-User.ps1 
[CmdletBinding(DefaultParameterSetName="SamAccountName")] 
param(
    [Parameter(ParameterSetName="SamAccountName",Position=0,Mandatory=$true)] 
    [String] $SamAccountName, 
    [Parameter(ParameterSetName="TelephoneNumber",Position=0,Mandatory=$true)] 
    [String] $TelephoneNumber 
) 

$params = @{ 
    "Properties" = "*" 
    "LDAPFilter" = "" 
} 
switch ($PSCmdlet.ParameterSetName) { 
    "SamAccountName" { 
    $params.LDAPFilter = "(sAMAccountName=$SamAccountName)" 
    } 
    "TelephoneNumber" { 
    $params.LDAPFilter = "(telephoneNumber=$TelephoneNumber)" 
    } 
} 
Get-ADUser @params 

有了這個,你可以寫:

Get-User thisusername 

Get-User -TelephoneNumber thisphonenumber 

我奉勸不要使用-Properties "*"因爲這將是相當緩慢。最好指定要查看的屬性列表。

相關問題