Hi All,
I am trying to rewrite an existing program to use a function since I need to run the same steps more than once. I am running into issues passing values in and out of the function. My input file has three columns IDNum,UPN,Role. I am updating the script variables and creating a list of UPNs for each Role. I keep getting
Compare-Object : Cannot bind argument to parameter 'DifferenceObject' because it is null.
At C:\Util\Update-Roles.ps1:79 char:86
+ ... t -ReferenceObject $currentGroupUsers -DifferenceObject $updatedUsers
+ ~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Compare-Object], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CompareObjectCommand
I have tried casting the parameters in the prototype using string, array
function name([type]varname1,[type]varname2){
}
as well as
function name() {
Param(
[type]$varname1,
[type]$varname2
)
}
Nothing has worked to get values into the function.
$groupAdmin = "Admin-Group"
$groupAdvisor = "Advisor-Group"
$updatedUserFile = "D:\<path>\update.csv"
$csvAdmin = ""
$csvAdvisor = ""
$adminRemoved = 0
$adminAdded = 0
$advisorRemoved = 0
$advisorAdded = 0
function updateGroup($csvUsers, $groupName) {
$usersAdded = 0
$usersRemoved = 0
$updatedUsers = ForEach ($user in $csvUsers) {
# Get AD user object based on UPN and add object to group
Get-ADUser -Filter {userPrincipalName -eq $user } -Properties DistinguishedName
}
# Build list of current group members
$currentGroupUsers = (Get-ADGroup $groupName -Properties member).member
# Create file with differences between current users and users from user file
$modGroup = Compare-Object -ReferenceObject $currentGroupUsers -DifferenceObject $updatedUsers
# Add/Remove based on difference between current and updated users list
$modGroup | foreach {
# Remove uses from group
if ($_.sideindicator -eq '<='){
$DN = $_.InputObject
$usersRemoved++
Remove-ADGroupMember -Identity $groupName -Members "$DN" -Confirm:$false
}
# Add users to group
if ($_.sideindicator -eq '=>'){
$DN = $_.InputObject
$usersAdded++
Add-ADGroupMember -Identity $groupName -Members "$DN"
}
}
return $usersRemoved, $usersAdded
}
# Build sorted membership lists from input file
Import-Csv $updatedUserFile | ForEach-Object {
$user = $_."UPN"
$user = $user.trim()
$user = $user.Trim('"')
switch ($_.Role) {
admin {
$script:csvAdmin += $user
}
advisor {
$script:csvAdvisor += $user
}
}
}
$returnedAdminCnt = updateGroup $csvAdmin $groupAdmin;
$adminRemoved = $returnedAdminCnt[0];
$adminAdded = $returnedAdminCnt[1];
$returnedAdvisorCnt = updateGroup $csvAdvisor $groupAdvisor;
$advisorRemoved = $returnedAdvisorCnt[0];
$advisorAdded = $returnedAdvisorCnt[1];
Thanks in advance