2016-05-12 11 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'は文字列内のScriptBlock定義ではなく、文字列かScriptBlockを期待しています。 '$ filter = {SamAccountName-like" $($ entry.username) "}'で十分です。その周りに引用符を入れる必要はありません –

+0

これは、フィルタを変更しても、見ることを期待していますか? – CharlesH

+0

ああ、私が外側の引用符を取り除くと、スクリプトで動作するSamAccountNameのような "$($ 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はもちろん、あなたに合わせて変更することが可能ですより良い必要があります。しかし、あなたが直面する課題の1つは、指定されたsAMAccountNameのどのオブジェクトが復元されるべきかを決めることです。これは、任意のオブジェクトが削除された状態に複数回存在する可能性があるためです。おそらく、それを解決する1つの方法は、最新の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