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