我目前正在使用某些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
但是通过这种方法,我需要列出我希望使用的每个属性。我宁愿能够遍历所有属性。也许我可以把我想要的所有属性放到一个数组中并循环遍历它?
答案 0 :(得分:0)
这是一种循环到对象属性的方法(在这种情况下是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
(%
)中,您可以添加更新某些内容所需的逻辑
答案 1 :(得分:0)
循环访问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.
}
}
答案 2 :(得分:0)
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 }
}