2

我在 PowerShell 脚本中偶然发现了一个奇怪的错误,该脚本为我返回特定 OU(和子 OU)中 Active Directory 中的计算机,这些计算机在特定日期内启用并登录。

以下代码段确实有效:

$date = (get-date).AddDays(-100)
Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt  $date)} -Properties lastLogonTimestamp -SearchBase "CN=Computers,DC=some,DC=domain,DC=com"

...但是我最初尝试这样做是一行:

Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt  $((get-date).AddDays(-100)))} -Properties lastLogonTimestamp -SearchBase "CN=Computers,DC=some,DC=domain,DC=com"

...但我反复收到以下错误(这让我尝试了上面的两行示例):

Get-ADComputer : Cannot process argument because the value of argument "path" is not valid. Change the value of the "path" argument and run the operation again.
At line:1 char:1
+ Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt  $((ge ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-ADComputer], PSArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.Management.Automation.PSArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADComputer

我已经在 Windows 8 和 Windows Server 2008 R2 上运行了该脚本 - 两者都使用 PowerShell v3。我假设两个操作系统上的 RSAT 工具安装的 Active Directory 模块的版本也可能略有不同。

数据方面,我已经得到了我需要的东西,但我很难理解为什么单线器不起作用。Get-Date 或 Get-AdComputer cmdlet 都不需要参数“path”,但作为尝试,我还确保我的工作目录是 C:。

我很感兴趣是否有人能够提供一些关于为什么会这样的见解 - 我之前在非 ActiveDirectory 模块 cmdlet 中使用过这种类型的语法,所以我倾向于假设因为查询在“过滤器”参数可能会错误地传递给 Get-AdComputer cmdlet 本身(这是我们所有人都必须忍受的东西)。

4

3 回答 3

2

过滤器组件的右侧必须是一个值,而不是一个表达式。

解决方案(正如您已经发现的那样)是将表达式产生的值分配给一个变量,并在过滤器的右侧使用该变量:

$date = (get-date).AddDays(-100)
Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt  $date)} ...
于 2013-03-06T12:27:22.810 回答
0

对于非常延迟的响应,我很抱歉,我经常遇到同样的问题,并且不得不回来解决这个问题,但这是一个比将绕过此模块的“表达式/值”语法要求的单行程序。如果不是原始海报,希望它会帮助其他人。

试试这个。

get-adcomputer -filter "lastlogondate -le '$((get-date).adddays(-14))'"

我的理解是在这些地方使用引号会强制内联表达式的评估,并在将过滤器表达式传递给原始 cmdlet 之前插入值。有人可以根据需要更正此解释。

于 2018-07-05T15:19:05.283 回答
0

多年来一直试图在一行中做到这一点;正如 BTag 所说,您需要使用双引号来指定过滤器,以便它替换字符串;我还发现您必须使用 DateTime ToFileTime 方法来确保 DateTime 对象作为 Get-ADComputer -Filter 需要的 LDAP FileTime 滴答时间格式发送:

Get-ADComputer -Filter "enabled -eq 'true' -and lastLogonTimestamp -gt '$((Get-Date).AddDays(-90).ToFileTime())'" -Properties LastLogonTimeStamp -SearchBase "CN=Computers,DC=some,DC=domain,DC=com"

享受!

于 2020-04-22T12:23:23.330 回答