2016-05-12 18 views
0

Ich habe Probleme mit einem Skript in Powershell mit AD-Modul.Active Directory PowerShell Filter

Ich kenne die allgemeine Faustregel, wie AD-Befehle seine Abfragen erhalten möchten, also habe ich dieses Skript geschrieben (was ich dachte) würde inline mit diesen Richtlinien fallen.

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

Ich muß grundsätzlich in der Lage sein, eine der Benutzer abfragen und wiederherstellen, die gelöscht wurden aber es scheitert mit:

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

Zuerst war ich mit einzelnen Zitaten durch die Filter zu senden, wie so :.

{SamAccountName -like 'xxx' "}

jedoch habe ich das jetzt behoben haben

Eine Sache, die mich verwirrt, ist, dass ich die Ergebnisse von $ filter buchstäblich anzeigen kann, kopiere sie auf Get-ADObject -Filter (einfügen) manuell und es funktioniert. Deshalb kann ich nicht verstehen, warum Powershell nicht gefällt ..

Whole Fehler:

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' erwartet * entweder * ein String oder ein Script - kein Script Definition in einer Zeichenkette. '$ filter = {SamAccountName -like" $ ($ entry.username) "}' ist ausreichend, keine Notwendigkeit für Anführungszeichen –

+0

Ah ok heißt das, dass selbst die Änderungen, die Sie vorschlagen, nicht möglich sind, wegen was -Filter erwartet zu sehen? – CharlesH

+0

Ah ok also, wenn ich die äußeren Anführungszeichen wegnehme, dann bekomme ich SamAccountName - wie "$ ($ entry.username)" was am Skript funktioniert aber natürlich gibt mir keine Ergebnisse :) – CharlesH

Antwort

1

Eine Möglichkeit, es zu tun dies

ist
$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 kann natürlich modifiziert zu passen Ihre braucht besser. Sie werden jedoch immer noch die Herausforderung haben, zu entscheiden, welches der gefundenen Objekte für den angegebenen sAMAccountName wiederhergestellt werden soll. Dies liegt daran, dass sich bestimmte Objekte mehrmals im gelöschten Zustand befinden können. Eine Möglichkeit, dies zu lösen, besteht möglicherweise darin, das Objekt mit dem neuesten WhenCreated-Attributwert wiederherzustellen.

Auch ich bin mir nicht sicher, welche Motivation Sie haben, Filter vorher zu bauen. Es kann nützlich sein, wenn Sie im Hintergrund für verschiedene Attributwerte eingebaut haben, aber das scheint in Ihrem Beispiel nicht der Fall zu sein. So Einfachheit halber kann es auch entfernt werden und enthalten direkt in Get-ADObject Anruf wie diese

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

Ausgezeichnete Antwort! Ich habe im Grunde eine Liste von Benutzern erhalten, die einen Bericht, den wir täglich ausführen, nicht ausführen konnten, und ich musste die Benutzer ausschließen, die gelöscht wurden, weil sie natürlich nicht funktionieren würden. Es stellte sich jedoch heraus, dass wir die Berichte nicht löschen konnten, ohne die AD-Objekte wiederherzustellen, da sonst ein Fehler im Berichtstool auftrat. Ich habe es mit Ihrer Hilfe geschafft, diese Wiederherstellung zu skripten, die Berichte zu löschen und dann die AD-Objekte erneut zu löschen. – CharlesH