2016-05-12 2 views
0

У меня возникают проблемы со сценарием в PowerShell с использованием модуля AD.Фильтр PowerShell Active Directory

Я знаю общее правило о том, как команды 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'

Сначала я отправлял через фильтр с отдельными предложениями, как так :.

{SamAccountName -как 'ххх' "}

Однако я исправили это сейчас

Одна вещь, которая меня озадачивает, заключается в том, что я могу буквально показать результаты фильтра $, скопировать их в 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

А это значит, что даже внесение изменений вы предлагаете, это невозможно из-за того, что -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

Смежные вопросы