csv PowerShell Active Directory循环遍历所有用户属性

ryevplcw  于 2022-12-06  发布在  Shell
关注(0)|答案(3)|浏览(158)

我目前正在使用PowerShell更新Active Directory用户属性。脚本将从CSV读取更新的属性。
我希望实现的是遍历用户,并将每个用户属性与CSV中存储的值进行比较。如果CSV属性值与用户的Active Directory属性不匹配,我希望更新Active Directory中的值
目前,我可以选择一个用户,并使用以下命令显示所有属性:

Get-ADUser -Filter "UserPrincipalName -eq '$($upn)'" -Properties * -SearchBase 'DC=core,DC=com'

我正在努力的是循环遍历每个用户的所有属性并将它们与该用户的CSV值进行比较的能力。
下面是我正在处理的代码片段:

# Import CSV into variable $users
$users = Import-Csv -Path 'C:\PowerShell\AD\UserUpdates.csv'

# Loop through each user
foreach ($user in $users) {

#Search in specified OU and Update existing attributes
$userproperties = Get-ADUser -Filter "UserPrincipalName -eq '$($user.UserPrincpalName)'" -Properties * -SearchBase 'DC=core,DC=com' 

}

有人知道循环遍历用户的所有用户配置文件属性的方法吗?
如有任何帮助或指导,将不胜感激?

更新

好的,在这方面做得更进一步,我已经取得了进展,但我不认为这是完成这一点的最干净的方式。

$userproperties = Get-ADUser -Filter "UserPrincipalName -eq '$($upn)'" -Properties * -SearchBase 'DC=core,DC=com' | Select-Object Name,Created, LastLogon,GivenName,SurName,DisplayName,DistinguishedName,UserPrincipleName

这允许我选择如下项目:

$userproperties.DisplayName

但是使用这种方法,我需要列出我希望使用的每一个属性。我更希望能够在所有属性之间循环。也许我可以把我希望使用的所有属性放在一个数组中,然后在数组中循环。

y3bcpkx1

y3bcpkx11#

这是一种循环进入对象(本例中为AD用户)属性的方法:

$user = Get-ADUser -Filter "UserPrincipalName -eq '$($user.UserPrincpalName)'" -Properties * -SearchBase 'DC=core,DC=com'

$user | gm | ? membertype -eq property | select -expa name | % { $user.$_ }

foreach-object%)中,您可以添加更新某些属性所需的逻辑

at0kjp5o

at0kjp5o2#

循环遍历CSV文件中一个条目的所有属性并不困难。诀窍是将通过循环遍历导入的csv数据得到的哈希表转换为PS对象,如下所示:

# Import CSV into variable $users
$users = Import-Csv -Path 'C:\PowerShell\AD\UserUpdates.csv'

# Loop through each user
foreach ($user in $users) {

#Obtain attributes from corresponding ADuser.
$userproperties = Get-ADUser -Filter '
   "UserPrincipalName -eq '$($user.UserPrincpalName)'" `
   -Properties * -SearchBase 'DC=core,DC=com' 


#Search in specified OU and Update existing attributes

   foreach ($prop in $user.psobject.properties) {
      Set-variable -name $prop.name -value $prop.value
# Instead of doing a set-variable, you could set the corresponding attribute
# in the appropriate AD.
      }

}
g2ieeal7

g2ieeal73#

Set-ADUser有一个-Replace参数,该参数接受一个属性和值的哈希表,您可以使用该哈希表一次更新多个属性。您可以只构建哈希表,然后执行单个更新操作。您可以通过从CSV返回您正在检查的AD用户属性来使其更高效。只需从导入的CSV文件创建的集合中的第一个对象获取属性列表,即可获得该属性列表。

# Import CSV into variable $users
$CSVusers = Import-Csv -Path 'C:\PowerShell\AD\UserUpdates.csv'

#Get the list of properties to check
$Properties = $CSVusers[0].psobject.properties.name

# Loop through each user
foreach ($CSVuser in $CSVusers) {

$UpdateProperties = @{}

#Search in specified OU and Update existing attributes
$ADUser = Get-ADUser -Filter "UserPrincipalName -eq '$($CSVuser.UserPrincpalName)'" -Properties $Properties -SearchBase 'DC=core,DC=com' 

#Create a hash table of properties that need updated
  Foreach ($Property in $Properties)
   { 
     if ($CSVUser.$Property -ne $ADUser.$Property)
       { $UpdateProperties[$Property] = $CSVuser.$Property }
   }

 #Update user

 if ( $UpdateProperties.Count -gt 0 )
   { Set-ADUser $ADUser.DistinguishedName -Replace $UpdateProperties }

}

相关问题