2016-05-12 84 views
0

我在使用AD模塊的PowerShell中遇到腳本問題。Active Directory PowerShell篩選器

我知道AD命令如何接收查詢的一般經驗法則,所以我寫了這個腳本(我認爲)會符合這些準則。

$CSV=Import-Csv "c:\temp\deleteduserlist.csv" 
foreach ($entry in $CSV) 
{ 
    $filter = "{SamAccountName -like ""$($entry.username)""}" 
    Get-ADObject -filter $filter 
} 

基本上,我需要能夠查詢並恢復所有已刪除用戶的但它失敗:

Error Message: 'syntax error' at position: '1'

起初我通過與單引號,像這樣的過濾器發送:

{SAM帳戶名狀 'XXX'「}

不過我已經解決了這個問題,現在

讓我困惑的一件事是,我可以從字面上顯示$ filter的結果,將它們手動複製到Get-ADObject -Filter(粘貼),並且它可以正常工作。因此,我不明白爲什麼PowerShell不喜歡它..

所有錯誤:

Get-ADObject : Error parsing query: '{SamAccountName -like "xxxx"}' Error M essage: 'syntax error' at position: '1'. At C:\temp\GetDeleted.ps1:5 char:14 + Get-ADObject <<<< -filter $filter + CategoryInfo : ParserError: (:) [Get-ADObject], ADFilterParsing Exception + FullyQualifiedErrorId : Error parsing query: '{SamAccountName -like "xxx "}' Error Message: 'syntax error' at position: '1'.,Microsoft.ActiveD irectory.Management.Commands.GetADObject

+0

直接計入'-Filter'期待* *任意字符串或腳本塊 - 不是在字符串中的腳本塊定義。 '$ filter = {SamAccountName -like「$($ entry.username)」}'就足夠了,不需要在它周圍引用 –

+0

好吧,這是否意味着即使進行更改,您建議這是不可能的,因爲什麼-Filter期待看到? – CharlesH

+0

啊好吧,如果我拿走外部引號,那麼我得到SamAccountName-like「$($ entry.username)」,這對腳本起作用,但當然給我沒有結果:) – CharlesH

回答

1

一種方式來做到這一點是這個

$CSV=Import-Csv "c:\temp\deleteduserlist.csv" 
foreach ($entry in $CSV) { 
    ## Set username to entry from csv file 
    $directory_username = $entry.username 

    ## Build search filter before using it, interested in username and deleted objects 
    $directory_filter = {(SamAccountName -like $directory_username) -and (Deleted -eq $true)} 

    ## Search for ADObject based on filter and deleted objects explicitely included in the search 
    $directory_found_object = Get-ADObject -Filter $directory_filter -IncludeDeletedObjects -Properties sAMAccountName, Deleted 
    foreach ($directory_object in $directory_found_object) { 
     ### Execute required action on each found $directory_object 
     ### Perhaps pipe $directory_object | Restore-ADObject with appropriate attribute values for restore 
    } 
} 

$ directory_filter當然也可以修改,以適應您的需要更好。然而,你將面臨的一個挑戰仍然是決定哪些找到的給定sAMAccountName對象應該被恢復。這是因爲任何給定的對象可以多次處於刪除狀態。解決這個問題的一種方法是使用最新的WhenCreated屬性值恢復對象。

另外我不確定你有什麼動機必須事先建立過濾器。如果你爲不同的屬性值進行動態創建,這可能很有用,但在你的例子中似乎不是這種情況。因此,爲了簡單起見,可以也被刪除,並在GET-ADObject呼叫這樣

$directory_found_object = Get-ADObject -Filter {(SamAccountName -like $directory_username) -and (Deleted -eq $true)} -IncludeDeletedObjects -Properties sAMAccountName, Deleted 
+0

優秀的答案!我基本上有一個用戶列表,他們沒有執行我們每天運行的報告,我需要排除那些已被刪除的用戶,因爲他們當然不管用。然而,然後它發現我們不能刪除報告而不恢復AD對象,否則我們在報告工具中出現錯誤。我在您的幫助下管理腳本的恢復,刪除報告,然後再次重新刪除AD對象。 – CharlesH