I’m attempting to add Active Directory Users to Groups.
I have a file with a list of classes and Login Names. (attached)
Each line in the file contains a class name (class_name) and a Login Name amongst other fields.
This seemed to work to add membership:
Import-CSV c:\scripts\ClassinfoStuName.csv | Where-Object {$_.school_bldg_code -ne "TADU" -and $_.subject_id -ne "ACA"} |
Foreach-object {
$classNameFiltered = $_.class_name.Replace("/","-").Replace(":","-")
$loginName = $_.loginName
Add-ADGroupMember -Identity $classNameFiltered -Members $loginName
}
Now, when a student is dropped from a class, how do I remove the student from the group assignment?
My logic is failing me.
Should I create some sort of table object that builds a more straight forward link? Such as:
CLASSName: loginNames
English 9 Honors-3 “Hubbard.Mother”,“Obama.Michelle”,“Cheney.Dick”
Then somehow state:
If $_.loginName does not exist in LoginNames then Remove-ADGroupMember -Identity $ClassnameFiltered $_.loginName
There are many ways to handle things. For instance, if only people in the spreadsheet are supposed to be in the group, you could just remove everyone and then run the code above. You can also do something like this, I did NOT test this, but basic logic should work. Let us know.
#Grab only what we need from the CSV
$csv = Import-CSV C:\Users\rsimmers.INT\desktop\ClassinfoStuName.csv |
Where-Object {$_.school_bldg_code -ne "TADU" -and $_.subject_id -ne "ACA"} |
Select LoginName, @{Name='ClassName';Expression={$_.class_name.Replace("/","-").Replace(":","-")}}
#loginName ClassName
#--------- ---------
#Year.Good TOPICS IN BIO I - 9
#Balboa.Rocky TOPICS IN BIO I - 9
#Pitt.Brad TOPICS IN BIO I - 9
#StJames.Rebecca MODIFIED ENGLISH - 1
#Obama.Barak MODIFIED ENGLISH - 1
#Ark.Noah PHYSICAL EDUCATION - 2
#ecret.Victoria PHYSICAL EDUCATION - 2
#Jean.Billie PHYSICAL EDUCATION - 2
#mith.Jim PHYSICAL EDUCATION - 2
#linton.Chelsy PHYSICAL EDUCATION - 2
#Musk.Elon PHYSICAL EDUCATION - .....
#Group the CSV items by the group name and then loop through each grouped item (e.g. ClassName)
#Count Name Group
#----- ---- -----
# 3 TOPICS IN BIO I - 9 {@{loginName=Year.Good; ClassName=TOPICS IN BIO I - 9}, @{loginName=Balboa.Rocky; ClassNa...
# 2 MODIFIED ENGLISH - 1 {@{loginName=StJames.Rebecca; ClassName=MODIFIED ENGLISH - 1}, @{loginName=Obama.Barak; C...
# 5 PHYSICAL EDUCATION - 2 {@{loginName=Ark.Noah; ClassName=PHYSICAL EDUCATION - 2}, @{loginName=Secret.Victoria; Cl...
# 8 PHYSICAL EDUCATION - 9 {@{loginName=Musk.Elon; ClassName=PHYSICAL EDUCATION - 9}, @{loginName=White.Jessica; Cla...
# 2 DRAMA - 2 {@{loginName=Rice.Condoleza; ClassName=DRAMA - 2}, @{loginName=Cheney.Dick; ClassName=DRA...
# 1 FRENCH 2 - 4 {@{loginName=Bush.Barbara; ClassName=FRENCH 2 - 4}}
# 2 CP ALGEBRA II - 7 {@{loginName=Joe.Billie; ClassName=CP ALGEBRA II - 7}, @{loginName=State.Kent; ClassName=...
# 6 CP ALG 1-PT.2 - 1 {@{loginName=Jean.Billie; ClassName=CP ALG 1-PT.2 - 1}, @{loginName=Reagan.Nancy; ClassNa...
# 4 CP GEOMETRY - 6 {@{loginName=Green.Rodney; ClassName=CP GEOMETRY - 6}, @{loginName=Rice.Condoleza; ClassN...
# 4 ENGLISH 9 HONORS - 3 {@{loginName=Joe.Billie; ClassName=ENGLISH 9 HONORS - 3}, @{loginName=Cheney.Dick; ClassN...
$csv | Group-Object -Property ClassName | ForEach-Object{
#Create\Emtpy an array for the members in the CSV...
$NewMembers = @()
#Foreach group item...
$_.Group | ForEach-Object{
#Add the name to an array...
$NewMembers += $_.LoginName
#Get the ClassName we are working on...
$groupName = $_.ClassName
#Add to group (you will either have to put logic here to see if they are already a member or set the error level to SilentlyContinue)
Add-ADGroupMember -Identity $groupName -Members $_.LoginName -WhatIf
}
#Now you have all the students in the CSV in your NewMember array,
#next you need to compare it against the current group...
#Grab the members of the group currently...
$ClassGroupMembers = Get-ADGroupMember -Identity $groupName | Select -ExpandProperty SamAccountName
foreach ($Member in $ClassGroupMembers) {
#If the current member of the group is not in the array created from the CSV, use Remove-AdGroupMember
if ($NewMembers -notcontains $Member) {
Remove-AdGroupMember -Identity $groupName -Members $Member -WhatIf
}
}
}
Compare-Object
Edited the code as Rob Simmers import CSV example was better, this is just a different way to do the foreach loop at the bottom of his code.
$ad = Get-ADGroupMember $classNameFiltered
$result = Compare-Object $csv.loginName $ad.samaccountname
$remove = $result | ?{$_.SideIndicator -eq "=>"}
$add = $result | ?{$_.SideIndicator -eq "<="}
foreach($loginName in $remove.inputobject){Remove-ADGroupMember -Identity $classNameFiltered -Members $loginName -whatif}
foreach($loginName in $add.inputobject){Add-ADGroupMember -Identity $classNameFiltered -Members $loginName -whatif}
Editor code formatting is changing the SideIndicator operators, thus double check those and change as needed.