【问题标题】:Add filter with Powershell compare_object使用 Powershell compare_object 添加过滤器
【发布时间】:2018-10-22 11:10:59
【问题描述】:

我有两个 .csv 文件,我需要比较它们。 第一个是 Active Directory 的摘录,另一个是注册表配置文件列表的摘录。

当我比较它们时,我只想显示配置文件列表中存在的用户,在 Active Directory 中禁用并添加一个过滤器以仅显示域中的用户(“域\用户名”)。

compare-object -referenceobject $(get-content C:\Temp\UsersAD.csv) -differenceobject $(get-content C:\Temp\ProfileList.csv) | ?{$_.SideIndicator -eq '=>'}

这是我从这个脚本中得到的:

PS C:\Users\Administrator.DOMAIN> C:\Users\Administrator.DOMAIN\Downloads\compare_users.ps1

InputObject                                                    SideIndicator                                                
-----------                                                    -------------                                                
#TYPE Selected.System.Management.Automation.PSCustomObject     =>                                                           
"PSChildName"                                                  =>                                                           
"NT AUTHORITY\SYSTEM"                                          =>                                                           
"NT AUTHORITY\LOCAL SERVICE"                                   =>                                                           
"NT AUTHORITY\NETWORK SERVICE"                                 =>                                                           
"LocalName\Administrator"                                      =>                                                           
"NT SERVICE\MSSQL$MICROSOFT##WID"                              =>                                                           
"IIS APPPOOL\.NET v4.5"                                        =>                                                           
"IIS APPPOOL\.NET v4.5 Classic"                                =>                                                           

理想情况下应该是这样的:

PSChildName
"DOMAIN\Username1"
"DOMAIN\Username2"

我尝试在最后添加一个过滤器,但没有结果,因为它不是有效的命令:

compare-object -referenceobject $(get-content C:\Temp\UsersAD.csv) -differenceobject $(get-content C:\Temp\ProfileList.csv) -Filter "DOMAIN\" | ?{$_.SideIndicator -eq '=>'}

这是注册表配置文件列表最初的样子:

#TYPE Selected.System.Management.Automation.PSCustomObject
PSChildName
NT AUTHORITY\SYSTEM
NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
LoacalName\Administrator
DOMAIN\Username
DOMAIN\Administrator
NT SERVICE\MSSQL$MICROSOFT##WID
IIS APPPOOL\.NET v4.5
IIS APPPOOL\.NET v4.5 Classic

所以实际上我需要与使用 Compare-Object 命令得到的相反(即“DOMAIN\Username”和“DOMAIN\Administrator”)。

已启用 Active Directory 用户的代码:

Get-ADUser -Filter 'enabled -eq $true' | 
Select-Object SamAccountName,@{Name='FullUserName';Expression={"DOMAIN\$($_.SamAccountName)"}} |
Export-CSV C:\Temp\UsersEnabled.csv -Encoding UTF8

结果:

#TYPE Selected.Microsoft.ActiveDirectory.Management.ADUser
FullUserName
DOMAIN\Administrator
DOMAIN\User1
DOMAIN\User2

【问题讨论】:

  • 请更新您的问题,以使用示例输入和预期输出(最好是MCVE (Minimal, Complete, and Verifiable Example)
  • ",在 Active Directory 中禁用..." 我在您的数据或代码中看不到任何指示用户/配置文件是启用还是禁用的内容。你能澄清一下吗?您能否还包括来自 Active Directory 的 CSV 文件的模型(摘录)?
  • @PetruZaharia 我有两个 .csv 文件。一个显示活动目录中启用的用户,另一个显示本地配置文件列表。因此,如果我比较它们,它将显示用户是否具有本地配置文件但在活动目录中被禁用(我在帖子中添加了启用用户的代码)。

标签: powershell csv active-directory


【解决方案1】:

Compare-Object cmdlet 有一个-Property 参数,您可以在其中指定特定属性以在两个对象集合之间进行比较。

您还应该使用Import-CSV 来读取CSV,而不是Get-Content。这会将 CSV 转换回 PowerShell 对象。

目前,您的两个集合可能具有完全不同的属性集,您正在尝试对它们进行整体比较。您需要确保获取数据输出的方式确保两个 CSV 具有同名的单个属性,其中该字段中的数据采用相同的格式。

例如(不一定正确,取决于您的数据,这假设两个 CSV 将具有用户名格式相同的“名称”属性):

Compare-Object -ReferenceObject (Import-CSV C:\Temp\UsersAD.csv) `
               -DifferenceObject (Import-CSV C:\Temp\ProfileList.csv) `
               -Property name | Where-Object {$_.SideIndicator -eq '=>'}

【讨论】:

  • 我修改了一个属性,所以现在两者都有一个“FullUserName”属性,其中的字段格式相同,但是您的代码没有显示我要查找的内容。它给了我与我的代码完全相同的东西。我需要对此代码应用一个过滤器,它只会给我以“DOMAIN\”开头的结果
猜你喜欢
  • 2013-04-04
  • 2017-03-14
  • 2018-11-14
  • 2015-11-07
  • 1970-01-01
  • 2022-01-14
  • 2011-02-04
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多