Get-AdComputer -filter参数不接受Get-Date输出

时间:2013-03-06 11:52:46

标签: powershell parameters filter active-directory cmdlet

我偶然发现了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本身(这是我们都必须忍受的事情)。

3 个答案:

答案 0 :(得分:2)

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

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

$date = (get-date).AddDays(-100)
Get-ADComputer -Filter {(enabled -eq "true") -and (lastLogonTimestamp -gt  $date)} ...

答案 1 :(得分:0)

很抱歉,响应时间非常延迟,我经常遇到相同的问题,并且不得不回来再弄清楚,但这只是一个衬砌,而不是绕过此模块的“表达式/值”语法要求。希望它能对其他人有所帮助,即使不是原始的海报。

尝试一下。

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

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

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

享受!