Nov 05 2023 11:58 AM
Hi All,
This should be straigtforward (I think), but i cannot get it to work.
I have a working script which reads a csv file from an HR app and then creates the user accounts.
Dependant on the users site name it will read the array and assign them to the correct OU.
As the names of the sites has proven to be inconsistant or at least 3 variants in some cases, I created an array (could it be classed as a dictionary file?). to handle the differences, e.g.
$Site2OU = @{
"Miami" = "OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Miami Beach" = "OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Miami Beach Holiday Homes" = "OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Boston" = "OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Boston Bay" = "OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Bston Bay Holiday Homes" = "OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Mississippi" = "OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
"Mississippi Water" = "OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
"Mississippi Water Holiday Homes" = "OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
}
then an extract from the script would handle it like this
(Imported csv Foreach($NewUser in $Newusers)
$Location = $NewUser.Site
$OU = $Site2OU.$Location
This would then create the $OU variable for a site based on any of the 3 variations.
Everytime a new site is added it means editing the script etc. And this script is compiled into a GUI exe file.
To save the hassle I would like to replace the array with the contents of a file, which would allow the users to add new sites, as and when they are required.
Is there an easy way to do this, I have tried numerous ways and none work.
Any pointers would be appreciated.
Nov 05 2023 05:12 PM
Solution
Hi, MoZZa.
Logically-speaking, you can refer to $Site2OU as a dictionary, but strictly-speaking, PowerShell uses the HashTable class for the @{} statement.
Given you're working with only two columns in the input file, you can easily achieve what you're seeking.
"name","ou"
"Miami","OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Miami Beach","OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Miami Beach Holiday Homes","OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Boston","OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Boston Bay","OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Bston Bay Holiday Homes","OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Mississippi","OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
"Mississippi Water","OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
"Mississippi Water Holiday Homes","OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
$h = [ordered] @{};
Import-Csv -Path D:\Data\Temp\Forum\forum.csv | ForEach-Object { $h.Add($_.name, $_.ou); }
Cheers,
Lain
Nov 06 2023 02:18 AM
Nov 05 2023 05:12 PM
Solution
Hi, MoZZa.
Logically-speaking, you can refer to $Site2OU as a dictionary, but strictly-speaking, PowerShell uses the HashTable class for the @{} statement.
Given you're working with only two columns in the input file, you can easily achieve what you're seeking.
"name","ou"
"Miami","OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Miami Beach","OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Miami Beach Holiday Homes","OU=New Users,OU=Users,OU=Miami Beach,OU=Contoso,DC=com"
"Boston","OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Boston Bay","OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Bston Bay Holiday Homes","OU=New Users,OU=Users,OU=Boston Bay,OU=Contoso,DC=com"
"Mississippi","OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
"Mississippi Water","OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
"Mississippi Water Holiday Homes","OU=New Users,OU=Users,OU=Mississippi Water,OU=Contoso,DC=com"
$h = [ordered] @{};
Import-Csv -Path D:\Data\Temp\Forum\forum.csv | ForEach-Object { $h.Add($_.name, $_.ou); }
Cheers,
Lain