【问题标题】:Active Directory PowerShell FilterActive Directory PowerShell 筛选器
【发布时间】:2016-05-12 09:59:25
【问题描述】:

我在使用 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 字符:14 + 获取 ADObject

【问题讨论】:

  • -Filter 期望 either 字符串或 ScriptBlock - 不是字符串中的 ScriptBlock 定义。 $filter = {SamAccountName -like "$($entry.username)"} 就够了,不用加引号
  • 啊,这是否意味着即使做出您建议的更改也是不可能的,因为 -Filter 期望看到什么?
  • 啊,好吧,如果我去掉外部引号,那么我会得到 SamAccountName -like "$($entry.username)" ,它适用于脚本,但当然不会给我任何结果:)
  • 不,像我的例子一样保留{}
  • 抱歉,一旦我删除“”并运行脚本以输出 $Filter 它只是将命令作为结果返回给我,而不是像这样输入来自 CSV 的输出: SamAccountName -like "$ ($entry.username)" SamAccountName -like "$($entry.username)" SamAccountName -like "$($entry.username)" SamAccountName -like "$($entry.username)"

标签: powershell active-directory


【解决方案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

【讨论】:

  • 优秀的答案!我基本上得到了一份未能执行我们每天运行的报告的用户列表,我需要排除那些已被删除的用户,因为他们当然无论如何都不会工作。然而,后来发现我们无法在不恢复 AD 对象的情况下删除报告,否则我们在报告工具中遇到错误。我在您的帮助下编写了此还原脚本,删除了报告,然后再次重新删除了 AD 对象。
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 2022-01-04
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2020-06-28
  • 2023-01-19
相关资源
最近更新 更多