服务器返回以下错误:无效的枚举上下文

服务器返回以下错误:无效的枚举上下文

这是我正在使用的命令...有人能帮我吗..

Get-ADComputer -Filter * -Searchbase "OU=IN0010,OU=BU-L04-Glass,OU=CIN,OU=L00-SGTS-USS,DC=zl,DC=if,DC=atcsg,DC=net" -Properties * | 排序 LastLogon | 选择名称、LastLogonDate、@{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}} | export-csv -path c:\Temp\ADComputer.csv -NoTypeInformation

答案1

让我们详细分析一下:

  1. LastLogon不会在 DC 之间复制 - 它是该帐户的每个 DC 的唯一时间戳。如果计算机从未登录过您的查询所针对的 DC,则不会填充该属性。如果它主要登录到不同的 DC,则日期可能不准确。相反,如果您只是想知道计算机是否“最近”登录过,请查询LastLogonTimeStampLastLogonDate- 请参阅下面的注释。

  2. 当您想了解查询正在做什么时,不要只是将其全部扔进管道并输出到 CSV。除非您喜欢不知道发生了什么并打开一个空的 CSV 文件,否则请先运行简单的命令来了解输出并确保在输出到文件之前获得正确的结果。请参阅下面的示例。

  3. 如果您需要的只是LastLogonLastLogonDate和计算机名称,不要使用-Properties *。您的查询将花费更长的时间,因为您实际上是在拖回计算机帐户中的所有数据。如果您在 AD 中的计算机对象中存储了证书,则每个对象的数据量可能是 KB。如果您只需要两个属性,则只需选择它们:Get-ADComputer -filter '*' -properties Name,LastlogonDate。数据大小的示例在最后。

LastLogonTimeStamp 与 LastLogonDate

不同于LastLogonLastLogonTimeStamp 在所有 DC 之间复制,但仅精确到 14 天前。LastLogonDate与 相同LastLogonTimeStamp,但它是一个计算[DateTime]属性(它不存储在 LDAP 中,而是在查询时计算)。因为它是[DateTime],所以更容易排序和过滤。

如果是 14 天或更短时间,则在一个或多个 DC 上可能LastLogonTimeStamp存在该机器的更新时间。如果您需要更精确的时间,则需要查询所有 DC上的所有计算机帐户,然后比较哪个具有最新的日期。但对于典型的报告目的,例如如果您正在审核可能“过时”的机器帐户,通常就可以了。LastLogonLastLogonLastLogonDate

參閱本文了解更多信息。

了解 AD/LDAP 查询结果

当您不确定结果是什么样子时,请不要将它们输出到文件中。要了解命令的作用,请尝试一个简单的过滤器并让它输出到控制台。然后根据需要优化查询。如果您需要在获得结果后处理数据,请一步一步地进行,并在添加更多结果之前检查结果。我已经使用 Powershell 15 年了,我仍然是这样开始的——在执行下一步过滤和处理数据之前先检查结果。

尝试以下示例,显然要用您环境中的正确名称替换 OU 和计算机名称(顺便说一句,不要在您的问题中透露真实姓名。)

# List all the computers in the OU with default properties that Get-AdComputer outputs - this does not include LastLogonDate etc
# e.g. name, distinguishedName, enabled, objectype etc... 
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net"

# Show -all- properties from a computer named "MyComputer"
Get-ADComputer -Filter 'name -eq "Mycomputer"' -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties *

# Show only specific properties from the same computer
Get-ADComputer -Filter 'name -eq "Mycomputer"' -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogonDate

# List all the computers in the OU with names and LastLogonDate only
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogonDate

# As above, using an expression to convert the unreplicated LastLogon property to [datetime] instead
# Note that further processing is needed if you need to compare this date between multiple DCs
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogon | Select Name, LogonDate,@{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}}

# If your results in a previous command look good, now you can sort and output to CSV
Get-ADComputer -Filter * -Searchbase "OU=MyOUPath,DC=example,DC=net" -properties Name,LastLogonDate | Sort LastLogonDate | select Name,LastLogonDate | export-csv -path c:\Temp\ADComputer.csv -NoTypeInformation

对于最后一个例子,是从 CSV 导出中Select Name,LastLogonDate排除默认属性,如DistinguishedNameobjectClass。此外,如果您不喜欢的格式LastLogonDate,您可能需要在其中包含一个表达式来格式化它(类似于转换LogonDate文件时间)。

LDAP 查询数据大小

以下文件列表显示了如果我只将一台计算机的name属性返回LastLogonDate到“comp1.txt”与将同一台计算机的所有属性返回到“comp2.txt”时数据大小的差异。乘以查询的机器数量 - 很容易看出为什么当查询将不必要的数据从 AD 拖出并跨网络时会花费更长时间。

Mode                LastWriteTime         Length Name
----               -------------         ------ ----
-a----       2022-02-14     18:41            894 comp1.txt
-a----       2022-02-14     18:42          69736 comp2.txt

相关内容