2016-05-12 86 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