Doorgaan naar hoofdcontent

AD Provisioning: Aanmaken organizational units en groups

De afgelopen weken ben ik druk bezig geweest met het maken van provisioning PowerShell scripts voor het vullen van mijn proeftuin Windows 2008 R2 AD. Ik heb hiervoor gebruik gemaakt van de voor PowerShell v2.0 beschikbare Microsoft AD cmdlets. Als altenatief, voor PowerShell v1.0 en niet Windows 2008 R2 omgevingen, kan je gebruik maken van de gratis Quest AD extensies.

Mijn PowerShell script begint met het goed zetten van de executie rechten voor PowerShell.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

De volgende stap is het registreren van de PowerShell module voor AD.

# Inlezen Windows PowerShell Module voor Active Directory. Deze module is
# beschikbaar op Windows 2008 R2 (alleen op de Standard, Enterprise en
# DataCenter versies) en, middels 'Windows Server 2008 R2 Remote Server
# Administration Tools (RSAT)', op Windows 7.
Import-Module ActiveDirectory

Vervolgens heb ik een function geschreven dat op basis van een CSV bestand de provisioning taken voor het aanmaken van organizational units (= organisatorische eenheden) en groups (= groepen) voor zijn rekening neemt.

#
# .SYNOPSIS
# Aanmaken organizational units en groepen op basis van een CSV-bestand.
#
# .DESCRIPTION
# Aanmaken organizational units en groepen op basis van een CSV-bestand.
# De eerste regel van dit CSV-bestand dient de volgende kolomnamen te
# bevatten:
#
# Kolom Toelichting
# ------------- --------------------------------------------------------
# Naam Naam organizational unit / groep
# OU TRUE FALSE
# GroupCategory Distribution Security
# GroupScope DomainLocal Global Universal
# Omschrijving Informatie over het doel
# Parent Het pad in AD waaronder de OU/Groep aangemaakt dient
# te worden. Voorbeeld: OU=Users,DC=Contoso,DC=Com
# Volledige_naam Combinatie van Naam en Parent.
# Voorbeeld: OU=Test accounts,OU=Users,DC=Contoso,DC=Com
#
# .PARAMETER BestandsNaam
# De naam van het CSV-bestand dat ingelezen dient te worden.
#
# .EXAMPLE
# PS C:\> ProvisionActiveDirectoryCSV -BestandsNaam 'c:\provision\ad.csv'
# Dit voorbeeld toont hoe de ProvisionActiveDirectoryCSV functie
# aangeroepen dient te worden met named parameters.
#
# .EXAMPLE
# PS C:\> ProvisionActiveDirectoryCSV 'c:\provision\ad.csv'
# Dit voorbeeld toont hoe de ProvisionActiveDirectoryCSV functie
# aangeroepen dient te worden met gepositioneerde parameters.
#
# .INPUTS
# System.String
#
# .OUTPUTS
# Null
#
function ProvisionActiveDirectoryCSV
{
Param
(
[System.String] $BestandsNaam
)

# Importeren CSV-bestand
$adEntries = Import-Csv -Path $BestandsNaam -Delimiter ";";

foreach ($adEntry in $adEntries)
{
[Microsoft.ActiveDirectory.Management.ADOrganizationalUnit] $adOU;
[Microsoft.ActiveDirectory.Management.ADGroup] $adGroup;

# Onderscheid tussen organizational units en groepen
if ($adEntry.OU -eq $true)
{
# Controle of de organizational unit reeds bestaat in het AD
$adOU = Get-ADOrganizationalUnit -Filter ("DistinguishedName -eq '" +
$adEntry.Volledige_naam + "'");

# Indien de organizational unit niet is gevonden dan maken we het aan
if ($adOU -eq $null)
{
New-ADOrganizationalUnit -Name $adEntry.Naam -Path $adEntry.Parent -Description $adEntry.Omschrijving;
}
trap [Microsoft.ActiveDirectory.Management.ADException]
{
# Fout is niet blokkerend
Write-Warning ("Bij het aanmaken van organisatorische eenheid '" +
$adEntry.Naam + " (" + $adEntry.Parent + ")" +
"' is er een fout opgetreden. De opgetreden fout is: '" +
$_.Exception.Message + " (" +
$_.Exception.GetType() + ")'. ");
Continue;
}
}
else
{
# Controle of de groep reeds bestaat in het AD
$adGroup = Get-ADGroup -Filter ("DistinguishedName -eq '" +
$adEntry.Volledige_naam + "'");

# Indien de groep niet is gevonden dan maken we het aan
if ($adGroup -eq $null)
{
New-ADGroup -Name $adEntry.Naam -Path $adEntry.Parent -GroupScope $adEntry.GroupScope -GroupCategory $adEntry.GroupCategory -Description $adEntry.Omschrijving;
}
trap [Microsoft.ActiveDirectory.Management.ADException]
{
# Fout is niet blokkerend
Write-Warning ("Bij het aanmaken van groep '" +
$adEntry.Naam + " (" + $adEntry.Parent + ")" +
"' is er een fout opgetreden. De opgetreden fout is: '" +
$_.Exception.Message + " (" +
$_.Exception.GetType() + ")'. ");
Continue;
}
}
}
}

De laatste regel van mijn PowerShell script bestaat uit de feitelijke aanroep van de functie. Ik heb bij het schrijven en het testen van het script gemerkt dat de volgorde van de locatie van functies e.d. nogal uitmaakt.

ProvisionActiveDirectoryCSV 'D:\Projects\PowerShell\Gebruikers\ad_inrichting.csv';

Het eindresultaat van het provisioning script is dat mijn proeftuin AD omgeving gevuld is met de gewenste structuur.

image

Reacties

Populaire posts van deze blog

Active Directory limieten

Zoals ieder systeem heeft Active Directory ook zijn limieten. Tijdens wat Active Directory research kwam ik het volgende Technet artikel tegen waarin deze worden benoemd: Active Directory Maximum Limits . Kort samengevat zijn de limieten: Maximum aantal objecten per domain controller in een forest : ongeveer 2,5 biljoen (gedurende de volledige levensduur). Maximum aantal security identifiers (SID's) per domein : ongeveer 1 biljoen (gedurende de volledige levensduur). Aantal groepen waarvan een security indentifier (persoon, groep, computer account) lid kan zijn : ongeveer 1.015 groepen. FQDN lengte limiet : maximum lengte is 64 tekens (dit is inclusief punten en mintekens) voor de fully qualified domain name (FQDN). Bestandsnaam limiet : Windows kent een pad lengte limiet van 260 tekens. Deze is ook van toepassing op de fysieke bestanden van AD zoals SYSVOL. Organisational unit limiet : maximum lengte is 64 tekens. Heeft te maken met de Windows limiet van 260 tekens die in de gaten

Winsxs folder neemt veel ruimte in

In Windows Millenium is de Winsxs folder geintroduceerd. Deze folder bevat meerdere versies van in gebruik zijnde DLL bestanden. Het doel hiervan is dat iedere programma de juiste versie van de benodigde DLL kan gebruiken. Dit principe staat ook wel bekend als "Windows Side by Side". De folder die hiervoor gebruikt wordt is dus "C:\Windows\winsxs" en deze folder vormt dus de native assembly cache. In een tijd dat het vrij normaal is dat een computer is voorzien van een 500 GB harde schijf is de overhead van meerdere versies van een bestand opslaan niet echt een probleem. Echter in mijn geval wel. Op een van mijn multi boot computers heb ik een Vista Ultimate (met daarop Vista, MS Office en enkele andere programa's) van 32 GB. Mijn (persoonlijke) data staat op een aparte partitie. Door de installatie van de vele Windows updates is de vrije ruimte op deze partitie gezakt tot 2,85 GB (en dus in de rode waarschuwingszone terecht gekomen). Van de 32 GB is meer dan

Bevindingen over de E-tech ADWG02 tot nu toe

Ik heb de E-tech ADWG02 nu bijna een week in gebruik. Dit is de vervangende modem voor de buggy Linksys WAG54G die ik eerder gekocht had. Mijn bevindingen over de E-tech tot nu toe: Geen crashes tot nu toe. De firmware lijkt op dat punt stabiel. Het apparaat is niet door middel van een knop aan of uit te zetten. Erg vervelend omdat ik het apparaat alleen uit kan zetten door de stekker uit het stopcontact te halen. De reden dat ik hem graag uit wil kunnen zetten is dat het apparaat in de woonkamer staat (in het zicht) en de lampjes nogal fel schijnen. Dat vind ik niet erg prettig. Daarnaast wil ik niet dat de verbinding de gehele dag open staat uit beveiligingsoverwegingen en vanwege het stroomverbruik. WIFI is middels een setting uit te zetten. Als je de setting uitvinkt en bevestigd door middel van een 'apply' zie je het lampje uitgaan op de ADSL modem. Er is op dat moment ook geen WIFI verbinding actief. Sla je de setting definitief op dan reboot de modem automat