Active Directory PowerShell筛选器

时间:2016-05-12 09:59:25

标签: powershell active-directory

我在使用AD模块的PowerShell中遇到了脚本问题。

我知道关于AD命令如何接收查询的一般经验法则,所以我写了这个脚本(我认为)将与这些指南一致。

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

我基本上需要能够查询和恢复已删除的任何用户,但是它失败了:

  

错误消息:位置处的'语法错误':'1'

起初我通过过滤器发送单引号,如下所示:

{SamAccountName -like'xxx'“}

但是我现在已经解决了这个问题。

让我感到困惑的一件事是,我可以逐字地显示$ filter的结果,将它们手动复制到Get-ADObject -Filter(粘贴)并且它可以工作。因此我无法理解为什么Powershell不喜欢它..

整体错误:

  

Get-ADObject:解析查询时出错:'{SamAccountName -like“xxxx”}'   错误消息:位置处的'语法错误':'1'。在   C:\ temp \ GetDeleted.ps1:5 char:14   + Get-ADObject<<<< -filter $ filter       + CategoryInfo:ParserError:(:) [Get-ADObject],ADFilterParsing异常       + FullyQualifiedErrorId:解析查询时出错:'{SamAccountName -like“xxx”}'错误消息:'语法错误'位置:'1'。,Microsoft.ActiveD irectory.Management.Commands.GetADObject

1 个答案:

答案 0 :(得分: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